bean scope 属性
bean scope 属性用于决定对象何时背创建与作用范围
bean scope 属性清单
其中最常用的就是 singleton 和 prototype
scope 属性
说明
singleton
单例(默认),每个容器内有且jinyou 唯一的实例, 被全局共享
prototype
duoli6,每次使用都创建一个实例
request
web 环境下,每一次独立请求存在唯一实例
session
web 环境下,每一个session存在唯一实例
application
web 环境下,ServletContext 存在唯一实例
websocket
每一次WebSocket 连接中存在唯一实例
singleton 和 prototype 举例使用
假设定义一个 UserService 对象, 其内部有一个 UserDao 对象。
public class UserDao {
public UserDao() {
System.out.println("UserDao 已创建 : "+ this);
}
}
public class UserService {
private UserDao userDao;
public UserService() {
System.out.println("UserService 已创建 : "+ this);
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
System.out.println("调用 setUerDao : "+ userDao);
this.userDao = userDao;
}
}
如果将 UserDao 的 bean scope 设置为 singleton , 而 UserService 的 bean scope 设置为 prototype, 则多个 的 UserService 会共享一个 UserDao 对象, 存在线程安全问题。
<!-- 默认 singleton, IoC容器初始化就创建 -->
<bean id="userDao" class="indi.chester.spring.ioc.dao.UserDao" scope="singleton"/>
<bean id="userService" class="indi.chester.spring.ioc.service.UserService" scope="prototype">
<property name="userDao" ref="userDao" />
</bean>
如果运行一下就会发现,userDao 对象一共被创建一次
public class SpringApplication {
public static void main(String[] args) {
//创建 Spring IoC 容器, 并配置文件在容器中实例化对象
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
UserDao userDao1 = context.getBean("userDao", UserDao.class);
UserDao userDao2 = context.getBean("userDao", UserDao.class);
UserDao userDao3 = context.getBean("userDao", UserDao.class);
}
}
输出结果:
UserDao 已创建 : indi.chester.spring.ioc.dao.UserDao@13c78c0b
如果将 UserDao 的 bean scope 设置为 prototype , 而 UserService 的 bean scope 设置为 prototype, 则多个 的 UserService 会独享一个 UserDao 对象。
<!-- 若使用 prototype, 则在获取bean时才会创建 -->
<bean id="userDao" class="indi.chester.spring.ioc.dao.UserDao" scope="prototype"/>
<bean id="userService" class="indi.chester.spring.ioc.service.UserService" scope="prototype">
<property name="userDao" ref="userDao" />
</bean>
如果运行一下就会发现,userDao 对象一共被创建了三次, 每一个 UserService 对象都独享一个 UserDao 对象。
public class SpringApplication {
public static void main(String[] args) {
//创建 Spring IoC 容器, 并配置文件在容器中实例化对象
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
UserDao userDao1 = context.getBean("userDao", UserDao.class);
UserDao userDao2 = context.getBean("userDao", UserDao.class);
UserDao userDao3 = context.getBean("userDao", UserDao.class);
}
}
输出结果:
UserDao 已创建 : indi.chester.spring.ioc.dao.UserDao@4cc0edeb
UserDao 已创建 : indi.chester.spring.ioc.dao.UserDao@4667ae56
UserDao 已创建 : indi.chester.spring.ioc.dao.UserDao@77cd7a0
Last updated
Was this helpful?