一、 springAOP
1、作用: 使得事务、日志、安全性框架、权限、目标方法之间完全是松耦合的
2、组成
1、切面: 事务、日志、安全性框架、权限等都是切面
2、通知: 切面中的方法就是通知
3、目标类
4、切入点 只有符合切入点,才能让通知和目标方法结合在一起
5、织入: 形成代理对象的方法的过程
注:代理对象的方法就是通知和目标方法的结合体
3、相对于动态代理,省略了写拦截器的过程
4、切入点表达式详解
5、springAOP的具体加载步骤:
1、当spring容器启动的时候,加载了spring的配置文件
2、为配置文件中所有的bean创建对象
3、spring容器会解析aop:config的配置
解析切入点表达式,用切入点表达式和纳入spring容器中的bean做匹配
如果匹配成功,则会为该bean创建代理对象,代理对象的方法=目标方法+通知
如果匹配不成功,不会创建代理对象
4、在客户端利用context.getBean获取对象时,如果该对象有代理对象则返回代理对象,
如果无代理对象,则返回目标对象
5、如果目标类没有实现接口,则spring容器会采用cglib的方式产生代理对象,
如果实现了接口,会采用jdk的方式
6、各种通知详解
1、前置通知
1、在目标方法执行之前执行
2、无论目标方法是否抛出异常,都执行,因为在执行前置通知的时候,目标方法还没有执行,还没有遇到异常
例:
------------------------------------------------------------------------------
<aop:before method="beginTransaction" pointcut-ref="perform"/>
// 前置通知
public void beginTransaction(){
System.out.println("before inform");
this.transaction = sessionFactory.getCurrentSession().beginTransaction();
}
------------------------------------------------------------------------------
2、后置通知
1、在目标方法执行之后执行
2、当目标方法遇到异常,后置通知将不再执行
3、后置通知可以接受目标方法的返回值,但是必须注意:
后置通知的参数的类型为Object,且名称和配置文件中returning="var"的值是一致的
例:
------------------------------------------------------------------------------
不带参数的
<aop:after-returning method="commit" pointcut-ref="perform" />
// 后置通知
public void commit(){
System.out.println("after return inform");
this.transaction.commit();
}
// 不带返回值的目标方法
public void savePerson(Person person) {
sessionFactory.getCurrentSession().save(person);
}
带参数的
<aop:after-returning method="commit" pointcut-ref="perform" returning="var"/>
public void commit(Object var){
System.out.println("after return inform");
System.out.println(var);
this.transaction.commit();
}
// 带返回值的目标方法
public String savePerson(Person person) {
//int i = 1/0;
System.out.println("目标方法");
return "返回值";
}
------------------------------------------------------------------------------
3、最终通知:
1、在目标方法执行之后执行
2、无论目标方法是否抛出异常,都执行,因为相当于finally
例:
------------------------------------------------------------------------------
<aop:after method="fianllyMethod" pointcut-ref="perform"/>
public void fianllyMethod(){
System.out.println("finally inform");
}
------------------------------------------------------------------------------
4、异常通知 <