1、什么是AOP
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP是一直编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。
从图中可以看出AOP关注的是怎样将横向程序中的共同部分竖向切取出来,然后进行模块化。
2、 为什么需要 AOP
想象下面的场景,开发中在多个模块间有某段重复的代码,我们通常是怎么处理的?显然,没有人会靠“复制粘贴”吧。在传统的面向过程编程中,我们也会将这段代码,抽象成一个方法,然后在需要的地方分别调用这个方法,这样当这段代码需要修改时,我们只需要改变这个方法就可以了。
然而需求总是变化的,有一天,新增了一个需求,需要再多出做修改,我们需要再抽象出一个方法,然后再在需要的地方分别调用这个方法,又或者我们不需要这个方法了,我们还是得删除掉每一处调用该方法的地方,这些我们都得去源代码中改,显然这样频繁动源码是不好的。
AOP 要达到的效果是,保证开发者不修改源代码的前提下,去为系统中的业务组件添加某种通用功能。
3、AOP 术语
AOP 领域中的特性术语:
- 通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理。
- 连接点(join point): 连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,连接点总是方法的调用。
- 切点(PointCut): 可以插入增强处理的连接点。
- 切面(Aspect): 切面是通知和切点的结合。
- 引入(Introduction):引入允许我们向现有的类添加新的方法或者属性。
- 织入(Weaving): 将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。
advise(增强):
- Before :前置通知
- After :后置通知
- Around :环绕通知
- AfterReturning :可以获取织入函数的返回值
- Excetpion:异常通知
4、AOP初体验
未使用AOP
在使用AOP之前先看下原来的查询效果(一个SSM框架的普通的全查询)
@Service
@Transactional
public class PublisherServiceImpl implements IPublisherService {
@Autowired
private IPublisherMapper mapper;
@Override
public List<Publisher> findAll() {
return mapper.findAll();
}
}
测试:
@ContextConfiguration(locations = "classpath:spring/mybatis/spring-mybatis.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class ServiceTest {
@Autowired
private IPublisherService ips;
@Test
public void test() {
System.out.println(ips.findAll());
}
}
结果:
使用AOP
①在maven中引入依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
②在mybatis的xml文件中开启AOP
<aop:aspectj-autoproxy proxy-target-class="true"/>
③编写AOP类
@Aspect
@Service
public class AopTest {
@Around("execution(* com.dyit.ssm.service.impl.*.*(..))")
public Object testAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("前");
Object retVal = pjp.proceed();
System.out.println("后");
return retVal;
}
}
- @Aspect:作用是把当前类标识为一个切面供容器读取
- @Service:是将此类标识,让spring管理这个类
- @Around:标注增强处理类(切面类)
- execution表达式:基本语法格式为:execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)除了返回类型模式,方法名模式和参数模式外,其它项都是可选的。
可以清除的看到我们在没有改变任何源代码的情况下,对目标方法进行了增强,这就是AOP的强大之处,可以在不动源代码的情况下改变程序流向(查询结果在最后是打印问题)
参考:https://www.cnblogs.com/joy99/p/10941543.html