03第三章Spring Aop(aop术语、aop注解)

一、AOP的基本概念和术语

1.AOP的概述

AOP(Aspect Orient Programming) 面向切面编程,是通过预编译方式和运行期间动态代理实现程序功能的同一维护的一种技术。
通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP已经成为一种非常常用的解决方案。

2.AOP的术语解释

(1)Aspect切面:相当于一个java普通类,用来当工具类,如日志、权限、事务的切面(工具类)。被之所以被AOP容器识别为切面,是要在 配置中指定的。

(2)Join Point连接点:连接点是在程序运行中 能被 切片 插入的 目标地点(spring中仅支持 方法级别的连接点)

(3)Advice通知 : 既增强,是切面的具体实现。含有 -前置、后置、异常、环绕、最终 -5种通知 实际应用中为切面类的一个方法。

(4)Pointcut切入点:用于定义 通知切面 切入到 哪些连接点上。(由切入点的正则表达式完成)

(5)Target目标对象:即将切入 切面或被通知 的对象 。

(6)Proxy代理对象:通知 作用于目标类后 被动态创建的 新对象, 该对象含有 本身 类的方法 和 通知增强 的方法。

(7)Weaving织入:将切面 应用到 目标对象后 创建的 一个 新的 代理对象 的过程。(这个过程发生在编译器、类装载期和运行期)

3.通知即增强类型的介绍

(1)前置通知:连接点被调用前执行的通知(连接点可以理解为实现类中的一个方法 通知可理解为切面类中的一个方法)

(2)后置通知:连接点 成功执行后 的通知 ,不成功 不会执行 通知

(3)环绕通知:包围 连接点的 通知 ,执行连接点前 先执行环绕前自定义的方法(通知), 执行连接点后 执行环绕后的 自定义方法(通知)

(4)异常通知:连接点的方法出现 异常后 执行的 通知

(5)最终通知:不管连接点的方法成功不成功 都会执行 的通知

二、基本XML配置的AOP开发

在这里插入图片描述

//接口 目标类   需要实现接口
public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void select();
}
//目标类的实现类
public class UserServiceImp implements UserService{
    @Override
    public void add() {
        System.out.println("添加一个用户");
    }

    @Override
    public void delete() {
        System.out.println("删除一个用户");
    }

    @Override
    public void update() {
        System.out.println("修改一个用户");
    }

    @Override
    public void select() {
        System.out.println("查询了一个用户");
    }
}
//定义 通知类
//java.class
public class Diy {
    public void before(){
        System.out.println("执行前!!!");
    }

    public void after(){
        System.out.println("执行后!!!");
    }
}
<!-- spring-xml --> 
<!-- 配置目标对象的容器 -->
<bean id="userService" class="com.xqh.service.UserServiceImp"/>

<!-- (申明一个/配置)通知对象    *通知是切面的具体实现! -->
<bean id="diy" class="com.xqh.log.Diy"/>

    <aop:config><!-- aop织入··············· -->
        
<!--        定义一个切入点 指定切入的位置  切入点正则表达式指明路径 
			expression="*(修饰词) *(返回值) *(类名) *(方法名) *(参数))  (..)代表任意参数,*为通配符" -->
        <aop:pointcut id="pointcut" expression="execution(* com.xqh.service.*.*(..))"/>
        
        
<!--  aspect创建配置切面   ref引入通知对象    使用before前置通知属性和after后置通知属性  method调用通知类中的方法!  -->
        <aop:aspect ref="diy">
            <aop:before method="before" pointcut-ref="pointcut"/> <!-- pointcut-ref 引入切点 指明目标路径 -->
            <aop:after method="after"   pointcut-ref="pointcut"/>
        </aop:aspect>
        
        
    </aop:config>
//测试类
@Test
public void test02(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) app.getBean("userService");
        userService.add();
    }

在这里插入图片描述

三、基于注解的AOP开发

<!-- spring-xml -->
<!-- 1.开启扫描包  2.开启AOP注解-->
    <context:component-scan base-package="com.xqh.*"></context:component-scan>
    <aop:aspectj-autoproxy/>
/*继续使用上文的目标类,
新建一个他通知类,在通知类中使用注解 
!!!
*/
@Component//注解创建容器
@Aspect//注解识别 切面 通知 类
public class DiyAnnotation {
    @Before("execution(* com.xqh.service.*.*(..))")//配置 前置通知 和 切入点的目标路径
    public void before(){
        System.out.println("注解执行前");
    }

    @After("execution(* com.xqh.service.*.*(..))")//配置 后置通知 和 切入点的目标路径
    public void after(){
        System.out.println("注解执行后");
    }
}
//测试类相同
@Test
public void test02(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) app.getBean("userService");
        userService.add();
    }

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值