- AspectJ:Java 社区里最完整最流行的 AOP 框架.
- 在 Spring2.0 以上版本中, 可以使用基于 AspectJ 注解或基于 XML 配置的 AOP
### 使用步骤:
1.aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar
2.spring配置文件中添加:xmlns:aop="http://www.springframework.org/schema/aop"
3.要在 Spring IOC 容器中启用 AspectJ 注解支持, 只要在 Bean 配置文件中定义一个空的 XML 元素 aop:aspectj-autoproxy 。使AspectJ相关注解生效:当调用目标方法,跟Aspect中声明的方法相匹配的时候,AOP框架会自动的为目标方法所在的类创建代理对象
>#### 1.基于注解的方式实现springAOP:
1.创建切面类(LoggingAspect)。
@Aspect:声明当前类为切面类。
@Component:交给springIOC容器进行管理。
@Before:前置通知。
需要使用切点表达式:@Before("execution(* cn.li.service.impl.*.*(..))"),/**
* 可以使用AspectJ表达式,对目标方法进行抽象概括。
*
* execution(* cn.li.service.impl.*.*(String,..))
*
* 第一个* 表示匹配所有访问修饰符 以及所有返回值类型的方法 第二个* 表示当前包下所有的类 第三个* 表示所有的方法名称 ..
* 表示匹配任意多个参数。 (String,.. )表示匹配第一个参数为String类型的方法,..表示匹配任意数量任意类型的参数。
* String,String 表示匹配参数为两个字符串的方法。
*/其中(Joinpoint)对象中封装了目标方法的一些信息,例如获取目标方法名称,获取目标方法参数等。
`@Order(number)`:@Order 表示 配置多个切面之间的优先级问题 。 谁的值越小谁的优先级越高 。
`@After`:后置通知。使用方法与前置通知相同。注意:后置通知即使方法异常也会成功执行,但是后置通知无法拿到目标方法的返回结果。需要返回通知。
`@AfterReturnning`:返回通知,在方法正常之后之后执行的通知,可以拿到目标方法的返回结果。使用返回通知需要注意的是:指定returnning="result",afterReturnningAdvice(JoinPoint joinpoint,Object result)与方法入参位置的对象名称一致,否则会产生异常。
`@AfterThrowing`:异常通知,方法产生异常的时候,可以拿到异常信息。同样需要注意的是:指定throwing="e",与afterThrowingAdvice(JoinPoint joinpoint,Exception e)方法入参位置的异常对象名称一致。
`@Around:`环绕通知
~~~
具体代码实现如下:》》》》》
//当前类就是一个切面类
//想要一个类成为切面类,1.添加@Component 注释标注 当前类被springIOC容器所管理
//2.@Aspect表示当前类为一个切面类
//@Order 表示 配置多个切面之间的优先级问题 。 谁的值越小谁的优先级越高 。
//@Order(2)
//@Aspect
//@Component
public class LoggingAspect {
// @Before表示前置通知。指的是在特定位置之前,去执行该方法
// 通知 其实是切面类中一个具体的方法
// JoinPoint 表示连接点
/**
* 可以使用AspectJ表达式,对目标方法进行抽象概括。
*
* execution(* cn.li.service.impl.*.*(String,..))
*
* 第一个* 表示匹配所有访问修饰符 以及所有返回值类型的方法 第二个* 表示当前包下所有的类 第三个* 表示所有的方法名称 ..
* 表示匹配任意多个参数。 (String,.. )表示匹配第一个参数为String类型的方法,..表示匹配任意数量任意类型的参数。
* String,String 表示匹配参数为两个字符串的方法。
*/
//@Pointcut("execution(* cn.li.service.impl.*.*(..))")
public void declareRepeatJoinPointExpression(){
}
//@Before("execution(* cn.li.service.impl.*.*(..))")
public void beforeLog(JoinPoint joinpoint) {
// 通过连接点对象可以获得调用目标方法的名称和参数
// 获得方法名称。能拿到你要调用方法的名称
String method = joinpoint.getSignature().getName();
// 获得调用方法时传递的参数
List arguments = Arrays.asList(joinpoint.getArgs());
System.out.println("前置日志调用了方法" + method + "方法,参数是" + arguments);
}
// 注意:后置通知即使方法异常也会成功执行,但是后置通知无法拿到目标方法的返回结果。 需要使用返回通知。。。
//@After("execution(* cn.li.service.impl.*.*(..))")
public void afterLog(JoinPoint joinpoint) {
String method = joinpoint.getSignature().getName();
List arguments = Arrays.asList(joinpoint.getArgs());
System.out.println("后置日志 。");
}
// 返回通知
// 注意:返回通知 ,其实跟后置通知一样 。都是在目标方法执行完之后 才会被执行 。
// returning="result" 名字 要跟参数列表中 Object 对象的名称一致 ,不然产生异常。
//@AfterReturning(value = "execution(* cn.li.service.impl.*.*(..))", returning = "result")
public void testAfterReturning(JoinPoint joinpoint, Object result) {
String method = joinpoint.getSignature().getName();
System.out.println("我是返回通知 。 我在目标方法核心业务执行完才会执行 。" + result);
}
//@AfterThrowing(value="execution(* cn.li.service.impl.*.count(..))",throwing="e")
public void testAfterThrowing(JoinPoint joinpoint,Exception e){
System.out.println("我是异常通知 ,我是在方法产生异常后执行的。"+e);
}
//环绕通知 。 跟动态代理的代码很像。
//@Around("declareRepeatJoinPointExpression()")
// public void around(ProceedingJoinPoint pjp){
// //声明一个Object 对象 用来表示 目标方法的返回值 。
// Object result=null;
// String method=pjp.getSignature().getName();
// try {
// System.out.println("我是前置日志 。。。"+method);
// result = pjp.proceed();//调用proceed() 表示执行被代理类的目标方法。
// System.out.println("我是返回通知"+method+result);
// } catch (Throwable e) {
// //Throwable 所有异常类跟错误类的父类 。Exception Error ...
// // TODO Auto-generated catch block
// e.printStackTrace();
// System.out.println("异常通知,产生异常的时候 会执行catch 里面的代码 。");
// }
// System.out.println("我是后置通知 。。。"+result+method);
// }
}
~~~
~~~
//@Order(1)
//@Aspect
//@Component
public class CheckAspect {
//@Before("execution(* cn.li.service.impl.*.*(..))")
public void checkBeforeLog(JoinPoint joinpoint){
System.out.println("我是验证切面的前置通知 。");
}
}
~~~
>#### 2.基于XML文件的方式实现springAOP:
~~~
<!--
@Aspect 注解生效 。
让注解生效,切面中的注解生效。
当调用目标方法,跟Aspect中声明的方法相匹配的时候,
AOP框架会自动的为目标方法所在的类创建代理对象。
作用是让注解生效 ,当调用的方法,跟通知中声明的方法一致的时候。AOP框架会自动的为那个方法所在的类生成代理对象,然后在调用目标方法(之前或者之后)把通知中的方法加进去。
-->
<!-- <aop:aspectj-autoproxy></aop:aspectj-autoproxy> -->
<!-- 配置切面 的bean -->
<bean id="checkAspect" class="cn.li.aspect.CheckAspect"></bean>
<bean id="loggingAspect" class="cn.li.aspect.LoggingAspect"></bean>
<!-- 配置aop -->
<aop:config>
<!-- 配置切点表达式 -->
<aop:pointcut expression="execution(* cn.li.service.impl.*.*(..))" id="pointcut"/>
<aop:aspect ref="checkAspect" order="1">
<aop:before method="checkBeforeLog" pointcut-ref="pointcut"/>
</aop:aspect>
<aop:aspect ref="loggingAspect" order="2">
<aop:before method="beforeLog" pointcut-ref="pointcut"/>
<aop:after method="afterLog" pointcut-ref="pointcut"/>
<aop:after-returning method="testAfterReturning" returning="result" pointcut-ref="pointcut"/>
<aop:after-throwing method="testAfterThrowing" throwing="e" pointcut-ref="pointcut"/>
<!-- <aop:around method="around" pointcut-ref="pointcut"/> -->
</aop:aspect>
</aop:config>
~~~
- spring
- 1.spring第一天
- 1.1 安装spring插件(spring tool suite)
- 1.2 spring概述
- 1.3 控制反转&依赖注入
- 1.4 springIOC容器
- 1.5 依赖注入的四种方式
- 1.6 配置bean的细节
- 1.7 bean之间的关系
- 1.8 bean作用域
- 1.9 补充:创建对象的几种方法
- 1源代码位置
- 2.spring第二天
- 2.1 使用外部属性文件
- 2.2 spEL
- 2.3 bean的生命周期
- 2.4 通过工厂方式配置bean
- 2.5 基于注解的方式配置bean
- 2.6 组件装配
- 2.7 静态代理
- 2.8 动态代理
- 2.9 Cglib代理
- 2源代码位置
- 3. spring第三天
- 3.1 springAOP
- 3.1.1 AOP简介
- 3.1.2 为什么使用AOP
- 3.1.3 AOP关键术语
- 3.1.4 AOP图解
- 3.1.5 springAOP实现步骤
- 3.1.6 SpringAOP实现原理:
- 3.1.7 AOP的好处
- 3.1.8 AOP在实际项目中的主要应用
- 3代码地址
- 3.1.9 纯注解版配置aop的方式
- 3.2 maven环境搭建
- 附IDEA激活码
- 4. spring第四天
- 4.1 c3p0事务
- 4.2 命令窗口事务
- 4.3 c3p0连接池设置
- 4.4 事务中的一些基本概念
- 4.5 事务的传播行为
- 4.6 自定义异常
- 4.7 spring整合Junit单元测试
- 4.8 JdbcTemplate(附源代码)
- 事务源代码
- 4.9 纯注解tx
- 4.10 基于xml配置事务
- 0. jsp页面修改编码方式
- 0.1 eclipse配置tomcat
- 0.单例模式-饱汉模式
- 0.单例模式-饥汉模式
- springMVC
- 1. springmvc第一天
- 1.1 springMVC概述
- 1.2 springmvc框架搭建及第一个应用程序
- 1.3 @RequestMapping
- 1.4 RequestMapping修饰类
- 1.5 RequestMapping精准化映射
- 1.6 Ant风格URL
- 1.7 带有占位符的url映射
- 1.8 REST风格
- 1.9 RequerstParam获取请求正文
- 2. springmvc第二天
- 2.1 优化
- 2.2 POJO绑定请求参数
- 2.3 RequestHeader获取请求报头信息
- 2.4 CookieValue获取Cookie信息
- 2.5 获取原生ServletAPI
- 2.6 ModelAndView处理模型数据
- 2.7 Map、Model、ModelMap处理模型数据
- 2.8 @SessionAttributes注解
- 2.9 @ModelAttribute无返回值方法及方法入参
- 2.10 @ModelAttribute修饰有返回值类型的方法
- 代码地址
- 3. springmvc补充
- 3-1 springmvc工作原理
- 3-2 springmvc form表单提交中文乱码
- 3-3 数据的格式化
- 3-4 自定义类型转换器
- 3-5 其他知识点
- 3-6 crud代码
- 3-7 @DateTimeFormat日期格式化
- 3-8 数据验证的概念及JSR303验证
- 3-9 Hibernate-Validator验证框架
- 3-10 Controller捕获错误消息
- 3-11 errors标签在页面中获取错误消息
- 3-12 错误消息的定制及国际化
- 3-13 自定义拦截器
- 3-14 Java代码中获取国际化信息
- 3-15 超级链接设置国际化
- 3-16 AJAX支持之@RequestBody
- mybatis
- 1. mybatis第一天
- 1. 为什么使用mybatis
- 2. 下载地址
- 3. hello
- 4. mybatis三种开发模式
- 5. 全局配属属性内容
- 6. DTD设置
- 7. Mapper中的CRUD
- 8. 8.mybatis使用主键自增
- 9. #{}中的参数处理
- 10. #{}与${}区别
- 11. 集合数据的查询
- 12 动态sql
- 12.1 if
- 12.2 choose, when, otherwise
- 12.3 trim, where, set
- 12.4 foreach
- 代码位置
- 2. mybatis第二天
- 1.封装map类型的数据
- 2. resultMap自定义封装规则
- 0代码位置
- 3. mybatis缓存机制
- ssm整合
- 1.maven
- 2.ssm基础环境搭建
- 2-1 引入项目依赖的jar包
- 2-2 引入bootstrap,jquery
- 2-3 创建项目包结构
- 2-4 编写web.xml配置文件
- 2-5 编写sping,springmvc,mybatis配置文件
- 2-6 逆向工程mbg.xml
- shiro安全框架
- 1.shiro简介
- 易购Buy商城
- 第一天
- 1.课程计划
- 2.电商行业背景
- 3.易购Buy介绍
- 4.易购Buy架构
- 5.工程搭建
- 6.工程启动和测试
- 7.ssm框架整合
- 8.整合测试
- 9.svn
- 9.1 svn服务端
- 9.2 svn客户端
- 第二天
- 1.SOA架构分析
- 2.dubbo使用方法
- 3.注册中心
- 4.工程改造
- 5.easyUI
- maven
- 1.maven介绍
- 2.idea配置maven和服务器
- 3.创建web工程
- 4.分模块构建工程
- 5. 代码位置
- 6. nexus
- Luence搜索
- 1.了解搜索技术
- 2.Lucene的基本使用
- solr
- SolrCloud