平时我们使用springboot注入的类,默认是单例的。
所以需要在注入的时候声明是原型模式(prototype)
@Component
@Scope("prototype")
public class User1 {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
但是当使用时,使用了@Autowired注解来获取spring管理的对象 ,每次请求获取的一直是同一个对象。
例子:
@RestController
@RequestMapping("test")
public class TestController {
@Autowired
private User1 user1;
private static int num=0;
@GetMapping("scope1")
public void testScope1(){
System.out.println("num:"+ ++num +"次请求,"+user1);
}
}
请求结果:
num:1次请求,com.y20.chuan.entity.User1@731171ae
num:2次请求,com.y20.chuan.entity.User1@731171ae
可以实现多例的方式很多,找一个比较简单的写法。
通过
@RestController
@RequestMapping("test")
public class TestController {
private static int num=0;
@Autowired
private ApplicationContext context;
@GetMapping("scope2")
public void testScope2(){
System.out.println("num:"+ ++num +"次请求,"+ context.getBean("user1"));
}
}
请求结果:
num:3次请求,com.y20.chuan.entity.User1@5d2d59a6
num:4次请求,com.y20.chuan.entity.User1@142300bb
解决使用@Autowired导致多例无效的问题。