ProxyFactoryBean
//使用ProxyFactoryBean类方式代理API//ProxyFactoryBean类的getObject方法将创建一个AOP代理包装一个对象//使用代理方式当pointcut实例化时,调用该切面通知类指定方法<bean id="defaultAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvis
·
//使用ProxyFactoryBean类方式代理API
//ProxyFactoryBean类的getObject方法将创建一个AOP代理包装一个对象
//使用代理方式当pointcut实例化时,调用该切面通知类指定方法
<bean id="defaultAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="moocBeforeAdvice"
<property name="pointcut" ref="pointcutBean" />
</bean> -->
//target类interceptorNames匹配到list中的方法名时调用通知
<bean id="bizLogicImpl" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref bean="bizLogicImplTarget"/>
</property>
<property name="interceptorNames">
<list>
<value>defaultAdvisor</value>
<value>moocAfterReturningAdvice</value>
<value>moocMethodInterceptor</value>
<value>moocThrowsAdvice</value>
</list>
</property>
</bean>
<bean id="bizLogicImplTarget" class="com.imooc.aop.api.BizLogicImpl"></bean>
<bean id="pointcutBean" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedNames">
<list>
<value>sa*</value>
</list>
</property>
</bean>
1.JDK动态代理
此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑。
代理模式在实际使用时需要指定具体的目标对象,如果为每个类都添加一个代理类的话,会导致类很多,同时如果不知道具体类的话,怎样实现代理模式呢?这就引出动态代理。
JDK动态代理只能针对实现了接口的类生成代理。
2.CGLIB代理
CGLIB(CODE GENERLIZE LIBRARY)代理是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明称final的。
如果目标对象没有实现接口,则默认会采用CGLIB代理;
如果目标对象实现了接口,可以强制使用CGLIB实现代理(添加CGLIB库,并在spring配置中加入)。
AOP包括切面(aspect)、通知(advice)、连接点(joinpoint),实现方式就是通过对目标对象的代理在连接点前后加入通知,完成统一的切面操作。
更多推荐
已为社区贡献1条内容
所有评论(0)