基于注解的 AOP 配置

(一)环境搭建
1、导入依赖

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.9.1</version>
        </dependency>

2、在配置文件中导入 context 的名称空间

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
</beans>

3、把资源使用注解配置
4、在配置文件中指定 spring 要扫描的包

<!-- 告知 spring,在创建容器时要扫描的包 -->
<context:component-scan base-package="com.itheima"/>

(二)配置AOP
1、把通知类也使用注解配置

/**
* 事务控制类
*/
@Component("txManager")
public class TransactionManager {
    //定义一个 DBAssit
    @Autowired
    private DBAssit dbAssit ;
}

2、在通知类上使用@Aspect 注解声明为切面

@Component("txManager")
@Aspect//表明当前类是一个切面类
public class TransactionManager {
    //定义一个 DBAssit
    @Autowired
    private DBAssit dbAssit ;
}

3、在增强的方法上使用注解配置通知

@Before
    作用:
        把当前方法看成是前置通知。
    属性:
        value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@AfterReturning
    作用:
        把当前方法看成是后置通知。
    属性:
        value:用于指定切入点表达式,还可以指定切入点表达式的引用
@AfterThrowing
    作用:
        把当前方法看成是异常通知。
    属性:
        value:用于指定切入点表达式,还可以指定切入点表达式的引用
@After
    作用:
        把当前方法看成是最终通知。
    属性:
        value:用于指定切入点表达式,还可以指定切入点表达式的引用
@Around
    作用:
        把当前方法看成是环绕通知。
    属性:
        value:用于指定切入点表达式,还可以指定切入点表达式的引用。


//开启事务
@Before("execution(* com.itheima.service.impl.*.*(..))")
public void beginTransaction() {
    try {
        dbAssit.getCurrentConnection().setAutoCommit(false);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

4、在 spring 配置文件中开启 spring 对注解 AOP 的支持

<aop:aspectj-autoproxy/>

切入点表达式注解

@Pointcut
    作用:
        指定切入点表达式
    属性:
        value:指定表达式的内容
    @Pointcut("execution(* com.itheima.service.impl.*.*(..))")
    private void pt1() {}


引用方式:
/**
* 环绕通知
* @param pjp
* @return
*/
@Around("pt1()")//注意:千万别忘了写括号
public Object transactionAround(ProceedingJoinPoint pjp) {
    //定义返回值
    Object rtValue = null;
    try {
        //获取方法执行所需的参数
        Object[] args = pjp.getArgs();
        //前置通知:开启事务
        beginTransaction();
        //执行方法
        rtValue = pjp.proceed(args);
        //后置通知:提交事务
        commit();
    }catch(Throwable e) {
        //异常通知:回滚事务
        rollback();
        e.printStackTrace();
    }finally {
        //最终通知:释放资源
        release();
    }
    return rtValue;
}

不使用 XML 的配置方式

@Configuration
@ComponentScan(basePackages="com.itheima")
@EnableAspectJAutoProxy
public class SpringConfiguration {
}
posted @   max_yan  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示