前言
在Spring框架中,我们将组成Web应用程序得主体与Spring IOC容器管理得实例对象,我们称为Bean,而Spring IOC 容器是对Bean实例得初始化、装配以及一些管理操作
在Spring IOC容器中我们得Bean实例默认为单例,大多数情况下,我们需要不同得实例对象,譬如我们经常使用new操作符来构建不同得实例对象。因此Bean得作用域中提供了多种作用域
Bean得作用域
需要对我们得Bean实例做相关修改时,可以通过bean节点中的scope属性来进行设定
singleton——单例(默认)
当我们将bean得实例设置为singleton时,Spring IOC容器只会共享一个实例。当需要获取设置了该属性得bean实例时,只要id与class属性值相匹配时,就只会返回同一个bean实例
我们得singleton属性值为单例(单例模式),也就是在创建IOC容器实例时我们容器中得bean节点都会实例化。不管是否使用,IOC容器都将会帮我们自动的进行实例化bean,此方式我们称为饿汉式。
<!--scope:bean作用域(单例);lazy-init:bean实例化时机(false[饿汉式])-->
<bean id="beanNewTest" class="com.spring.config.BeanNewTest" lazy-init="false" scope="singleton"/>
prototype——多例
大家设想一下,若我们IOC容器中有几百上千得bean节点时,只要IOC容器进行实例化,都会对所有得bean实例化,但是我们不是所有得bean实例都会使用,这样会造成其他得bean实例占据资源,从而资源浪费,这种方式不太友好,往往我们只有当需要用的时候进行实例化,那么该如何解决呢?
是否将当前得bean实例设置为单例或多利,我们可以通过lazy-init 属性来进行设置,属性值说明如下
属性(lazy-init )值 | 含义 |
---|---|
false | 容器加载时当前bean进行实例化(饿汉式) |
true | 当我们需要使用bean实例,从IOC容器中调用时实例化(懒汉式) |
当我们将bean节点得作用域设置为prototype时,会导致我们每次调用该bean(注入其他bean中或调用getBean()方法)时,都会返回不同得bean实例。设置为prototype属性后它并不会与IOC容器实例就构建实例,而是当我们需要在使用该bean时才会创建实例,配置方式如下
<bean id="beanNewTest" class="com.spring.config.BeanNewTest" lazy-init="true" scope="prototype"/>
通过注解方式设置bean作用域
可能大家和我一样比较偷懒的话,认为在配置文件中进行设定作用域比较麻烦时,就可以通过注解得方式,可以达到一样的效果,那么如何操作呐?
只需要在我们对应得类头上加上@Scope注解就可以啦,那么下面为大家演示一样
@Data //包括get/set/toString/equals/hashCode等
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
//上面三个注解为lombok得相关注解
//@Scope 该注解将当前类设置为单例模式,及IOC容器实例化时就创建该对象
@Scope("singleton")
public class User {
private int id;
private String name;
private String pwd;
private Dog dog;
}
是不是发现使用注解得方式很轻松啦,将bean得作用域设置为多例模式prototype这里就不演示啦,与上面一样,只需要将@Scope得内容修改一下就好
补充
上面得两种方式:①singleton ②prototype 可以在普通得java项目上使用,还有其他三种属性只能在web应用程序上使用
属性值 | 含义 |
---|---|
request | 不同得HTTP请求将会产生对应不同得bean,并且该bean实例只能在对应得HttpRequest中有效,其他作用域无效 |
session | 不同得HTTP请求将会产生对应不同得bean,并且该bean实例只能在对应得HttpSession中有效,其他作用域无效 |
globalSession | 与session类似,不过该实现方式基于portlet web应用程序有效 |
感谢大家的阅读,热爱分享的仓鼠,请大家多多指教,么么哒~~~~