Spring-基于xml的AOP快速入门案例
问题引出
AOP:Aspect Oriented Programming,面向切面编程。是通过预编译方式(aspectj)或者运行期动态代理(Spring)实现程序功能的统一维护的技术。
在实际项目中,我们都会遇到对原有功能的迭代与增强,修改源码是一件很痛苦的事情,往往会牵一发而动全身。怎样做到在不修改源码的情况下对原有功能进行增强呢?aop思想就是在这种需求中产生的。
AOP作为Spring最大特征之一,它的
- 作用:不修改源码的情况下,进行功能增强,通过动态代理实现的
- 优势:减少重复代码,提高开发效率,方便维护
- 比如:给功能增加日志输出, 事务管理的功能
快速入门案例:
第一步:导入jar包依赖
<!--Spring上下文核心包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<!--AOP的实现包-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<!--Spring和单元测试集成-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
** 第二步:创建目标类和通知类
目标类(需要增强或者说需要切入的类):
public class UserService{
void save();
}
@Service("userervice")
public class UserServiceImpl {
public void save(){
System.out.println("UserServiceImpl.save......");
}
}
通知类
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
/**
* 注意:此类为通知类,切面的配置=通知类+切入点 两者组成
* 需要在xml文件中配置才能生效
*/
@Component("myAdvice")
public class MyAdvice {
//方法执行前调用
public void before(){
System.out.println("前置通知。。。");
}
//后置返回通知
public void afterReturning(){
System.out.println("后置返回通知");
}
//后置异常通知
public void afterThrowing(){
System.out.println("后置异常通知");
}
//后置通知,无论异常与否都会执行。
public void after(){
System.out.println("后置最终通知");
}
//环绕通知,此方法相当于前置通知和后置返回通知的整合,根据具体业务需求而定
public Object around(ProceedingJoinPoint pjp) throws Throwable {
//原有方法执行之前插入的增强代码,这里我们输入语句替代
System.out.println("环绕前置通知");
//原有方法的调用
Object proceed = pjp.proceed();
//原有方法执行之后插入的增强代码,这里我们输入语句替代
System.out.println("环绕后置通知");
return proceed;
}
}
第三步, 修改配置文件
- 把目标类和通知类都配置到Spring配置文件中
配置切入和通知方法(增强方法)的织入关系
<?xml version=”1.0” encoding=”UTF-8”?>
第四步:测试
import com.gg.service.UserService;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AopXmlTest {
@Test
public void xmlTest01(){
//加载核心配置文件
ClassPathXmlApplicationContext appConfig = new ClassPathXmlApplicationContext("classpath:appConfig.xml");
//获得指定bean对象
UserService userService = appConfig.getBean("userService", UserService.class);
//调用方法,判断是否切入成功
userService.save();
}
}
测试结果:
还没有评论,来说两句吧...