AOP术语:
- target:目标类,需要被代理的类
- 连接点:可能需要被拦截的方法
- 切入点:已经被增强的连接点
- 通知:增强的代码
- 织入:把增强应用到目标对象生成代理类的过程
- 切面:切入点和通知的结合
jdk动态代理:对“装饰者”模式的简化,装饰者的目标类的方法必须全部都实现,即使不做也要调用先前的方法。
特点:必须有接口
目标类:接口+实现类
切面类:存放通知
工厂类:编写工厂生成代理
Proxy.newProxyInstance参数:
- loader 类加载器,动态代理类 运行时创建,任何类都需要类加载器将其加载到内存,一般使用当前类.class.getClassLoader();或者目标类实例.getClass().get,得到的类加载器相同
- 代理类需要实现的所有接口。目标类实例.getClass().getInterfaces(),此时只能获得自己的接口,不能得到父元素的接口,或者new Class[]{UserService.class}
- InvocationHandler 处理类,接口,必须有实现类,一般使用匿名内部类,提供invoke方法,代理类的每个方法执行时,都要调用一次Invoke,参数有proxy:代理对象,method:代理对象当前执行的方法的描述对象,args[]:方法的参数
spring 编写代理:半自动
通知类型:按照通知在目标类的方法的连接点的位置,分为5类,尤其是环绕通知
jar包:4+1+AOP联盟+spring AOP实现
spring 全自动:BeanPostProcessor后处理bean,用于在初始化方法调用前后执行的方法,其中可以加入jdk的动态代理。
从spring容器获得目标类,如果配置了AOP,spring将自动从后处理bean生成代理。
步骤:
- 得到目标类
- 配置文件生成AOP