您的位置:首页 > 编程语言 > Java开发

SpringAOP动态代理小结

2016-03-02 18:08 423 查看
学习springAOP时,顺便学习了jdk与cglb动态代理,jdk与cglb动态代理最大不同之处就是jdk动态代理是基于接口的,如果有的项目不是基于接口又想实现动态代理,就需要cglb动态代理,这里总结下AOP的动态代理。

springAOP动态代理实现方式

是基于jdk与cglb的,就是选它们一种来实现。这里涉及两个属性

proxyTargetClass属性,若为true,则是面向类动态代理,这时是基于CGLB,需要CGLB包cglib-nodep-2.1_3.jar
或者设置optimize为true。就是基于CGLB包的,springAOP默认是基于JDK动态代理,就是需要接口


springAOP的五种增强

要实现增强需写一个类实现这几个方法

前置增强:org.springframework.aop.BeforeAdvice
后置增强:org.springframework.aop.AfterAdvice
环绕增强:org.springframework.aop.MethodInterceptor
异常抛出增强: org.springframework.aop.ThrowsAdvice
引介增强:org.springframework.aop.IntroductionInterceptor
重点总结下引介增强:针对类(对象),改变对象中的某个属性或方法的时候执行通知类型
具体继承类:DelegatingIntroductionInterceptor(已实现上面的接口)


写一个例子来分析引介增强

//这里我用的基于cglib代理的,所以不定义接口
//定义一个目标类,保存什么东西。我想在保存的时候在前面做一些事,或者后面做一些事,并且可以控制我是否可以做这些事,不想做就取消,想做就添加,这是环绕通知做不到的。
public class Waiter {

public void save(String name){
System.out.println("保存=============" + name);
}
}
//写个接口,控制我是否启动来做这些事比如数据库事物的开启与关闭
public interface IControllerOpen {
//控制通知的打开和关闭
public void setOpen(boolean flag);
}
//织入类,继承DelegatingIntroductionInterceptor这个类并实现我们的控制接口
public class ControllerInterceptor extends DelegatingIntroductionInterceptor implements IControllerOpen{
ThreadLocal<Boolean> threadLocal = new ThreadLocal<Boolean>();
//名字必须一样,因为这是最初接口的名字,我们只是再继承了一个类
@Override
public Object invoke(MethodInvocation mi) throws Throwable{
Object obj = null;
if(threadLocal.get() != null && threadLocal.get()){
System.out.println("事物开启。。。");
obj = super.invoke(mi);
System.out.println("事物提交。。。。");
}else{
obj = super.invoke(mi);
}
return obj;
}
@Override
public void setOpen(boolean flag) {
threadLocal.set(flag);
}

}
//欧了,写个测试
public class Test {

public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:com/tree/aop3/bean.xml");
Waiter waiter = (Waiter) context.getBean("proxy");
IControllerOpen contro = (IControllerOpen) waiter;
//设置为false,表示我不想增强了,如果设置或true则表示增强,方便控制了
contro.setOpen(false);
waiter.save("黑猫");
System.out.println("============");
}
}
//当然还有ioc的配置
<!-- 目标类(对象) -->
<bean id="target" class="com.tree.aop3.Waiter"></bean>
<!-- 织入类 -->
<bean id="advice" class="com.tree.aop3.ControllerInterceptor"></bean>
<!-- 代理工厂 -->
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="target"></property>
<property name="interfaces" value="com.tree.aop3.IControllerOpen"></property>
<property name="interceptorNames" value="advice"></property>
<property name="proxyTargetClass" value="true"></property>
</bean>


其余的增强都大同小异,不过异常增强通知是需要手动抛出一个异常的。欧了,小长我继续学习去了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: