Spring框架——AOP注解方式

目录

Spring框架的AOP技术(注解方式)

通知类型


Spring框架的AOP技术(注解方式)

复制代码
1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包
    * 先引入Spring框架开发的基本开发包
        com.springsource.org.apache.commons.logging-1.1.1.jar
        com.springsource.org.apache.log4j-1.2.15.jar
        spring-beans-5.0.2.RELEASE.jar
        spring-context-5.0.2.RELEASE.jar
        spring-core-5.0.2.RELEASE.jar
        spring-expression-5.0.2.RELEASE.jar
    * 再引入Spring框架的AOP的开发包
        * spring的传统AOP的开发的包
            * spring-aop-5.0.2.RELEASE.jar
            * com.springsource.org.aopalliance-1.0.0.jar
        
        * aspectJ的开发包
            * com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
            * spring-aspects-5.0.2.RELEASE.jar
            
    *如果是Maven项目,就引入下面的jar包坐标即可
      <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.8.7</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
复制代码
2. 步骤二:创建Spring的配置文件,引入具体的AOP的schema约束
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           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">
            
    </beans>
复制代码
​
​
3. 步骤三:创建包结构,编写具体的接口和实现类
    * org.westos.demo1
        * CustomerDao           -- 接口
        * CustomerDaoImpl       -- 实现类
​
4. 步骤四:将目标类配置到Spring中
    <bean id="customerDao" class="org.westos.demo1.CustomerDaoImpl"/>
​
5. 步骤五:定义切面类
    * 添加切面和通知的注解
        * @Aspect -- 定义切面类的注解
        
        * 通知类型(注解的参数是切入点的表达式)
            * @Before           -- 前置通知
            * @AfterReturing        -- 后置通知
            * @Around           -- 环绕通知
            * @After            -- 最终通知
            * @AfterThrowing        -- 异常抛出通知
    
    * 具体的代码如下
        @Aspect
        public class MyAspectAnno {
            @Before(value="execution(public void org.westos.demo1.CustomerDaoImpl.save())")
            public void log(){
                System.out.println("记录日志...");
            }
        }
​
6. 步骤六:在配置文件中定义切面类
    <bean id="myAspectAnno" class="org.westos.demo1.MyAspectAnno"/>
​
7. 步骤七:在配置文件中开启自动代理
    <aop:aspectj-autoproxy/> 放在最前面
​
8. 完成测试
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class Demo1 {
        
        @Resource(name="customerDao")
        private CustomerDao customerDao;
        
        @Test
        public void run1(){
            customerDao.save();
            customerDao.update();
        }
    }

通知类型

复制代码
1. 通知类型
    * @Before           -- 前置通知
    * @AfterReturing    -- 后置通知
    * @Around           -- 环绕通知(目标对象方法默认不执行的,需要手动执行)
    * @After            -- 最终通知
    * @AfterThrowing    -- 异常抛出通知
​
2. 配置通用的切入点
    * 使用@Pointcut定义通用的切入点
    
    @Aspect
    public class MyAspectAnno {
        //随便定义一个方法,上面用注解定义一个切入点
        @Pointcut(value="execution(public void org.westos.demo1.CustomerDaoImpl.save())")
        public void fn(){}
        
        //引用这个定义的切入点 格式:切面类名.方法名
        @Before(value="MyAspectAnno.fn()")
        public void log(){
            System.out.println("记录日志...");
        }
复制代码
        /**
         * 环绕通知
        */
        @Around(value="MyAspectAnno.fn()")
        public void around(ProceedingJoinPoint joinPoint){
            System.out.println("环绕通知1...");
        try {
            // 让目标对象的方法执行
            joinPoint.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
          }
            System.out.println("环绕通知2...");
        }
        
        }
相关推荐
没有bug.的程序员4 分钟前
JAVA面试宝典 -《 架构演进:从单体到 Service Mesh》
java·面试·架构
典学长编程19 分钟前
Java从入门到精通!第十一天(Java常见的数据结构)
java·开发语言·数据结构
皮皮林55135 分钟前
设计一个多租户 SaaS 系统,如何实现租户数据隔离与资源配额控制?
java·saas
霍格沃兹软件测试开发36 分钟前
Playwright 自动化测试系列(6)| 第三阶段:测试框架集成指南:参数化测试 + 多浏览器并行执行
java·数据库·mysql·自动化
追逐时光者38 分钟前
推荐 7 款开源、免费、美观的 .NET Blazor UI 组件库
后端·.net
叫我:松哥1 小时前
基于python django深度学习的中文文本检测+识别,可以前端上传图片和后台管理图片
图像处理·人工智能·后端·python·深度学习·数据挖掘·django
程序员岳焱1 小时前
从 0 到 1:Spring Boot 与 Spring AI 打造智能客服系统(基于DeepSeek)
人工智能·后端·deepseek
mldong1 小时前
GoFrame中间件注册竟然还能这样玩?团队开发效率提升200%!
后端·架构·go
Bonnie_12151 小时前
02-netty基础-java四种IO模型
java·开发语言·nio·jetty
我不是星海1 小时前
建造者设计模式
java·开发语言