强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan
简述 |
---|
AOP是可以横向扩展功能的,能够在不修改原来代码的前提下实现功能扩展,AOP的实现原理即是动态代理,下文一步步优化介绍一下几种代理方式
为什么要使用代理 |
---|
##1.什么是代理 代理即是将被代理对象进一步封装后,隐藏被代理对象,在不修改被代理对象代码的前提下完成一些额外的处理。 ##2.场景描述 有一个BookService类,其中有一个add方法,现在想在执行hello方法之前打印一句话,例如是打印”方法之前…”这几个字 “` public class BookService{ public void hello(){ System.out.println(“我是service”); } } “`
####2.1未使用代理时
public class BookService{
public void hello(){
System.out.println("方法之前...");
System.out.println("我是service");
}
}
在这个功能上又来了新需求:在这个方法后打印”方法之后…”这几个字,这时候又需要修改现有的代码 缺点:
####2.2 使用静态代理优化
①定义一个抽象接口:
public interface IBookService {
public void hello();
}
②被代理类实现IBookService接口:
public class BookService implements IBookService{
public void hello(){
System.out.println("我是service");
}
}
③创建一个代理类,实现共同的接口IBookService
public class Proxy implements IBookService {
//依赖被代理的对象
IBookService bookService = new BookService();
//重写方法
public void hello() {
System.out.println("方法之前...");
//调用被代理对象的接口
bookService.hello();
}
}
优点:
缺点:
public class Proxy implements InvocationHandler {
Object targetObject;
//3.创建一个方法来生成对象,参数是要代理的对象,getInstance返回的对象是代理对象
public Object getInstance(Object o){
//3.1创建LogProxy对象
//3.2设置这个代理对象
this.targetObject = o;
//3.3通过Proxy的方法创建代理对象,第一个参数是要代理对象的classLoader
//第二个参数是要代理对象实现的所有接口,第三个参数是实现类的InvocationHandler对象
//此时的result就是一个代理对象,代理的是o
Object result = java.lang.reflect.Proxy.newProxyInstance(o.getClass().getClassLoader(),o.getClass().getInterfaces(),this);
return result;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法之前...");
Object invoke = method.invoke(targetObject, args);
return invoke;
}
}
写一个测试类:
public class TestJDK {
public static void main(String[] args) {
IBookService instance = (IBookService) new Proxy().getInstance(new BookService());
instance.hello();
}
}
执行结果:
方法之前...
我是service
总结:
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
②代理类:
public class Proxy implements MethodInterceptor
Enhancer enchancer = new Enhancer();//字节码增强器
public Object getInstance(Object o){
enchancer.setSuperclass(User.class);//设置被代理类为父类
enchancer.setCallback(new UserInterceptor());//设置回调
return enchancer.create();//创建代理实例
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("方法之前...");
Object object = methodProxy.invokeSuper(o,objects);
return object;
}
}
③写一个测试类:
public class TestCglib {
public static void main(String[] args) {
BookService instance = (BookService) new Proxy().getInstance(new BookService());
instance.hello();
}
}
总结:
总结 |
---|
传统方式中,类与类之前的耦合性非常强,未使用代理时想要扩展,需要修改原来代码,这样就不符合设计原则,因此有了静态代理,在不修改原来代码情况下实现扩展,这样,一旦类多了就需要创建多个代理类,不利于维护,因此有了动态代理,两种动态代理各有优缺点,因此代理一次次的优化使得编码更加的灵活
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/181148.html原文链接:https://javaforall.cn