shmvc之aop

环境搭建

需要spring-aop,这里没有标明,需要可以看上一篇开发环境搭建里面有spring-aop相关的dependency
基于springframework的环境下,需要额外的jar包

<!-- aop -->
        <!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.9</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.9</version>
        </dependency>

在spring配置文件(xml)中添加

<!-- aop,aspectJ的支持 -->
<aop:aspectj-autoproxy />

建立测试代码

新建用于被代理的类和接口

接口

public interface IModel {

    /**
     * 默认方法
     */
    public abstract void doSome();

    /**
     * 有返回值的方法
     */
    public abstract String doSomeReturn();

    /**
     * 抛出异常的方法
     */
    public abstract void doSomeThrow() throws Exception;

    /**
     * 一个参数的方法
     */
    public void doSomeParm(String name);

    /**
     * 两个参数的方法
     */
    public void doSomeParm(String name, int age);
}

实现类

@Repository//交由spring管理
public class AopModel implements IModel {
    /*
     * (non-Javadoc)
     * 
     * @see springAop.model.IAspect#doSome()
     */
    public void doSome() {
        System.out.println("do something..");
    }

    /*
     * (non-Javadoc)
     * 
     * @see springAop.model.IAspect#doSomeReturn()
     */
    public String doSomeReturn() {
        System.out.println("do some and return");
        return "test";
    }

    /*
     * (non-Javadoc)
     * 
     * @see springAop.model.IAspect#doSomeThrow()
     */
    public void doSomeThrow() throws Exception {
        throw new Exception("something is wrong");
    }

    //
    public void doSomeParm(String name) {
        System.out.println("name : " + name);
    }

    //
    public void doSomeParm(String name, int age) {
        System.out.println("name : " + name + "," + age);
    }
}

切面类

@Aspect//表示这个是一个切面类
@Repository//交由spring管理
public class Aspectlogic {

    // 切入点(IModel的所有方法)
    /*
        匹配格式:public * *..IModel.*(..)
        public : 定义方法作用域
        第一个* : 表示返回值类型
        *..IModel.* : 匹配所有包下的IModel接口中的所有方法
        (..) : 方法的参数为任意个

    @PointCut : 定义一个切点,可以在其他通知中直接使用方法名代表切入点
    */
    @Pointcut("execution(public * *..IModel.*(..))")
    public void point() {
    }

    // 在切入点的方法执行前执行
    // JoinPoint 用来获取切入方法的名称参数等(可以省略)
    //比如: execute(){}
    @Before("point()")
    public void execute(JoinPoint point) {
        Object[] objs = point.getArgs();
        System.out.println(objs.length + "before-------");
        System.out.println("Before ............" + point);
    }

    // 筛选方法带参数的
    // value中的args的名字需要和argNames相同
    @Before(argNames = "name", value = "point() && args(name)")
    public void executeOneParm(String test) {
        System.out.println("before :" + test + ",");
    }

    // 筛选方法带参数的
    @Before(argNames = "name,age", value = "point() && args(name) && args(age)")
    public void executeParm(String name, int age) {
        System.out.println("before :" + name + "," + age);
    }

    // 返回后执行
    @AfterReturning(pointcut = "point()", returning = "result")
    public void executeReturn(String result) {
        System.out.println("after return " + result);
    }

    // 抛出异常后
    @AfterThrowing(pointcut = "point()", throwing = "e")
    public void executeThrow(Exception e) {
        System.out.println("after throws");
        System.out.println(e.getMessage());
    }

    // 声明环绕通知
    @Around("point()")
    public Object doAround(ProceedingJoinPoint pjp) {
        System.out.println("环绕方法执行");
        // 显示调用,确保被代理的方法被调用
        Object o = null;
        try {
            o = pjp.proceed();
        } catch (Throwable e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 如果不try,那么抛出异常后,后面的方法将不会继续执行
        System.out.println("环绕方法执行完毕");
        return o;
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "file:src/test/java/springAop/spring-root.xml")
public class SpringAopTest {
    private IModel aopModel;

    public IModel getAopModel() {
        return aopModel;
    }

    @Autowired
    @Qualifier("aopModel")
    public void setAopModel(IModel aopModel) {
        this.aopModel = aopModel;
    }

    @Test
    public void testDoSome() throws Exception {
        aopModel.doSomeParm("test");
    }
}

测试结果

测试结果

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值