Spring AOP和AspectJ支持

这一部分学习Spring AOP和AspectJ主题,比如通知优先权和引入等等。

我希望大家能够和我一起对照着博客按小节去看代码,不然可能会看晕,每一节的代码我都有写注释,应该是比较容易看懂的。这一节的包是com.apress.springrecipes.calculator.test1,按照Main里面的注释分块运行代码即可。

1.启用Spring的AspectJ注解

在配置文件中定义一个空的xml元素<aop:aspectj-autoproxy>就可以启用SpringIoC的AspectJ注解支持,然后Spring会自动匹配你的AspectJ aspect的所有Bean创建代理。

相关有ArithmeticCalculator.java,UnitCalculator.java,ArithmeticCalculatorImpl.java,UnitCalculatorImpl.java,beans.xml

2.用AspectJ注解声明aspect

要在Spring中注册AspectJ aspect,只需将它们声明为IoC容器中的Bean实例即可。

相关有CalculatorLoggingAspect.java,Main.java

3.访问连接点信息

在AOP中,通知适用于不同程序的执行点称作连接点。声明一个org.aspectj.lang.JoinPoint类型的参数访问当前连接点信息。

相关有CalculatorLoggingAspect.java,Main.java

4.指定aspect优先级

通过实现Ordered接口或使用@Order注解实现。

相关有CalculatorValidationAspect.java,CalculatorLoggingAspect.java,Main.java,beans.xml

5.重用切入点定义

和许多其他AOP实现一样,AspectJ也允许独立定义切入点,在多个通知中重用。

相关有CalculatorLoggingAspect.java,Main.java(这个我没有具体实现,比较简单,前面写过了)

6.编写AspectJ切入点表达式

AspectJ切入点语言是一种强大的表达式语言,能够匹配各种类型的连接点。但是,Spring AOP只支持在其IoC容器中声明的Bean的方法执行连接点。所以这里只介绍了有关Spring AOP支持的切入点表达式。AspectJ切入点语言的完整描述可以去AspectJ的网站http://www.eclipse.org/aspectj/上的AspectJ编程指南查看。

方法签名模式

execution(* com.apress.springrecipes.calculator.test1.ArithmeticCalculator.*(..))  匹配所有

execution(public com.apress.springrecipes.calculator.test1.ArithmeticCalculator.*(double, ..))  匹配public和第一个参数为double类型

或者使用@LoggingRequired注解,编写一个切入点表达式@annotation(com.apress.springrecipes.calculator.test1.LoggingRequ

ired)来匹配所有具有@LoggingRequired注解的方法。

类型签名模式

within(com.apress.springrecipes.calculator.test1.*)  匹配所有com.apress.springrecipes.calculator包中的方法执行连接点

Bean名称模式

bean(*Calculator)  匹配所有以Calculator结尾的Bean

7.在你的Bean中引入行为

引入时AOP中的一众特殊通知,允许为一个接口提供实现类,使对象动态的实现接口。

相关有MaxCalculator.java,MinCalculator.java,MaxCalculatorImpl.java,MinCalculatorImpl.java,CalaulatorIntroduction.ja

va,Main.java,beans.xml

8.为你的Bean引入状态

可以为对象引入一个新的接口和保存状态字段的实现类,然后可以编写另一个通知根据特定的条件改变状态。

相关有Counter.java,CounterImpl.java,CalculatorIntroduction.java,Main.java

9.用基于XML的配置声明aspect

在普通情况下,基于注解的声明优于基于XML的声明,以注解风格编写的aspect将会有更多重用的机会,故仅给出代码,并未做具体实现。

相关有beans.xml

10.Spring中的AspectJ加载时织入aspect

织入是aspect应用到目标对象的过程。使用Spring AOP,织入在运行时通过动态代理发生。相反,AspectJ框架支持编译时和加载时织入。编译时织入通过特殊的AspectJ编译器ajc完成,我的代码中并未实现;加载时织入也称LTW,发生在目标类由类装载器装载到JVM时。

相关有Complex.java,ComplexCalculatorImpl.java,ComplexCalculator.java,ComplexCachingAspect.java,Main.java,beans.xml

11.在Spring中配置AspectJ aspect

每个AspectJ aspect提供一个静态工厂方法aspectOf(),这个方法使你能访问当前的aspect实例。在Spring IoC容器中,可以指定factory-method属性声明一个由工厂方法创建的Bean。

<bean class="..." factory-method="aspectOf"><property></property></bean>

12.将Spring Bean注入领域对象

在Spring IoC容器外创建的对象通常是领域对象,它们由new或者从数据库中查询的结果创建。

相关有ComplexFormatter.java,Complex.java,Main.java,beans.xml

这一次的内容就这么多,代码可以关注我们的公众号  落饼枫林  回复  Spring  获得,当然是现有的全部的代码,后续会继续更新!也欢迎大家在公众号留言交流讨论,谢谢~~

猜你喜欢

转载自blog.csdn.net/qq_39391192/article/details/82696553