基本的概念
切面:Aspect
在程序中就是一个类,该类中定义的方法就是要增强的功能。
连接点:JoinPoint
切面中的每一个增强方法都是一个连接点
切入点:PointCut
对哪个目标对象的哪些方法进行增强
目标对象:target
要被增强的对象【原对象】
代理对象:proxy
增强后的对象【代理对象与目标对象数据类型相同】
织入:wave
将切面对目标对象进行增强
Spring如何写一个切面类?
Advice:通知
Advisor:顾问
Spring的AOP编程步骤
1. 通知实现aop编程
2. 添加jar包,aop、aopalliance-1.0
3. 写目标类和目标方法(比如:UserServiceImpl的remove和list方法)
4. 写切面中的通知类
5. 通知分类:
前置通知:MethodBeforeAdvice
后置通知:AfterReturningAdvice
环绕通知:MethodInterceptor
异常通知:ThrowsAdvice
本次需求:对UserServiceImpl的目标对象进行增强,在方法执行前进行权限校验
6. 配置spring的配置文件
7. 其他通知类型的案例:
创建切面类,实现对应的通知类型的接口
重写方法,定义要增强的功能
在spring的配置文件中创建切面类的对象
在spring中织入切面
总结
通知的方式只能确定要增强的时间点【前置、后置…】
通知的方式会将目标对象的所有的方法全部进行增强
通知的方式如果要为多个目标对象进行增强,需要配置多次代理工厂
顾问实现aop编程
顾问主要解决的问题:可以通过配置实现让哪些目标对象的哪些方法进行哪些增强。
从方法名入手
spring提供了两种方式:
org.springframework.aop.support.NameMatchMethodPointcutAdvisor
org.springframework.aop.support.RegexpMethodPointcutAdvisor
顾问的开发
NameMatchMethodPointcutAdvisor
在通知的基础上新建一个顾问对象
如果希望多目标对象的多个方法进行增强
还可以用*来匹配方法名
RegexpMethodPointcutAdvisor
总结:
解决个单个目标对象的多个目标方法增强同一方法的问题
还需解决多个目标对象要增强需要配置多个代理工厂对象
还需解决一个顾问不能为一个目标方法进行多种增强
spring中的自动代理
前面使用的代理工厂对象ProxyFactoryBean来创建代理对象,该对象一次只能创建一个需要的目标对象的代理对象,spring中还有可以自动生成代理对象的api
spring中代理对象的方式1:ProxyFactoryBean
一次只能创建一个代理对象
spring中代理对象的方式2:BeanNameAutoProxyCreator
org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator
用BeanNameAutoProxyCreator替换ProxyFactoryBean,实现了一个配置可以生成多个目标对象的代理对象,并且为代理对象取的bean的id值为目标对象的bean的id的值。
如果有很多个目标对象,配置beanNames用逗号隔开
或者
spring中代理对象的方式3:DefaultAdvisorAutoProxyCreator
全自动代理
org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator
spring而言,aop(面向切面编程)最好的方式:
通知(四种)+顾问(两种)+ BeanNameAutoProxyCreator自动代理(三种)
回顾的博客:https://www.cnblogs.com/whgk/p/6627187.html
如果有了aspectj的jar包,spirng-aop可以简化
1、 写目标类
2、 写通知切面类
3、 配置spring配置文件