场景说明:
定义两个类:UserService.class 和 OrderService.class
其中UserService是默认单例,OrderService为多例
在UserService中注入OrderService,并创建方法test()来打印OrderService.class的实例对象,观察结果:
1.OrderService.class:
@Component
@Scope("prototype")
public class OrderService {
}
2.UserService.class
@Component
public class UserService {
@Autowired
private OrderService orderService;
public void test(){
System.out.println(orderService);
}
}
3.spring调试主程序:
public static void main(String[] args) {
// 创建一个Spring容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = (UserService) applicationContext.getBean("userService");
userService.test();
userService.test();
userService.test();
}
调试结果:
com.zhouyu.service.OrderService@2471cca7
com.zhouyu.service.OrderService@2471cca7
com.zhouyu.service.OrderService@2471cca7
你会发现,这三次test打印出的对象是同一个,OrderService.class的@Scope(“prototype”)注解没起作用,这是因为UserService.class 的实例对象是一个单例bean,一个单例bean在@Autowired时,只会注入一次。
但是,如果在UserService.class中加入@Lookup注解,就可以实现多次注入
将上面的UserService.class修改为:
@Component
public class UserService {
@Autowired
private OrderService orderService;
public void test(){
System.out.println(a());
}
@Lookup("orderService")
public OrderService a(){
// 这个返回值没有实际作用,起作用的其实是@Lookup的配置
return null;
}
}
此时的调试结果
com.zhouyu.service.OrderService@3a03464
com.zhouyu.service.OrderService@2d3fcdbd
com.zhouyu.service.OrderService@617c74e5
通过@Lookup实现了单例bean的多次注入