本文主要是介绍SpringAOP 实现机制介绍——JDKProxy,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
List:
1.前言
2.AOP的实现方法
3.使用动态代理实现AOP
4.思考总结
……1.前言……
AOP的应用场景有很多,权限、缓存、错误处理、日志记录、事务、性能优化等等。AOP的实现重点在于代理对象的生成,实现商业逻辑和通用服务的一种分离。这样做的好处是:核心关注点只关注业务流程,横切关注点只关注提供共性服务。实现了解耦,实现了共同逻辑的封装。
……2.AOP的实现方法……
2.1)静态AOP
静态织入:写代码的时候,直接将切面写入。绑定好的,不灵活。
2.2)动态AOP
- 动态代理:在运行中,通过类加载器(ClassLoader)加载目标类(被代理类)之后,为接口动态生成代理类(业务方法+服务方法),将切面(服务)织入到代理类(业务)中。
- 动态字节码生成:在运行期,目标类加载后,动态构建字节码文件生成目标类的子类,将切面逻辑加入到子类中,使用Cglib来实现动态字节码技术
- 自定义类加载器:在运行期,目标加载前,将切面逻辑加到目标字节码里
- 字节码转换:在运行期,所有类加载器加载字节码前进行拦截
……3.使用JDKProxy实现AOP……
3.1)我们需要四种角色实现下面这个图。
- 被代理的类:Business
- 被代理的类的接口:IBusiness,IBusiness2
- 织入器:JDKProxy承担了织入器的角色。
- InvocationHandler的实现类:LogInvocationHandler 切面类
3.2)实现的过程是:
- 织入器使用接口反射机制生成一个代理类。
- 在代理类中织入服务代码。
- 将代理类缓存到本地jvm被调用。
3.3)实现代码:
public interface IBusiness {public boolean doSomeThing();
}
public interface IBusiness2 {public void doSomeThing2() ;
}
public class Business implements IBusiness, IBusiness2 {@Overridepublic boolean doSomeThing() {System.out.println("我是login服务的实现,业务逻辑1");return true;}@Overridepublic void doSomeThing2() {System.out.println("我是下订单的服务的实现,业务逻辑2");}
}
public class LogInvocationHandler implements InvocationHandler {private Object target; //目标对象LogInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//执行原有逻辑Object rev = method.invoke(target, args);//执行织入的日志,你可以控制哪些方法执行切入逻辑//定义了切点(pointcut)doSomethingsif (method.getName().equals("doSomeThing")) {System.out.println("日志打印"+new Date()+" : 我是被织入的代码,after业务逻辑=====");}return rev;}
}
public class BussinessMain {public static void main(String[] args) {//需要代理的接口,被代理类实现的多个接口都必须在这里定义Class[] proxyInterface = new Class[] { IBusiness.class, IBusiness2.class };//构建AOP的Advice,这里需要传入业务类的实例LogInvocationHandler handler = new LogInvocationHandler(new Business());//生成代理类的字节码加载器ClassLoader classLoader = BussinessMain.class.getClassLoader();//织入器,织入代码并生成代理类//classLoader字节码加载器
// proxyInterface需要代理的接口(业务类的接口)
// handler 切面,声明的是代理类IBusiness proxyBusiness = (IBusiness) Proxy.newProxyInstance(classLoader, proxyInterface, handler);//使用代理类的实例来调用方法。proxyBusiness.doSomeThing();
// ((IBusiness) proxyBusiness).doSomeThing();}
}
console:
3.4)JDKProxy和Cglib的区别:
true表示让spring使用Cglib实现AOP,配置为false表示使用动态代理实现AOP,默认使用动态代理。
……4.思考总结……
这篇关于SpringAOP 实现机制介绍——JDKProxy的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!