- 既然是在spring中,那么切面的配置肯定是可以通过配置文件配置的啦~~
- 语法
-
<aop:before> 配置目标方法执行之前的处理 <aop:after> 配置目标方法执行之后的处理 <aop:after-returing> 配置after-returing处理 <aop:after-throwing> 配置after-throwing处理 <aop:after-around> 配置after-around处理 - <aop:config> aop配置的配置标志 <aop:aspect>配置切面
-
-
原理,先和普通bean一样的配置方法配置一个bean,然后再把这个普通的bean配置成切面bean
-
普通的类,把它在配置文件中按普通的bean一样配置
package pointcut_package; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import java.util.Arrays; public class FourAdviceTest { public Object processTx(ProceedingJoinPoint proceedingJoinPoint) throws java.lang.Throwable{ System.out.println(" **** around增强,在方法执行之前"); Object []args = proceedingJoinPoint.getArgs(); if(args != null && args.length > 0 && args[0].getClass() == String.class){ args[0] = " **** 增强的arg " + args[0]; } Object rvt = proceedingJoinPoint.proceed(args); System.out.println(" **** around增强,方法执行之后"); if(rvt !=null && rvt instanceof Integer){ rvt = (Integer)rvt * (Integer)rvt; } return rvt; } public void authority(JoinPoint joinPoint){ System.out.println(" **** before增强,方法执行之前"); System.out.println(" **** before,被织入增强的目标方法为" + joinPoint.getSignature().getName()); System.out.println(" **** before, 被织入增强的目标方法参数为" + joinPoint.getArgs()); System.out.println(" **** before, 被织入增强的目标方法对应的目标对象为" + joinPoint.getTarget()); } public void log(JoinPoint joinPoint, Object rvt){ // 这里就直接用啦~ System.out.println(" **** afterReturning ,获取目标方法的返回值" + rvt); System.out.println(" **** afterReturning,模拟记录日志" + joinPoint.getSignature().getName()); System.out.println(" **** afterReturning, 目标方法的参数为" + joinPoint.getArgs()); System.out.println(" **** afterReturinig, 目标方法的对应的对象为" + joinPoint.getTarget()); } public void release(JoinPoint joinPoint){ System.out.println(" **** after, 模拟方法结束之后释放资源"); System.out.println(" **** after, 被织入的方法是" + joinPoint.getSignature().getName()); System.out.println(" **** after, 被织入目标方法的参数是 " + Arrays.toString(joinPoint.getArgs())); System.out.println(" **** after, 被织入方法对应的目标对象是" + joinPoint.getTarget()); } }
-
配置文件,详细的讲解穿插在代码里面
<?xml version="1.0" encoding="GBK"?> <!--要导入zop支持--> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"> <!-- 指定自动搜索Bean组件、自动搜索切面类 --> <context:component-scan base-package="pointcut_package"> <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/> </context:component-scan > <!-- 启动@AspectJ支持 --> <aop:aspectj-autoproxy/> <aop:config> <aop:aspect id="fourAdviceAspect" ref="fourAdviceBean" order="2"> <!--讲id为fourAdviceAspect的baen转换成切面bean,并且指定切面bean的id,优先级--> <!--直接写入切入点表达式和对应bean中的方法--> <aop:after pointcut = "execution(* pointcut_package.*.* (..))" method = "release"/> <aop:before pointcut = "execution(* pointcut_package.*.* (..))" method = "authority"/> <aop:around pointcut = "execution(* pointcut_package.*.* (..))" method = "processTx"/> <aop:after-returning method="log" pointcut="execution(* pointcut_package.*.* (..))" returning="rvt"/> </aop:aspect> <aop:aspect id="secondAdviceAspect" ref="secondAdviceBean" order="1"> <!--讲id为fourAdviceAspect的baen转换成切面bean,并且指定切面bean的id,优先级--> <aop:after pointcut="execution(* pointcut_package.*.* (..)) and args(aa,..)" method="authority"/> </aop:aspect> </aop:config> <!--这些这是普通的bean,在上面被转换成了切面bean--> <bean id="fourAdviceBean" class="pointcut_package.FourAdviceTest"/> <bean id="secondAdviceBean" class="pointcut_package.SecondAdviceTest"/> </beans>
-
当然啦配置切入点也是不能少的,一并奉上
-
语法,要在切面里面定义
<aop:pointcut id="它的id啦" expression="要执行增强的bean">
使用
<aop:before(四种都可以) ... express-ref="切入点的id">
-
<?xml version="1.0" encoding="GBK"?> <!--要导入zop支持--> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"> <!-- 指定自动搜索Bean组件、自动搜索切面类 --> <context:component-scan base-package="pointcut_package"> <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/> </context:component-scan > <!-- 启动@AspectJ支持 --> <aop:aspectj-autoproxy/> <aop:config> <aop:aspect id="fourAdviceAspect" ref="fourAdviceBean" order="2"> <!--讲id为fourAdviceAspect的baen转换成切面bean,并且指定切面bean的id,优先级--> <aop:pointcut id="myPointcut" expression= "execution(* pointcut_package.*.* (..))"/> <!--直接写入切入点表达式和对应bean中的方法--> <aop:after pointcut-ref="myPointcut" method = "release"/> <aop:before pointcut-ref="myPointcut" method = "authority"/> <aop:around pointcut-ref="myPointcut" method = "processTx"/> <aop:after-returning method="log" pointcut="execution(* pointcut_package.*.* (..))" returning="rvt"/> </aop:aspect> <aop:aspect id="secondAdviceAspect" ref="secondAdviceBean" order="1"> <!--讲id为fourAdviceAspect的baen转换成切面bean,并且指定切面bean的id,优先级--> <aop:after pointcut="execution(* pointcut_package.*.* (..)) and args(aa,..)" method="authority"/> </aop:aspect> </aop:config> <!--这些这是普通的bean,在上面被转换成了切面bean--> <bean id="fourAdviceBean" class="pointcut_package.FourAdviceTest"/> <bean id="secondAdviceBean" class="pointcut_package.SecondAdviceTest"/> </beans>
-
-
这是我看李刚编著的《轻量级javaEE企业应用实战(第五版)-Struts2+Spring5+Hibernate5/JAP2》后总结出来的。
-
Spring 进阶(19)Spring的AOP (7) 使用注解配置切面(4)使用配置文件配置切面
最新推荐文章于 2020-12-27 23:09:10 发布