美文网首页
Spring AOP

Spring AOP

作者: Sunny旋律 | 来源:发表于2019-07-31 01:17 被阅读0次

    1.概念

    AOP。总体来说就是通过xml配置的方式,在不修改原代码的情况在,自动将多个方法集成在一起实现。其实现原理就是动态代理的方式。

    xml配置方式就略过不讲了,毕竟SpringBoot之后都不用xml配置方式了。

    举个例子。例如有 UserServiceImpl.login()方法,还有一个Logger.log()方法。AOP的最终实现,就是在不修改这两个方法的同时,在执行UserServiceImpl.verify()之前执行一下Logger.log()方法。这个是前置执行,也有后置(方法执行后执行log方法),环绕(方法执行前后都执行一次log方法)等方式。

    2.静态代理

    AOP的实现原理是动态代理,但是为了理解,先讲讲静态代理

    讲动态代理之前,先讲讲静态代理,如下代码所示,就是需要手动的实现目标类的接口的代理类。比如这里的 UserServiceProxy

     /**
     * 静态代理类
     */
    public class UserServiceProxy implements IUserService {
    
    private ILogger  logger;
    private IUserService target; //被代理的目标
    
    public UserServiceProxy(ILogger logger, IUserService target) {
        this.logger = logger;
        this.target = target;
    }
    
    /**
     * 这里就实现了功能的集成
     * @param name
     * @param password
     */
    @Override
    public void verify(String name, String password) {
        this.logger.log();
        this.target.verify(name, password);
    }
    }
    

    然后实现一个工厂方法,去构造一个代理对象

    public class ServiceFactory {
    
    private static ServiceFactory factory;
    
    private ServiceFactory(){}
    
    public static ServiceFactory getInstance(){
        if (factory ==  null) {
            factory = new ServiceFactory();
        }
    
        return factory;
    }
    
    public IUserService createUserService(){
        //1。这个实现,就代表没有用代理
        //return new UserServiceImpl();
    
        //2。以下就实现了静态代理
        IUserService userService = new UserServiceImpl();
        ILogger logger = new LoggerImpl();
    
        return new UserServiceProxy(logger, userService);
    }
    }
    

    最后,在用的时候,通过工厂方法生成代理对象,这样调用接口方法verify的时候,就会去调用Logger.log()方法

    /**
     * 静态代理测试
     *
     * 静态代理,就是需要手动的实现目标类的接口的代理类。比如这里的 UserServiceProxy
     */
    public static void testStaticProxy(){
        System.out.println("\n静态代理测试");
        IUserService target = ServiceFactory.getInstance().createUserService();
        target.verify("testStaticProxy", "123456");
    }
    

    3.动态代理

    动态代理,相比静态代理来说不用手动实现一个接口。而是动态的来实现静态代理。示例代码略。

    核心方法就是JDK提供的
    实现动态代理的方式有两个:
    1.一个是JDK提供的Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h),这个只能代理面向接口编程的目标
    2.第二种就是CGLIB提供的动态代理,可以代理没有面向接口编程的目标。性能没有第一种好。

    Spring的AOP实现原理就是动态代理。先判断要代理的类是不是面向接口的,如果是,用第一种方法,否则第二种方法

    相关文章

      网友评论

          本文标题:Spring AOP

          本文链接:https://www.haomeiwen.com/subject/dfsarctx.html