AopContext.currentProxy()作用

原来在springAOP的用法中,只有代理的类才会被切入,我们在controller层调用service的方法的时候,是可以被切入的,但是如果我们在service层 A方法中,调用B方法,切点切的是B方法,那么这时候是不会切入的,解决办法就是如上所示,在A方法中使用((Service)AopContext.currentProxy()).B() 来调用B方法,这样一来,就能切入了,其实若依中也用到了这一点,这里就不在展开说明了:

AopContext.currentProxy()该用法的意义

具体的用法在下面的代码中可以体会:

/**
 * 程序注解配置
 */
@Configuration
// 指定要扫描的Mapper类的包的路径
@ComponentScan("com.dalianpai.spring5.aop")
// 表示通过aop框架暴露该代理对象,然后AopContext能够访问
@EnableAspectJAutoProxy(exposeProxy = true)
public class SpringConfiguration {
}

public class User implements Serializable {
    private String id;
    private String username;
    private String password;
    private String email;
    private Date birthday;
    private String gender;
    private String mobile;
    private String nickname;
 
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    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;
    }
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 
    public Date getBirthday() {
        return birthday;
    }
 
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
 
    public String getGender() {
        return gender;
    }
 
    public void setGender(String gender) {
        this.gender = gender;
    }
 
    public String getMobile() {
        return mobile;
    }
 
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
 
    public String getNickname() {
        return nickname;
    }
 
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
}

@Service("userService")
public class UserServiceImpl implements UserService {
 
    @Override
    public void saveUser(User user) {
        System.out.println("执行了保存用户"+user);
    }
 
    @Override
    public void saveAllUser(List<User> users) {
        for(User user : users){
	        // 在此处使用
            UserService proxyUserServiceImpl = (UserService)AopContext.currentProxy();
            proxyUserServiceImpl.saveUser(user);
        }
    }
}
 
 
public interface UserService {
 
    /**
     * 模拟保存用户
     * @param user
     */
    void saveUser(User user);
 
    /**
     * 批量保存用户
     * @param users
     */
    void saveAllUser(List<User> users);
}
 
 
@Component
@Aspect//表明当前类是一个切面类
public class LogUtil {
 
    /**
     * 用于配置当前方法是一个前置通知
     */
    @Before("execution(* com.dalianpai.spring5.aop.service.impl.*.saveUser(..))")
    public void printLog(){
        System.out.println("执行打印日志的功能");
    }
}

测试类:

public class SpringEnableAspecctJAutoProxyTest {
 
    public static void main(String[] args) {
        //1.创建容器
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        //2.获取对象
        UserService userService = ac.getBean("userService",UserService.class);
        //3.执行方法
        User user = new User();
        user.setId("1");
        user.setUsername("test");
        List<User> users = new ArrayList<>();
        users.add(user);
 
        userService.saveAllUser(users);
    }
}

在这里插入图片描述

如果去掉这行UserService proxyUserServiceImpl = (UserService)AopContext.currentProxy();

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值