SpringAOP:目标类如何向切面类中传参

来源:互联网 发布:利达消防报警主机编程 编辑:程序博客网 时间:2024/05/19 10:39

如何向一个切面类进行传参?
切面类

package com.xbz.learn.spring.aspect;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;import org.springframework.stereotype.Component;/** * 切面类 * @author xubaozhong *  */@Aspectpublic class FirstAspect {    @Pointcut("execution (* com.xbz.learn.spring.aspect.FirstAspectTarget.*(..))")    public void pointcut(){    }    @Before("execution (* com.xbz.learn.spring.aspect.FirstAspectTarget.doService(User))&&args(user)")    public void doBefore(User user){        System.out.println(user);        System.out.println("doBefore...modify parameter");        user.setUsername("Before");    }    @After("execution (* com.xbz.learn.spring.aspect.FirstAspectTarget.doService(User))&&args(user)")    public void doAfter(User user){        System.out.println("After-->"+user);        System.out.println("doAfter...modify parameter");        user.setUsername("After");    }    @AfterReturning("execution (* com.xbz.learn.spring.aspect.FirstAspectTarget.doService(User))&&args(user)")    public void doAfterReturning(User user){        System.out.println("AfterReturning-->"+user);        System.out.println("AfterReturning...modify parameter");        user.setUsername("AfterReturning");    }}

目标类

package com.xbz.learn.spring.aspect;import org.springframework.stereotype.Component;/** * 切面目标类,被拦截的目标类 * @author xubaozhong * */@Componentpublic class FirstAspectTarget {    /*public void doService(){        System.out.println("doService----处理业务逻辑");        throw new RuntimeException(new Exception("业务报错"));    }*/    public void doService(User user){        System.out.println(user);    }}

JavaConfig

package com.xbz.learn.spring.aspect;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration//@ComponentScan@EnableAspectJAutoProxypublic class FirstAspecJavaConfig {    @Bean    public FirstAspect getFirstAspect(){        return new FirstAspect();    }     @Bean    public FirstAspectTarget getFirstAspectTarget(){        return new FirstAspectTarget();    } }

Test类

package com.xbz.learn.spring.aspect;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes={FirstAspecJavaConfig.class})public class FirstAspectTest {    @Autowired    private FirstAspectTarget target;    @Test    public void testFirstAspect(){        User user = new User();        user.setUsername("");        target.doService(user);        System.out.println("finally-->"+user);    }}class User{    @Override    public String toString() {        return "User [username=" + username + ", password=" + password + "]";    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    private String username;    private String password;}
输出结果:User [username=, password=null]doBefore...modify parameterUser [username=Before, password=null]After-->User [username=Before, password=null]doAfter...modify parameterAfterReturning-->User [username=After, password=null]AfterReturning...modify parameterfinally-->User [username=AfterReturning, password=null]

可见Before | After | AfterReturning的顺序。
注意After无论方法是否成功执行,均会调用

0 0