Spring--2

时间:2024-10-23 08:01:35

AOP

概念:面向切面编程,对业务逻辑与非业务逻辑进行隔离,从而降低耦合,提高程序的可重用性。

好处:减少重复,专注业务。

原理:使用动态代理在执行方法前后或出现异常时加入相关逻辑。

术语解释:

连接点:可增强的方法

切入点:实际被增强的方法

通知:增强的功能

切面:通知加入切入点的过程

目标:切入点所在的类

代理:应用通知时创建的代理对象

AspectJ

AOP框架,支持注解开发,简单方便快捷,

Java实现方式

XML

1.导入依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

2.将通知抽取出来

3.配置通知与切入点的关系

<!--配置aop-->
    <bean id="CommonUtil" class="com.ffyc.spring.util.CommonUtil"></bean>
    <aop:config>
        <!--配置切入点-->
<!--
    execution是表达式的主体
    第一个*是返回的类型*代表所有类型
    .就是包下的层级关系
    .后面可以跟*表示该包下的
    方法也可用*号代替,表示所有的方法
    方法括号中为参数 ..表示任意参数
-->
        <aop:pointcut id="insertAdmin" expression="execution(* com.ffyc.spring.dao.AdminDao.insertAdmin(..))"/>
        <aop:aspect ref="CommonUtil">
        <!--前置通知,在方法执行前被调用-->
        <!--<aop:before method="saveLog" pointcut-ref="allMethod"/>-->
        <!--后置通知,在方法执行完成后被调用 在后置通知前方法出现异常就不再调用-->
        <!--<aop:after-returning method="saveLog" pointcut-ref="allMethod"></aop:after-returning>-->
        <!--最终通知 无论方法是否出现异常都会在最终调用-->
        <!--<aop:after method="saveLog" pointcut-ref="allMethod"></aop:after>-->
        <!--异常通知 只有出现异常才会调用-->
        <!--<aop:after-throwing method="saveLog" pointcut-ref="allMethod" throwing="e"></aop:after-throwing>-->
        <!--<aop:after-throwing method="saveLog" pointcut-ref="allMethod"></aop:after-throwing>-->
        <!--环绕通知-->
        <aop:around method="saveLog" pointcut-ref="insertAdmin"></aop:around>
        </aop:aspect>
    </aop:config>

注解

1.导入依赖

2.开启自动代理

       <!--开启自动代理-->
       <aop:aspectj-autoproxy />

3.注解

    //@Before("execution(* com.ffyc.spring.dao.AdminDao.insertAdmin(..))")
    //@After("execution(* com.ffyc.spring.dao.AdminDao.insertAdmin(..))")
    //@AfterReturning("execution(* com.ffyc.spring.dao.AdminDao.insertAdmin(..))")
    //@AfterThrowing(value = "execution(* com.ffyc.spring.dao.AdminDao.insertAdmin(..))",throwing = "e")
    @Around(value = "execution(* com.ffyc.spring.dao.AdminDao.insertAdmin(..))")
    public void saveLog(Throwable e){
        System.out.println("保存时间"+new Date()+"异常信息:"+e.getMessage());
    }

aop:就是使用代理对象方式将非业务代码抽取出来,通过代理对象来进行调用,这样就可以将业务代码与非业务代码隔离开,降低代码的耦合度。

在不修改业务代码的前提下,添加功能

相关文章