Spring基础-AOP之ProxyFactoryBean及相关内容(五)
程序员文章站
2022-04-25 19:34:05
...
ProxyFactoryBean
- 创建Spring AOP代理的基本方法是使用org.springframework.aop.framework.ProxyFactoryBean
- 这可以完全控制切入点和通知(advice)以及他们的顺序
- 使用ProxyFactoryBean或者其他IOC相关类来创建AOP代理的最重要好处是通知和切入点也可以由IOC来管理
- 被代理类没有实现任何接口,使用CGLIB代理,否则JDK代理
- 通过设置proxyTargetClass为true,可强制使用CGLIB
- 如果目标类实现了一个(或者多个)接口,那么创建代理的类型将依赖ProxyFactoryBean的配置
- 如果ProxyFactoryBean的proxyInterfaces属性被设置为一个或多个全限定接口名,基于JDK的代理将被创建
- 如果ProxyFactoryBean的proxyInterfaces属性没有被设置,但是目标类实现了一个(或者更多)接口,那么ProxyFactoryBean将自动检测到这个目标类已经实现了至少一个接口,创建一个基于JDK的dialing
Proxying classes
- 前面的例子中如果没有Person接口,这种情况下Spring会使用CGLIB代理,而不是JDK动态代理
- 如果想,可以强制在任何情况下使用CGLIB,即时有接口
- CGLIB代理的工作原理是在运行时生成目标类的子类,Spring配置这个生成的子类委托方法调用到原来的目标
- 子类是用来实现Decorator模式,织入通知
-
CGLIB的代理对用户是透明的,需要注意:
- final 方法不能被通知,因为它们不能被覆盖
- 不用把CGLIB添加到classpath中,在Spring3.2中,CGLIB被重新包装并包含在Spring核心的JAR(即基于CGLIB的AOP就像JDK动态代理一样”开箱即用”“)
使用global advisors
- 用*做通配,匹配所有拦截器加入通知链
简化的proxy定义
- 使用父子bean定义,以及内部bean定义,可能会带来更清洁和更简化的代理定义(抽象属性标记父bean定义为抽象的,这样它不能被实例化)
使用ProxyFactory
- 使用Spring AOP而不必依赖Spring IOC
ProxyFactory factory = new ProxyFactory(myBusinessInterfaceImpl);
factory.addAdvice(myMethodInterceptor);
factory.addAdvice(myAdvisor);
MyBusinessInterface tb = (MyBusinessInterface)factory.getProxy();
- 大多数情况下最佳实践是用IOC容器创建AOP代理
- 虽然可以硬编码方式实现但是Spring推荐使用配置或注解方式实现
使用”auto-proxy”
- Spring也允许使用”自动代理”的bean定义,它可以自动代理选定的bean,这是建立在Spring的”bean post processor”功能基础上的(在加载bean的时候就可以修改)
- BeanNameAutoProxyCreator
- DefaultAdvisorAutoProxyCreator,当前IOC容器中自动应用,不用显示声明引用advisor的bean定义
上一篇: Spring AOP相关内容及其应用实现
下一篇: CentOS安装过程注意