Spring -aop通知实例

来源:互联网 发布:c语言第三版课后答案 编辑:程序博客网 时间:2024/06/16 09:48

aop词解

切面 Aspect
对横切性关注点的模块化。
通知 Advice
对横切性关注点的具体实现。
切入点 Pointcut
它定义了Advice应用到哪些JoinPoint上,对Spring来说是方法调用。
连接点 JoinPoint
Advice在应用程序上执行的点或时机,Spring只支持方法的JoinPoint,这个点也可以使属性修改,如:Aspecj可以支持。
织入 Weave
将Advice应用到Target Object上的过程叫织入,Spring支持的是动态织入。
目标对象 Target Object
Advice被应用的对象。
代理 Proxy
Spring AOP默认使用JDK的动态代理,它的代理是运行时创建,也可以使用CGLIB代理。

定义:

Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点。简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能。

增强或通知

Spring支持五种类型的增强或通知(Advice):

Before(方法执行前) org.apringframework.aop.MethodBeforeAdvice

AfterReturning(方法返回后) org.springframework.aop.AfterReturningAdvice

After-throwing(异常抛出后) org.springframework.aop.ThrowsAdviceArround

环绕,即方法前后org.aopaliance.intercept.MethodInterceptor

引介,不常用org.springframework.aop.IntroductionInterceptor

实例:

需要实现相关的接口
public class AfterAdvice implements AfterReturningAdvice {private static Logger logger = LogManager.getLogger(AfterAdvice.class);@Overridepublic void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {logger.info("对业务代码进行自动日志记录");}}


描述连接点是进行AOP编程最主要的一项工作。增强提供了连接点方位信息:如织入到方法前面、后面等,而切点进一步描述织入到哪些类的哪些方法上。




xml配置文件
<!-- 目标对象 --> <bean id="student" class="com.java1704.spring.aop.server.Student"></bean><!-- 通知 --><bean id="afterAdvice" class="com.java1704.spring.aop.advice.AfterAdvice"></bean><bean id="securety" class="com.java1704.spring.aop.advice.Securety"></bean><bean id="beforeAdvice" class="com.java1704.spring.aop.advice.BeforeAdvice"><property name="securety" ref="securety"></property></bean><!--顾问 advisor  切点和通知组成的配置器--><bean id="pointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"><property name="pattern" value="com\.java1704\.spring\.aop\.server\.Student\..*"></property><!-- 切点 --><property name="advice" ref="beforeAdvice"></property></bean><!-- 代理工厂  --><bean id="ProxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean"><property name="target" ref="student"></property>   <!--需要执行的bean ,直接调用 ProxyFactory即可--><property name="interceptorNames"><list><value>pointcutAdvisor</value>  <!--这里可以时advice(切点) ,也可以是advisor(配置器)--></list></property></bean>
测试代码:调用配置的代理工厂
@Testpublic void test() {ApplicationContext context=new ClassPathXmlApplicationContext("spring-core2.xml");Student student= (Student) context.getBean("ProxyFactory");student.addStudent();}