问题描述:在同一个业务类中,进行业务方法之间的相互调用,只有最外层方法是加入额外功能的,(内部的方法,通过普通方式调用,都调用的是原始方法)。如果想让内层方法也调用代理对象的方法,就要通过ApplicationContextAware获得工厂,进而获得代理对象。

    1. public class UserServiceImpl implements UserService , ApplicationContextAware {
    2. private ApplicationContext ctx;
    3. @Override
    4. public void register(User user) {
    5. System.out.println("UserServiceImpl.register");
    6. /*
    7. * 注意:此处若使用 this.login()方法调用则调用的时原始方法(核心功能),而无法实现额外功能
    8. * 设计目的:代理对象的login()方法--------->核心功能+额外功能
    9. * 可以使用下面方法实现:
    10. ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext2.xml");
    11. UserService userService= (UserService) ctx.getBean("userService");
    12. userService.register(new User());
    13. * 但Spring工厂是重量级资源,一个应用程序只应创建一个Spring工厂
    14. * */
    15. UserService userService=(UserService) ctx.getBean("userService");
    16. userService.login("刘二","88888");
    17. }
    18. @Override
    19. public boolean login(String name, String password) {
    20. System.out.println("UserServiceImpl.login");
    21. return true;
    22. }
    23. @Override
    24. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    25. this.ctx=applicationContext;
    26. }
    27. }