问题描述:在同一个业务类中,进行业务方法之间的相互调用,只有最外层方法是加入额外功能的,(内部的方法,通过普通方式调用,都调用的是原始方法)。如果想让内层方法也调用代理对象的方法,就要通过ApplicationContextAware获得工厂,进而获得代理对象。
public class UserServiceImpl implements UserService , ApplicationContextAware {private ApplicationContext ctx;@Overridepublic void register(User user) {System.out.println("UserServiceImpl.register");/** 注意:此处若使用 this.login()方法调用则调用的时原始方法(核心功能),而无法实现额外功能* 设计目的:代理对象的login()方法--------->核心功能+额外功能* 可以使用下面方法实现:ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext2.xml");UserService userService= (UserService) ctx.getBean("userService");userService.register(new User());* 但Spring工厂是重量级资源,一个应用程序只应创建一个Spring工厂* */UserService userService=(UserService) ctx.getBean("userService");userService.login("刘二","88888");}@Overridepublic boolean login(String name, String password) {System.out.println("UserServiceImpl.login");return true;}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.ctx=applicationContext;}}
