Spring AOP
2015-10-16 16:10
549 查看
spring AOP
spring有四种方法级别的增强,包括前置增强、后置增强、环绕增强、异常抛出增强,
有一种特殊的类级别的增强,引介增强
以下是三种不同配置方式,实现自动代理的简要示例:
xml方式配置Advisor匹配:
1先创建增强类XxxAdvice,依据不同增强类型实现不同的接口
2在xml中配置代理工厂ProxyFactoryBean
<!-- 增强类 -->
<bean id="xxxAdvice" class="com.a.b.XxxAdvice"/>
<!-- 目标对象 -->
<bean id="target" class="com.a.b.XxxService"/>
<!-- 代理类 -->
<bean id="xxxService" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
<!-- 指定使用的增强 -->
p:advice-ref="xxxAdvice"
<!-- 要代理的目标方法匹配的表达式 -->
p:patterns=".*target" />
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
/>
3调用逻辑
获取到代理类对象(注入等方式)
用代理对象调用原目标对象的功能方法
@AspectJ方式配置实例:
1切面类
@Aspect //该注解将该类标注为一个切面
public class PerformanceAspect{
@Around("execution(* com.xxx.*.* (...))")
//表明是环绕增强,在目标类的所有方法上织入,方法可以是任意入参和返回值(根据切点表达式具体控制)
public void xxxX(ProceedingJoinPoint point){
//横切逻辑代码
point.procceed();
//横切逻辑代码
}
}
2在spring xml文件中加入:
<aop:aspectj-autoproxy /> //开启自动代理
//以及切面类的bean配置(可选,或者使用@Compenent)
基于Schema的配置示例:
<bean id="timeRecordLogAspect" class="com.ggg.mmm.utils.timeRecordLog.TimeRecordLogAspect" scope="prototype">
</bean>
<aop:config proxy-target-class="false">
<aop:aspect ref="timeRecordLogAspect">
<aop:around method="getTimeLog" pointcut="execution(* com.ggg.xxx.*.*.impl..*(..))" />
</aop:aspect>
</aop:config>
类似于基于AspectJ配置,切面类的写法也一致(去除@aspectj标注)
spring有四种方法级别的增强,包括前置增强、后置增强、环绕增强、异常抛出增强,
有一种特殊的类级别的增强,引介增强
以下是三种不同配置方式,实现自动代理的简要示例:
xml方式配置Advisor匹配:
1先创建增强类XxxAdvice,依据不同增强类型实现不同的接口
2在xml中配置代理工厂ProxyFactoryBean
<!-- 增强类 -->
<bean id="xxxAdvice" class="com.a.b.XxxAdvice"/>
<!-- 目标对象 -->
<bean id="target" class="com.a.b.XxxService"/>
<!-- 代理类 -->
<bean id="xxxService" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
<!-- 指定使用的增强 -->
p:advice-ref="xxxAdvice"
<!-- 要代理的目标方法匹配的表达式 -->
p:patterns=".*target" />
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
/>
3调用逻辑
获取到代理类对象(注入等方式)
用代理对象调用原目标对象的功能方法
@AspectJ方式配置实例:
1切面类
@Aspect //该注解将该类标注为一个切面
public class PerformanceAspect{
@Around("execution(* com.xxx.*.* (...))")
//表明是环绕增强,在目标类的所有方法上织入,方法可以是任意入参和返回值(根据切点表达式具体控制)
public void xxxX(ProceedingJoinPoint point){
//横切逻辑代码
point.procceed();
//横切逻辑代码
}
}
2在spring xml文件中加入:
<aop:aspectj-autoproxy /> //开启自动代理
//以及切面类的bean配置(可选,或者使用@Compenent)
基于Schema的配置示例:
<bean id="timeRecordLogAspect" class="com.ggg.mmm.utils.timeRecordLog.TimeRecordLogAspect" scope="prototype">
</bean>
<aop:config proxy-target-class="false">
<aop:aspect ref="timeRecordLogAspect">
<aop:around method="getTimeLog" pointcut="execution(* com.ggg.xxx.*.*.impl..*(..))" />
</aop:aspect>
</aop:config>
类似于基于AspectJ配置,切面类的写法也一致(去除@aspectj标注)
相关文章推荐
- Java io详解(二)-File
- Java interview 统计一篇英文文档的单词数,并输出次数最多的10个
- Android 模拟器genymotion安装,eclipse 插件
- Spring整合Struts2(实操)
- java synchronized详解
- 【Android】eclipse常用快捷键
- java设计模式--适配器模式
- Spring 3.0 注解注入详解
- MyEclipse快捷键大全
- Java io详解(-)
- 基于JDK 8的Dubbo Admin
- 比较Java数组,ArrayList,LinkedList,Vector 性能比较
- Maven管理java工程
- Eclipse 设置一行代码宽度
- Java学习篇之---Spring Scope prototype与singleton区别
- JAVA中异常处理小结
- 从0开始学java——JSP&Servlet——web容器搜索class的路径顺序
- eclipse 中设置注释模板
- spring 监听器 IntrospectorCleanupListener
- struts2在加载首页是访问action