浅谈Java中的AOP面向切面的变成和控制反转IOC

https://blog.csdn.net/hi_kevin/article/details/7325554

https://www.cnblogs.com/zedosu/p/6632260.html

Spring中的AOP之代理模式

springAOP指的是在spring中的AOP,什么是AOP,相对于java中的面向对象(oop),在面向对象中一些公共的行为,像日志记录,权限验证等如果都使用面向对象来做,会在每个业务方法中都写上重复的代码,造成代码的冗余。
而AOP指的是面向切面编程,定义一个切面,用切面去切相应的方法,就可以织入相关的逻辑。
面向切面编程使用代理模式

一、代理模式
代理模式作为23种经典设计模式之一,其比较官方的定义为“为其他对象提供一种代理以控制对这个对象的访问”,简单点说就是,之前A类自己做一件事,在使用代理之后,A类不直接去做,而是由A类的代理类B来去做。代理类其实是在之前类的基础上做了一层封装。java中有静态代理、JDK动态代理、CGLib动态代理的方式。静态代理指的是代理类是在编译期就存在的,相反动态代理则是在程序运行期动态生成的,

二、静态代理
静态代理,简单点来说就是在程序运行之前,代理类和被代理类的关系已经确定。静态代理的实现方式一般有以下几个步骤,首先要定义一个公共的接口,供代理类和被代理类实现,如下

public interface AnimalService {

        void eat();
        void talk();
    }
    
    
    public class DogServiceImlp implements AnimalService{

        @Override
        public void eat() {
            System.out.println("我爱吃骨头");
        }

        @Override
        public void talk() {
            System.out.println("汪----汪----汪-----");
        }
    }
    
    
    public class CatServiceImpl implements AnimalService{

        @Override
        public void eat() {
            System.out.println("我爱吃鱼");
        }

        @Override
        public void talk() {
            System.out.println("喵---喵---喵---");
        }
    }

编写代理

public class CatProxy implements AnimalService {


        private CatServiceImpl cat = new CatServiceImpl();

        @Override
        public void eat() {
            System.out.println("代理操作,开启事务");
            cat.eat();
            System.out.println("代理操作,关闭事务");
        }


        @Override
        public void talk() {
            System.out.println("代理操作,开启事务");
            cat.talk();
            System.out.println("代理操作,关闭事务");

        }
    }

  

使用代理和不使用代理的调用方式

@Test
    public void ttt() {
        CatServiceImpl cat = new CatServiceImpl();
        cat.eat();
        System.out.println("-------------------");
        cat.talk();


        AnimalService cat2 = new CatProxy();
        cat2.eat();
        System.out.println("-------------------");
        cat2.talk();

    }

对比,使用静态代理和不使用静态代理,可以发现使用了代理之后,可以在被代理方法的执行前或后加入别的代码,实现诸如权限及日志的操作。

但,静态代理也存在一定的问题,如果被代理方法很多,就要为每个方法进行代理,增加了代码维护的成本。有没有其他的方式可以减少代码的维护,那就是动态代理。

三、JDK动态代理
JDK提供了动态代理的方式,可以生成代理类,被代理类和接口沿用静态代理中的接口类和接口实现类,接口实现类为被代理类,下面看代理类,

  

  

原文地址:https://www.cnblogs.com/qianjinyan/p/11139588.html