spring中的aop
-
aop思想:横向重复,纵向抽取
spring能够为容器中管理的对象生成动态代理对象
以前我们要使用动态代理,我们需要自己调用下面这个方法。
Proxy.newProxyInstance(xx,xx,xx)生成代理对象
spring aop能够帮我们生成代理对象

-
spring实现aop的原理
- 动态代理(其局限性,被代理对象必须要实现接口,才能产生代理对象,如果没有接口将不能使用动态代理技术)
Proxy.newProxyInstance(classLoader.Interface[] arr,InvocationMandeler handler) - cglib代理(其优点,作为第三方代理技术,cglib可以对任何类生成代理,代理的原理是对目标对象进行继承代理。但如果目标是被final修饰符修饰,那么该类无法被cglib代理)
总结,有接口存在时,优先使用动态动态,无接口时用cglib代理。 - spring aop中的名词解释
- Joinpoint(连接点):所谓连接点是指那些被拦截到的点,在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
- Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义
- Advice(通知/增强):所谓通知是指拦截到Joinpoint之后要做的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
- Introduction(引介):引介是一种特殊的通知在不修改代码的前提下,Introduction可以以运行期为类,动态地添加一些方法或Field
- Target(目标对象):代理的目标对象
- Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程,spring采用动态代理来织入,而AspectJ采用编译期织入和类装载期织入
- Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类Aspect(切面),是切入点和通知(引介)的结合。

-
spring aop
1.导包(4(spring四个核心包beans,context,core,expression)+2(日志包hamcreate-core-1.3,junit-4.1)+2[spring aop,spring aspects]+2[aop联盟包com.springsource.org.aopalliance+织入包com.springsource.org.aspectj.weaver])
2.准备目标对象
{使用spring aop本质就是帮我们生成代理对象}
3.准备通知

4.配置文件
<!--配置切入点 配置需要增强的方法 例如在方法前开启事务,和完成方法提交事务-->
<!--注意expression=""是一个切点表达式 id可以随意命名切入点-->
<!--execution(public void com.example.service.UserServiceImpl.add())这里的切点表达式是选择的add方法,
其默认值为public,public可以不写。
注意:expression="execution (*com.it.serviceImpl.*.*(..))"/>中的*和com之间要加空格
* com.example.service.UserServiceImpl.add() 对返回值不做任何要求
* com.example.service.UserServiceImpl.*() 对UserServiceImpl下的所有方法进行增强处理 其方法返回值任意但必须为空参
* com.example.service.UserServiceImpl.*(..) 对UserServiceImpl下方法的返回值和参数不做任何要求
* com.example.service.ServiceImpl.*(..) 对service包下所有ServiceImpl结尾中的方法不做任何要求
* com.example.service..ServiceImpl.*(..) 对service包和子孙包下所有ServiceImpl结尾中的方法不做任何要求 项目中最常用

5.测试

6.注解形式




浙公网安备 33010602011771号