AOP :

面向切面编程

在程序设计中,我们需要满足高耦合低内聚,所以编程需满足六大原则,一个法则.

AOP面向切面编程正是为了满足这些原则的一种编程思想.

一.装饰者模式:

当我们需要给对象增加功能时,为了满足单一职责原则,可利用装饰者模式编程,创建一个类用来装饰原来的类,这个类写需要在原来的功能上增加的功能.

比如:一个类里面有一个增加图书的功能,

复制代码
@Service public class BookSericeImpl implements BookSerice {     @Override     public void addOne(BokBean bokBean) {         System.out.println("执行逻辑:插入一本书");     }     @Override     public void deletOne(Long bookId) {         System.out.println("执行逻辑:删除一本书");     } }
复制代码

我们需要在这个基础上新增打印日志的功能,

复制代码
public class BooklogServiceImpl implements BookSerice {     private BookSerice bookSerice;     public BooklogServiceImpl(BookSerice bookSerice) {         this.bookSerice = bookSerice;     }     @Override     public void addOne(BokBean bokBean) {          System.out.println("准备新增一本书");         this.bookSerice.addOne(bokBean);         System.out.println("新增一本书完成");     }     @Override     public void deletOne(Long bookId) {          System.out.println("准备删除一本书");         this.bookSerice.deletOne(323L);         System.out.println("删除一本书完成");     } }
复制代码

下面我们调用这个增强过后的的对象

复制代码
   public void test1(){          //Aop :面向切面编程          //使用装饰者模式设计对象        BookSerice bookSerice = new BookSericeImpl();         //把原来功能的对象通过构造方传给新增功能的类,并把新增功能类的对象赋给原来对象         //这里新增功能类和原来的类都是实现了同一个接口.        bookSerice = new BooklogServiceImpl(bookSerice);         //调用新增功能类的方法,在这个方法里让构造方法传过去的对象调用原来的功能        bookSerice.addOne(new BokBean());     }
复制代码

这样我们就在不改变原来代码的基础上新增了功能,并且也满足单一职责的原则,降低了代码的耦合性.

但是如果接口里面有很多方法,如果每个方法都需要增加日志功能,这样就会出现很多重复代码,并且装饰者模式不能同时为多个没有关系的类同时增强

所以java引入动态代理技术来增加功能.

 

二.动态代理

在java里动态代理有两个实现方式:

①针对有接口的类的代理,使用jdk中反射包下的动态代理

②针对没有接口的类的代理,使用第三方的jar包Enhancer

如果一个类既没有接口,又是final,那么不能进行增强

 

1.第一种实现: reflect包下的Proxy