浅谈AOP

1、什么是AOP

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

AOP是一直编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。

img

从图中可以看出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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值