Spring的AOP的AOP的AOP的AOP的小笔记

一.Spring的AOP简介

AOP的作用及其优势

作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强
优势:减少重复代码,提高开发效率,并且便于维护

AOP的底层实现

AOP的底层是通过Spring提供的动态代理技术实现的,在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行 增强功能的介入,再去调用目标对象的方法,从而完成功能的增强。

AOP的动态代理技术

常用的动态代理技术:

  1. JDK代理:基于接口的动态代理技术
  2. cglib代理:基于父类的动态代理技术

AOP的相关术语

  • Target(目标对象):代理的目标对象
  • Proxy(代理):一个类被AOP增强后,就产生一个结果代理类
  • Joinpoint(连接点):指被拦截到的点,spring中这些点指的是方法(可以被拦截的点)
  • Pointcut(切入点):指我们要对哪些Joinpoint进行拦截的定义(真正被拦截的点)
  • Adcice(通知/增强):指拦截到Joinpoint之后所要做的事情
  • Aspect(切面):切入点和通知(引介)的结合
  • Weaving(织入):把增强应用到目标对象来创建新的代理对象的过程。

AOP开发需要编写的内容

1.编写核心业务代码(目标类的目标方法)
2.编写切面类,切面类中有通知(增强功能方法)
3.在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合

AOP技术实现的内容

1.Spring框架监控切入点方法的执行
2.一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象
3.根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行

二.基于XML的AOP开发

1.导入AOP相关坐标

        <dependency>
            <groupId>aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.5.4</version>
        </dependency>

2.创建目标接口和目标类

public interface TargetInterface {
    public void save();
}
public class Target implements TargetInterface{
    public void save() {
        System.out.println("save running......");
    }
}

3.创建切面类(内部有增强方法)

public class MyAspect {
    public void before(){
        System.out.println("前置增强......");
    }
}

4.将目标类和切面类的对象创建权交给spring

<!--    目标对象-->
    <bean id="target" class="com.itzhuo.aop.Target"></bean>
<!--    切面对象-->
    <bean id="myAspect" class="com.itzhuo.aop.MyAspect"></bean>

5.在app.xml中配置织入关系

    <aop:config>
        <!--声明切面-->
        <aop:aspect ref="myAspect">
            <!--切面:切点+通知-->
            <aop:before method="before" pointcut="execution(public void com.itzhuo.aop.Target.save())"/>
            <!-- 上述语句意思:访问save方法时,save进行一个前置增强,前置增强的功能逻辑代码在myAspect内部的before方法中封装-->
        </aop:aspect>
    </aop:config>

6.测试代码

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AopTest {
    @Autowired
    private TargetInterface target;
    @Test
    public void test1(){
        target.save();
    }
}

XML配置AOP

1.切点表达式的写法

execution([修饰符] 返回值类型 包名.类名.方法名(参数)) 举例如下:
execution(public void com.itzhuo.aop.Target.save())

  • 访问修饰符可以省略
  • 返回值类型、包名、类名、方法名可以使用代表任意
  • 包名与类名之间一个点.代表当前包下的类,两个点…表示当前包下及其子包下的类
  • 参数列表可以使用两个点…表示任意个数,任意类型的参数列表**
2.通知的类型

通知的配置语法:<aop:通知类型method=“切面类中方法名” pointcut=“切点表达式”></aop:通知类型>
前置通知:aop:before 用于配置前置通知,指定增强的方法在切入点方法之前执行
后置通知:aop:after-returning 用于配置后置通知,指定增强的方法在切入点方法之后执行
环绕通知:aop:around 用于配置环绕通知,指定增强的方法在切入点方法之前和之后都执行
异常抛出通知:aop:throwing 用于配置异常抛出通知,指定增强的方法在出现异常时执行
最终通知:aop:after 用于配置最终通知,无论增强方式执行是否有异常都会执行

3.切点表达式的抽取
<aop:pointcut id="myPointcut" expression="execution(* com.itzhuo.aop.*.*(..))"/>
	//使用pointcut-ref属性代替pointcut属性来引用抽取后的切点表达式
            <aop:around method="around" pointcut-ref="myPointcut"/>
            <aop:after method="after" pointcut-ref="myPointcut"/>

三.基于注解的AOP开发

1.创建目标接口和目标类(内部有切点)

public interface TargetInterface {
    public void save();
}
@Component("target")
public class Target implements TargetInterface{
    public void save() {
//        int i=1/0;
        System.out.println("save running......");
    }
}

2.创建切面类(内部有增强方法)

@Component("myAspect")
@Aspect//标注当前MyAspect是一个切面类
public class MyAspect {
    //配置前置通知
    @Before(value="execution(* com.itzhuo.anno.*.*(..))")
    public void before(){
        System.out.println("前置增强......");
    }
    
}

3.将目标类和切面类的对象创建权交给spring

//见上图
@Component("myAspect")
//见上图
@Component("target")

4.在切面类中使用注解配置织入关系

@Aspect//标注当前MyAspect是一个切面类,见上图
//配置前置通知,见上图
@Before(value="execution(* com.itzhuo.anno.*.*(..))")

5.在配置文件中开启组件扫描和AOP的自动代理

<!--    组件扫描-->
    <context:component-scan base-package="com.itzhuo.anno"/>
<!--    aop组东代理-->
    <aop:aspectj-autoproxy/>

6.测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-anno.xml")
public class AnnoTest {
   @Autowired
   private TargetInterface target;
   @Test
   public void test1(){
       target.save();
   }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值