AOP开发中的一个坑
1. 问题描述
在同一个业务类中,业务方法间进行调用,如方法a调用了方法b,两个方法都增加了额外功能,但是最后在实际调用过程中只有a方法的额外功能实现了,b没有实现。
public void a() {
b();
}
public void b() {
...
}
2. 解决方案
实现ApplicationContextAware接口重写setApplicationContext()
方法,将ApplicationContext作为成员变量在setApplicationContext()
方法中进行赋值,在调用中使用ApplicationContext对象获取代理对象执行方法。
注意: 不要在方法中创建ApplicationContext对象,因为这个对象代表了Spring工厂,占用资源多,一个程序中应该只存在一个。
代码:
import com.jc.aspect.UserService;
import com.jc.bean.User;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class UserServiceImpl implements UserService, ApplicationContextAware {
private ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.ctx = applicationContext;
}
@Override
public boolean login(String username, String password) {
System.out.println("UserServiceImpl.login");
// register(new User());
UserService userService = (UserService) ctx.getBean("UserService");
userService.register(new User());
return true;
}
@Override
public void register(User user) {
System.out.println("UserServiceImpl.register");
}
}