Spring之基于XML配置AOP
一、添加依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
</dependencies>
二、准备环境代码
1.创建通知类
public class WebLog {
/**
* 测试AOP通知
*/
public void recordLog(){
System.out.println("recordLog.....");
}
}
2.创建接口及实现方法
public interface IUserService {
/**
* 测试AOP切入点:无参无返回值
*/
void saveUser();
/**
* 测试AOP切入点:无参有返回值
* @return
*/
int deleteUser();
/**
* 测试AOP切入点:有参无返回值
* @param i
*/
void updateUser(int i);
}
public class UserServiceImpl implements IUserService {
@Override
public void saveUser() {
System.out.println("保存...");
}
@Override
public int deleteUser() {
System.out.println("删除...");
return 0;
}
@Override
public void updateUser(int i) {
System.out.println("修改...");
}
}
3.配置spring.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置包扫描-->
<bean id="userService" class="cn.ybzy.service.impl.UserServiceImpl"></bean>
<!-- 配置通知类 -->
<bean id="webLog" class="cn.ybzy.utils.WebLog"></bean>
<!--配置AOP-->
<aop:config>
<!--配置切入点表达式-->
<aop:pointcut id="pl" expression="execution(* cn.ybzy.service.impl.*.*(..))"/>
<!--配置切面 -->
<aop:aspect id="webLogAdvice" ref="webLog">
<!-- 配置前置通知类型,并建立通知方法和切入点方法的关联-->
<aop:before method="recordLog" pointcut-ref="pl"></aop:before>
</aop:aspect>
</aop:config>
</beans>
4.执行测试
public class WebLogTest {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
IUserService as = (IUserService)ac.getBean("userService");
as.saveUser();
as.deleteUser();
as.updateUser(1);
}
}
1.测试AOP接入点为:无参无返回值
使用前置通知: <aop:before method="recordLog" pointcut-ref="pl"></aop:before>
切入点表达式为: <aop:pointcut id="pl" expression="execution(* cn.ybzy.service.impl.*.*(..))"/>
2.测试AOP接入点为:有参无返回值
使用前置通知: <aop:before method="recordLog" pointcut-ref="pl"></aop:before>
切入点表达式为: <aop:pointcut id="pl" expression="execution(* cn.ybzy.service.impl.*.*(int))"/>
3.测试AOP接入点为: 无参有返回值
使用前置通知: <aop:before method="recordLog" pointcut-ref="pl"></aop:before>
切入点表达式为: <aop:pointcut id="pl" expression="execution(int cn.ybzy.service.impl.*.*(..))"/>
三、配置前置、后置、异常、最终通知
1.修改通知类,添加前置、后置、异常、最终通知方法
public class WebLog {
/**
* 前置通知
*/
public void beforeLog(){
System.out.println("前置通知。。。");
}
/**
* 后置通知
*/
public void afterReturningLog(){
System.out.println("后置通知。。。");
}
/**
* 异常通知
*/
public void afterThrowingLog(){
System.out.println("异常通知。。。");
}
/**
* 最终通知
*/
public void afterLog(){
System.out.println("最终通知。。。");
}
}
2.修改AOP配置,添加前置、后置、异常、最终通知
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置包扫描-->
<bean id="userService" class="cn.ybzy.service.impl.UserServiceImpl"></bean>
<!-- 配置通知类 -->
<bean id="webLog" class="cn.ybzy.utils.WebLog"></bean>
<!--配置AOP-->
<aop:config>
<!--配置切入点表达式-->
<aop:pointcut id="pl" expression="execution(* cn.ybzy.service.impl.*.*(..))"/>
<!--配置切面 -->
<aop:aspect id="webLogAdvice" ref="webLog">
<!-- 配置前置通知,并建立通知方法和切入点方法的关联-->
<aop:before method="beforeLog" pointcut-ref="pl"></aop:before>
<!-- 配置后置通知,并建立通知方法和切入点方法的关联-->
<aop:after-returning method="afterReturningLog" pointcut-ref="pl"></aop:after-returning>
<!-- 配置异常通知,并建立通知方法和切入点方法的关联-->
<aop:after-throwing method="afterThrowingLog" pointcut-ref="pl"></aop:after-throwing>
<!-- 配置最终通知,并建立通知方法和切入点方法的关联-->
<aop:after method="afterLog" pointcut-ref="pl"></aop:after>
</aop:aspect>
</aop:config>
</beans>
3.执行测试
public class WebLogTest {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
IUserService as = (IUserService)ac.getBean("userService");
as.saveUser();
}
}
- 正常情况下,前置、后置、最终通知都执行
- 出现异常情况下,将只会执行前置、异常、最终通知。
2.出现异常情况下,将只会执行前置、异常、最终通知。
四、配置环绕通知
1.修改通知类,添加环绕通知方法
public class WebLog {
/**
* 环绕通知
* @param proceedingJoinPoint Spring提供的一个接口:ProceedingJoinPoint。该接口有一个方法proceed(),此方法相当于明确调用切入点方法。
*
* 该接口可以作为环绕通知的方法参数,spring中的环绕通知提供的是一种可以在代码中手动控制增强方法的方式。
* @return
*/
public Object aroundLog(ProceedingJoinPoint proceedingJoinPoint){
Object returnValue = null;
try{
//获取方法执行所需的参数
Object[] args = proceedingJoinPoint.getArgs();
System.out.println("前置通知。。。");
//调用切入点方法
returnValue = proceedingJoinPoint.proceed(args);
System.out.println("后置通知。。。");
return returnValue;
}catch (Throwable t){
System.out.println("异常通知。。。");
throw new RuntimeException(t);
}finally {
System.out.println("最终通知。。。");
}
}
}
2.修改AOP配置,使用环绕通知
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置包扫描-->
<bean id="userService" class="cn.ybzy.service.impl.UserServiceImpl"></bean>
<!-- 配置通知类 -->
<bean id="webLog" class="cn.ybzy.utils.WebLog"></bean>
<!--配置AOP-->
<aop:config>
<!--配置切入点表达式-->
<aop:pointcut id="pl" expression="execution(* cn.ybzy.service.impl.*.*(..))"/>
<!--配置切面 -->
<aop:aspect id="webLogAdvice" ref="webLog">
<!-- 配置环绕通知,并建立通知方法和切入点方法的关联-->
<aop:around method="aroundLog" pointcut-ref="pl"></aop:around>
</aop:aspect>
</aop:config>
</beans>
3.执行测试
public class WebLogTest {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
IUserService as = (IUserService)ac.getBean("userService");
as.saveUser();
}
}
- 正常情况下,前置、后置、最终通知都执行
2.出现异常情况下,将只会执行前置、异常、最终通知。
原文:Spring之基于XML配置AOP_丨Jack_Chen丨的博客-CSDN博客_spring xml配置aop
作者 : 丨Jack_Chen丨