坑:在同⼀个业务类中,进⾏业务⽅法间的相互调⽤,只有最外层的⽅法,才是加⼊了额外
功能的(内部的⽅法,通过普通的⽅式调⽤,都调⽤的是原始⽅法)。如果想让内层的⽅法也
调⽤代理对象的⽅法,就要实现AppicationContextAware接口中的setApplicationContext方法获得⼯⼚,进⽽获得代理对象。
public class UserServiceImpl implements UserService,ApplicationContextAware {
private ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.ctx = applicationContext;
}
@Override
public void register(User user) {
System.out.println("UserServiceImpl.register 业务运算 + DAO ");
//this.login();调⽤的是原始对象的login⽅法---> 只有核⼼功能没有额外
/*
设计⽬的:代理对象的login⽅法 ---> 实现额外功能+核⼼功能
ApplicationContext ctx= newClassPathXmlApplicationContext("/applicationContext2.xml");
UserService userService = (UserService)ctx.getBean("userService");
userService.login();
Spring⼯⼚重量级资源 ⼀个应⽤中 应该只创建⼀个⼯⼚ 所以上述创建工厂的代码只在main函数中。
因此需要在这里通过实现ApplicationContextAware接口获得工厂对象,再通过原始对象的id值获得动态代理对象userService,用代理对象在方法中调用的本类的内部方法才是加了额外功能的方法。
*/
UserService userService = (UserService)ctx.getBean("userService");
userService.login("suns","111");
}
public void login(String name,String password){
System.out.println("UserServiceImpl.login");
}