资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

SpringAOP应用场景你还不知道?这篇一定要看!-创新互联

回顾一下Spring AOP的知识

创新互联是一家专业的成都网站建设公司,我们专注成都网站建设、成都做网站、网络营销、企业网站建设,卖友情链接一元广告为企业客户提供一站式建站解决方案,能带给客户新的互联网理念。从网站结构的规划UI设计到用户体验提高,创新互联力求做到尽善尽美。

为什么会有面向切面编程(AOP)?

我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志、权限验证、事务等功能时,只能在在每个对象里引用公共行为。这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。

Spring AOP 中设计的一些核心知识,面试问题?

1、能说一下Spring AOP用的是哪种设计模式?

回答:代理模式。

2、 能简单聊一下你对代理模式的理解吗?

代理模式 balabala......,记住一些贴近日常的示例方便理解,如买火车票,Windows 里面的快捷方式...

3、 知道JDK代理和Cglib代理有什么区别?

我们不需要创建代理类,JDK 在运行时为我们动态的来创建,JDK代理是接口 balabala

若目标类不存在接口,则使用Cglib生成代理,balabala

不管是JDK代理还是Cglib代理本质上都是对字节码进行操作,balabala

4、让你实现一个JDK实现动态代理?你的思路是什么?

照葫芦画瓢,照猫画虎。

Proxy: 定义一个自己的Proxy类

InvocationHandler:定义一个自己的InvocationHandler类

ClassLoad:自定义类加载器(方便加载我们自己指定的路径下面的类)

上面简单回顾,并抛出一些问题。带着问题阅读,效果杠杠的。

Spring AOP应用场景你还不知道?这篇一定要看!

回到本文的重点

SpringAOP的在实际应用中场景有哪些?

  1. Authentication 权限

  2. Caching 缓存

  3. Context passing 内容传递

  4. Error handling 错误处理

  5. Lazy loading 懒加载

  6. Debugging 调试

  7. logging,tracing,profiling and monitoring 记录跟踪 优化 校准

  8. Performance optimization 性能优化

  9. Persistence 持久化

  10. Resource pooling 资源池

  11. Synchronization 同步

  12. Transactions 事务

  13. Logging 日志

以日志为例

假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如

Spring AOP应用场景你还不知道?这篇一定要看!

但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。

Spring AOP应用场景你还不知道?这篇一定要看!

但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。

通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置

插入这些功能。这样的思想,被称为面向切面编程,亦即AOP。

Spring AOP应用场景你还不知道?这篇一定要看!

为了在指定位置执行这些横向的功能,需要知道指定的是什么地方。

Spring AOP应用场景你还不知道?这篇一定要看!

例如上图,方法级别的aop实现,在一个程序执行链条中,把method2称为切点,也就是说在method2执行时会执行横切的功能,那么是在method2之前还是之后呢,又是执行什么呢?这些都由advice(通知)来指定。advice有5种类型,分别是:

  • Before(前置通知) 目标方法调用之前执行

  • After(后置通知) 目标方法调用之后执行

  • After-returning(返回通知) 目标方法执行成功后执行

  • After-throwing(异常通知) 目标方法抛出异常后执行

  • Around(环绕通知) 相当于合并了前置和后置

把切点和通知合在一起就是切面了,一个切面指定了在何时何地执行何种方法。在spring aop中如此定义这个切面:

@Aspect
@Component
public class HelloAspect {

  @Before("execution(* com.test.service.impl.HelloServiceImpl.sayHello(..))")
  public void sayHello(){
    System.out.println("hello Java编程技术乐园!");
  }

}

使用注解@Aspect将某个特定的类声明为切面,这样,该类下的方法就可以声明为横向的功能点后插入到指定位置。使用execution表达式声明在这个切点,格式如下:

Spring AOP应用场景你还不知道?这篇一定要看!

第一个位置指定了方法的返回值,*号代表任意类型的返回值,然后是所在的类和方法名,星号同样代表任意,就是该类中任意的方法,在上一个例子中方法名是sayHello,则是指定了该类中的sayHello方法。然后最后一个参数是方法入参,因为Java中支持重载,所以这个参数可以帮助你更精确的进行定位。两点表示任意参数类型。这样,execution表达式告诉了程序该在何地执行通知。而被诸如@Before注解修饰的方法就是通知的内容,也就是做什么。

总结

我们使用spring aop,有两点需要注意:

1、将切面类声明为一个bean

2、切点指定的方法所在的类也同样需由spring注入才能生效
欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。

最后欢迎大家一起交流,喜欢文章记得点个赞哟,感谢支持!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站栏目:SpringAOP应用场景你还不知道?这篇一定要看!-创新互联
网站网址:http://cdkjz.cn/article/djohse.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220