spring 入门实战(五) aop基于注解的使用

10 篇文章 0 订阅

1.0 开发环境

同上一篇文章 Spring 入门实战(四) aop

2.0 准备工作

由于本篇还是基于aop的 所以我们还是基于上节的代码 做一些相应改动即可

2.1 主业务模块 Affairs.java 同上一篇文章
2.2 切面功能类 Function.java
package com.ccut.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class Function {
        private String fmessage;
        private String mmessage;
        public Function(){}
        public String getFmessage() {
            return fmessage;
        }
        public void setFmessage(String fmessage) {
            this.fmessage = fmessage;
        }
        public String getMmessage() {
            return mmessage;
        }
        public void setMmessage(String mmessage) {
            this.mmessage = mmessage;
        }
        @Pointcut("execution(* com.ccut.aop.Affairs.PersonA())")
        public void cut2(){};
        //before增强
        @Before(value="cut2()")
        public void f(){
            System.out.println(this.getFmessage());
        }
        //环绕增强
        @Around(value="cut2()")
        public void around(ProceedingJoinPoint pj){
            System.out.println("在目标函数之前执行");
            try {
                pj.proceed();
            } catch (Throwable e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                System.out.println("在目标函数之后执行");
            }
        }
        //after增强
        @After(value="cut2()")
        public void m(){
            System.out.println(this.getMmessage());
        }
        //返回增强
        @AfterReturning(pointcut="execution(* com.ccut..*(..))",returning = "msg")
        public void mess(String msg){
            System.out.println(msg+"  这是返回后的信息");
        }
        //异常增强
        @AfterThrowing(value="cut2()",throwing="ex")
        public void err(Throwable ex){
            System.out.println("这个错误是:"+ex);
        }

}
2.3 测试类Test.java
package com.ccut.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.ccut.aop.Affairs;

public class Test {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("./resources/aop.xml");
        Affairs affairs = (Affairs) applicationContext.getBean("affairs");
        affairs.PersonA();
        affairs.PersonB();

        affairs.getMessage1();
        affairs.error();

    }
}
2.4 配置文件 aop.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">


    <aop:aspectj-autoproxy/>

    <bean id="affairs" class = "com.ccut.aop.Affairs">
        <property name="message1" value="我就是 A 啊  这有什么疑问吗?"/>
        <property name="message2" value="我就是 B 啊  这有什么疑问吗?"/>
    </bean>

    <bean id = "function" class="com.ccut.aop.Function">
        <property name="fmessage" value="我可能在你前面执行!"></property>
        <property name="mmessage" value="我可能在你后面执行呢!"></property>
    </bean>



    </beans>

3.0 工程目录

这里写图片描述

4.0 执行结果

这里写图片描述

几点说明

  1. @Aspect 代表这个类是切片类
  2. @Pointcut(“execution(* com.ccut.aop.Affairs.PersonA())”)
    public void cut2(){}; 定义切入点为 com.ccut.aop.Affairs.下的PersonA() 方法 切入点的名字叫做cut2,相当于xml中的id

  3. @Before(value=”cut2()”) value的值指向切入点id

  4. @AfterReturning(pointcut=”execution(* com.ccut..*(..))”,returning = “msg”) 除了用value外还可以自定义切入点
  5. 配置文件中 < aop:aspectj-autoproxy/>代表启用aop注释 这样就不需要在xml配置文件中写代码了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值