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);
@Override
public 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>
测试代码:调用配置的代理工厂
@Test
public void test() {
ApplicationContext context=new ClassPathXmlApplicationContext("spring-core2.xml");
Student student= (Student) context.getBean("ProxyFactory");
student.addStudent();
}