简介
Spring bean 作用域默认是 单例 singleton;可以通过配置 prototype实现多例;
被注入到Spring中的类- Account.java
@Scope("singleton")
@Component
public class Account {
}
- User.java
@Scope("prototype")
@Component
public class User {
}
注:Scope的值,也可以使用下面的方式指定:
public class ScopeTest {
@Test
void fun() {
ApplicationContext act = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
Account account1 = (Account) act.getBean("account");
System.out.println(account1);
Account account2 = (Account) act.getBean("account");
System.out.println(account2);
User user1 = (User) act.getBean("user");
System.out.println(user1);
User user2 = (User) act.getBean("user");
System.out.println(user2);
}
}
结果
在需要多例调用的类上加@Scope("prototype")
在进行注入时,不能直接使用@Autowired
,否则注入的还是单例,需要使用工厂,最简单的是用
@Autowired
private ObjectFactory objectFactory;
对象进行注入(T为你要注入的类),想要使用该多例对象时,使用如下方法:
T t = objectFactory.getObject();
结论
- 单例情况下,容器创建时调用方法创建对象到容器中,在程序中调用bean,直接从容器中拿取,且每次拿取的都是同一个对象。如果上一次对bean里的属性做了修改,那下一次拿取的就是修改过的bean。
- 多例情况下,容器创建完成时不调用方法创建对象到容器中,在程序中获取时,才会将对象加载到容器中,而且每次调用生成的都是不同的对象。
- 不要在Spring管理的类中添加
状态
信息。