这一部分学习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 获得,当然是现有的全部的代码,后续会继续更新!也欢迎大家在公众号留言交流讨论,谢谢~~