• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

java AOP原理以及实例用法总结

java 搞代码 4年前 (2022-01-09) 15次浏览 已收录 0个评论

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());
 }

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

但是如果接口里面有很多方法,如果每个方法都需要增加日志功能,这样就会出现很多重复代码,并且装饰者模式不能同时为多个本文来源gao@!dai!ma.com搞$$代^@码!网没有关系的类同时增强

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

二.动态代理

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

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

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

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

1.第一种实现:

基于接口的动态代理,使用java内部反射包增强

这种方式创建对象是目标对象的兄弟对象.

同样上面是实现了接口的两个功能的类:

@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 void test2(){

 //创建需要代理的对象
 BookSerice bookSerice = new BookSericeImpl();
 //根据对象的类获取类加载器
 ClassLoader classLoader = bookSerice.getClass().getClassLoader();
 //获取被代理对象说实现的所有接口
 Class<?>[] interfaces = bookSerice.getClass().getInterfaces();
 //新建代理对象,里面参数需要(类加载器,一个对象所实现的接口,InvocationHandler接口类的对象)
 bookSerice = (BookSerice) Proxy.newProxyInstance(classLoader, interfaces, new LogHandler(bookSerice)); 
 bookSerice.addOne(new BokBean());
 bookSerice.deletOne(232L);
}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:java AOP原理以及实例用法总结

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址