美文网首页
Spring - AOP

Spring - AOP

作者: 阿敏MIN | 来源:发表于2018-09-28 23:08 被阅读7次

AOP(Aspect oriented Programming)

一、AOP是什么?

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

image.png

举例子把:说原理很难理解,

吃饭:谁都得吃饭,一个老师类,有吃饭的方法。一个学生类,也得有吃饭的方法。是不是都得实现这个方法?构建一个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

相关文章

网友评论

      本文标题:Spring - AOP

      本文链接:https://www.haomeiwen.com/subject/texpnftx.html