1、pom文件引入依赖
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!--spring aop + aspectj-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
</dependencies>
2、创建测试对象
接口:
两个实现类(被代理对象):
通知内容设置,需要实现两个接口,一个前置通知接口,一个后置通知接口
3、在resources下添加配置文件
配置切入点,通知,被代理者,切面(切入点+通知)以及代理对象。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定义被代理者 -->
<bean id="h1" class="com.ljs.demo.DannyEat"></bean>
<bean id="h2" class="com.ljs.demo.JannyEat"></bean>
<!-- 定义通知内容,也就是切入点执行前后需要做的事情 -->
<bean id="timeHandler" class="com.ljs.demo.TimeHandler"></bean>
<!-- 定义切入点位置,这里定义到了doPrint方法上 -->
<bean id="timePointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value=".*eat"></property>
</bean>
<!-- 使切入点与通知相关联,完成切面配置 -->
<bean id="timeHandlerAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="timeHandler"></property>
<property name="pointcut" ref="timePointcut"></property>
</bean>
<!-- 设置代理 -->
<bean id="DannyEat_porxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 代理的对象 -->
<property name="target" ref="h1"></property>
<!-- 使用切面 -->
<property name="interceptorNames" value="timeHandlerAdvisor"></property>
<!-- 代理接口,接口 -->
<property name="proxyInterfaces" value="com.ljs.demo.Eat"></property>
</bean>
<!-- 设置代理 -->
<bean id="JannyEat_porxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 代理的对象 -->
<property name="target" ref="h2"></property>
<!-- 使用切面 -->
<property name="interceptorNames" value="timeHandlerAdvisor"></property>
<!-- 代理接口,接口 -->
<property name="proxyInterfaces" value="com.ljs.demo.Eat"></property>
</bean>
</beans>
4、测试类中加载配置文件,调用代理对象,实现aop
5、控制台输出结果:
6、可以对参数进行重新设置调用,将方法传入参数,实现在通知中获取参数,并将参数重新赋值后传入方法。
若未改变参数,即通知类写法同上时,控制台打印:
如果参数改变,改变通知类的写法:(如果想让修改的参数在被代理对象调用的方法中生效,必须在前置通知中修改参数,就是在方法执行之前将参数修改。)
修改参数后,控制台打印如下:
7、改变后置通知:
增加一个带有返回值的方法:eat_1
在配置文件中,修改切入点方法为所有:
在通知类中获取返回值:
在测试方法中调用:
控制台打印结果如下: