AOP(Aspect oriented Programming)
一、AOP是什么?
面向切面编程(对方法功能的扩展不通过修改源码实现,而是在程序运行时动态的植入要增强的功能)https://blog.csdn.net/xjbclz/article/details/52662961
AOP,一个oop的后传,面向切面,一个基于代理模式的机制。

举例子把:说原理很难理解,
吃饭:谁都得吃饭,一个老师类,有吃饭的方法。一个学生类,也得有吃饭的方法。是不是都得实现这个方法?构建一个person类?通过学生老师继承实现这个方法。但是从面向对象的角度来讲,代码应该高内聚低耦合,如果大量的继承方式实现,那就违背了这个思想。
所以通过aop思想实现,其中最具有代表性就是代理模式,通过一个工厂,专门实现吃饭。
有这么一句说法,面向对象是二维空间,而加上了aop,那么就是通过切面角度,增加到三维空间,那么对待一个程序更具有直观性。归根揭底,就是保持高内聚低耦合的业务思想,提高代码的重用性,实现高效率的代码。
AOP几个相关概念
- 连接点(joinpoint):类中所有可能增强功能的方法称为连接点;
- 切入点(pointcut):实际增强的方法称为切入点;
- 增强|通知(advice):扩展的功能称为增强;前置增强后置增强最终增强异常增强
- 切面(aspect):将增强植入到切入点的过程称为切面(切入点+增强)
二、AOP何时用?
扩展功能:
1. 直接修改源码
2. 做基类(继承)
3. AOP提供的是横向解决方案AOP实现的是核心业务与非核心业务分离,在需要时再动态植入进来(使用的是动态代理模式设计技术)
三、AOP怎么用?
1.AOP原始实现过程
// 第一步:引入约束
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p”
Ixmlns:context="http://ww.springframework.org/schema/context"
xmlns:aop="http://ww.springframework.org/schema/aop"
xsi:schemaLocation="http://ww.springframework.org/schema/beans
http://ww.springframework.org/schema/beans/spring-beans.xsd
http://wmw.springframework.org/schema/context
http://www.springframework.org/schema/aop
http://wwaw.springframework.org/schema/aop/spring-aop.xsd
http://mw.springframework.org/schema/context/spring-context.xsd">
</beans>
// 第二步:注册bean
<!--注册bean-->
<bean id="empDao"class="cn.1anqiao.aop.EmpDao"/>
<bean id="logger"class="cn.lanqiao.aop.Loger"/>
// 第三步:配制AOP
<!--基于XL配制AOP-->
<aop:config>
<!--配制切面-->
<aop:aspect ref-"logger">
<!--切入点->
<!--
execution(*cn.lanqiao.aop.Loger.before(.…))
execution(**.Loger.before(.))
execution(**.”.before(…))
execution(***.*(…))
-->
<aop:pointcut expression="execution(cn.lanqiao.a0p.EmpDao.add(.…))" id="pc1"/>
<!--增强-->
<aop:before method="before" pointcut-ref="pc1"/>
<aop:config>
<!--配制切面-->
<aop:aspect ref="logger">
<!--切入点-->
<aop:pointcut expression="execution(*cn.1anqlao.aop.EmpDao.*(.…))"id="pc1"/>
<!--前置增强-->
<aop:before method="before" pointcut-ref="pc1"/>
<!--后置增强-->
<aop:after-returning method="afterReturning"pointcut-ref="pc1"/>
<!--最终增强-->
<aop:after method="after" pointcut-ref="pc1"/>
<!--环绕增强-->
<aop:around method="around" pointcut-ref="pc1"/>
</aop:aspect>
</aop:config>
2.基于注解实现AOP(实际开发使用)
// 第一步:引入约束(beanlcontextlaop)
<beans xmlns="http://ww.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://ww.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemalocation="http://wnw.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/aop
http://wmww.springframework.org/schema/aop/spring-aop.xsd
http://ww.springframework.org/schema/context/spring-context.xsd">
</beans>
// 第二步:开启组件扫描
<!--开启ioc的注解扫描-->
<context:component-scan base-package="cn.1anqiao.aop.anno"/>
// 第三步:启动aop自动代理
<!--开启aspectj自动代理-->
<aop:aspectj-autoproxy/>
// 第四步:标识AOP注解
@ASpect
@Component
public class Loger{
@Pointcut(value="execution(*cn.lanqiao.aop.anno.EmpDao.add(..))")
public void pointcut(){}
//@Before(value="execution(*cn.lanqiao.aop.anno.EmpDao.add(..))")
@Before(value="pointcut()")
public void before(){
System.out.println("前增强");
}
//@AfterReturning(value="execution(*cn.1anqiao.aop.anno.EmpDao.add(.…))")
@AfterReturning(value="pointcut()")
public void afterReturning(){
System.out.println("后置增强");
}
//@After(value="execution(*cn.lanqiao.aop.anno.EmpDao.add(..))")
@After(value="pointcut()")
public void after(){
System.out.println("最终增强");
}
//@Around(value="execution(*cn.lanqiao.aop.anno.EmpDao.add(..))")
@Around(value="pointcut()")
public void around(ProceedingJoingoint pjp){
this.before();
}
//调用:add
try{
pjp.proceed();
}catch(Throwablee){
this.afterReturning();
}
}
四、总结(AOP相关注解)
- @Aspect
- @Pointcut
- @Before
- @AfterReturning
- @After
- @Around
- @AfterThrowing
网友评论