spring配置bean实例化有哪些方式

如题所述

1.实例化bean的三种方法:
(1) 构造器
<!-- 体验1 -->
<bean id="personService" class="com.persia.PersonServiceBean">
<!-- index 代表方法的参数序号,由0开始,基本的类型Type可以不声明-->
<constructor-arg index="0" value="构造注入的name" />
<constructor-arg index="1" type="com.persia.IDaoBean" ref="personDao"/>
</bean>
对应类
public PersonServiceBean(String name, IDaoBean personDao) {
this.name = name;
this.personDao = personDao;
}
<!-- 体现2-->
<bean id="personDao" class="cn.itcast.dao.impl.PersonDaoBean" />
<bean id="personServiceBean" class="cn.itcast.service.impl.PersonServiceBean"
lazy-init="true" init-method="init" destroy-method="destory">
<!-- ref属性对应id personDao值 name属性对应接口的getter方法名称-->
<property name="personDao" ref="personDao" />
<!-- 体验3 -->
<!-- 注入属性值 -->
<property name="name" value="123"/>
<!-- Set的注入 -->
<property name="sets">
<set>
<value>sets:第一个值</value>
<value>sets:第二个值</value>
<value>sets:第三个值</value>
</set>
</property>
<!-- List的注入 -->
<property name="lists">
<list>
<value>lists:第一个值</value>
<value>lists:第二个值</value>
<value>lists:第三个值</value>
</list>
</property>
<!-- Properties的注入 -->
<property name="properties">
<props>
<prop key="props-key1">:第一个值</prop>
<prop key="props-key2">:第二个值</prop>
<prop key="props-key3">:第三个值</prop>
</props>
</property>
<!-- Map的注入 -->
<property name="maps">
<map>
<entry key="maps-key1" value=":第一个值" />
<entry key="maps-key2" value=":第二个值" />
<entry key="maps-key3" value=":第三个值" />
</map>
</property>
</bean>
(2) 静态工厂:
<!-- 静态工厂获取bean -->
<bean id="personService2" class="com.persia.PersonServiceBeanFactory" factory-method="createInstance"/>
对应类
public static PersonServiceBean createInstance(){
return new PersonServiceBean();
}
(3) 实例工厂:
没有静态方法,因此配置时,先实例化工厂,在实例化需要的bean。
<!-- 实例工厂获取bean,先实例化工厂再实例化bean-->
<bean id="fac" class="com.persia.PersonServiceBeanInsFactory"/>
<bean id="personService3" factory-bean="fac" factory-method="createInstance"/>
对应类
public PersonServiceBean createInstance(){
return new PersonServiceBean();
}

2. bean的作用域
默认情况为单例方式:scope=”singleton”
singleton
单实例作用域,这是Spring容器默认的作用域,使用singleton作用域生成的是单实例,在整个Bean容器中仅保留一个实例对象供所有调用者共享引用。单例模式对于那些无会话状态的Bean(如辅助工具类、DAO组件、业务逻辑组件等)是最理想的选择。
prototype
原型模式,这是多实例作用域,针对每次不同的请求,Bean容器均会生成一个全新的Bean实例以供调用者使用。prototype作用域非常适用于那些需要保持会话状态的Bean实例,有一点值得注意的就是,Spring不能对一个prototype

Bean的整个生命周期负责,容器在初始化、装配好一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。因此,客户端要负责prototype实例的生命周期管理。
request
针对每次HTTP请求,Spring容器会根据Bean的定义创建一个全新的Bean实例,
且该Bean实例仅在当前HTTP request内有效,因此可以根据需要放心地更改所建实例的内部状态,
而其他请求中根据Bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。
当处理请求结束,request作用域的Bean实例将被销毁。该作用域仅在基于web的Spring
ApplicationContext情形下有效。
session
针对某个HTTP
Session,Spring容器会根据Bean定义创建一个全新的Bean实例,且该Bean实例仅在当前HTTP Session内有效。
与request作用域一样,我们可以根据需要放心地更改所创建实例的内部状态,而别的HTTP Session中根据Bean定义创建的实例,
将不会看到这些特定于某个HTTP Session的状态变化。 当HTTP Session最终被废弃的时候,在该HTTP
Session作用域内的Bean实例也会被废弃掉。该作用域仅在基于Web的Spring ApplicationContext情形下有效。
global session
global
session作用域类似于标准的HTTP
Session作用域,不过它仅仅在基于portlet的Web应用中才有意义。portlet规范定义了全局Session的概念,它被所有构成某个portlet
Web应用的各种不同的portlet所共享。在global session作用域中定义的Bean被限定于全局portlet
Session的生命周期范围内。如果我们是在编写一个标准的基于Servlet的Web应用,并且定义了一个或多个具有global
session作用域的Bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误。该作用域仅在基于Web的Spring
ApplicationContext情形下有效。

3. bean的生命周期
(1)什么时候实例化?
对于单例的形式,在容器实例化的时候对bean进行实例化的。www.cdtarena.com
ApplicationContext ctx=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
单实例可以通过lazy-init=”true”,在getBean时进行实例化。
在beans里面default-lazy-init=”true”对所有bean进行延迟处理。
对于prototype,则是在getBean的时候被实例化的。
(2)在bean被实例化之后执行资源操作等方法:
Init-method=””
(3)在bean销毁之前执行的方法:
Destroy-method=””
什么时候被销毁?随着spring容器被关闭时被销毁。
调用spring容器的close方法来正常关闭。以前是随着应用程序执行完而关闭。

在Spring装载配置文件后,Spring工厂实例化完成,开始处理
(1)使用默认构造方法或指定构造参数进行Bean实例化。
(2)根据property标签的配置调用Bean实例中的相关set方法完成属性的赋值。
(3)如果Bean实现了BeanNameAware接口,则调用setBeanName()方法传入当前Bean的ID。
(4)如果Bean实现了BeanFactoryAware接口,则调用setBeanFactory()方法传入当前工厂实例的引用。
(5)如果Bean实现了ApplicationContextAware接口,则调用setApplicationContext()方法传入当前ApplicationContext实例的引用。
(6)如果有BeanPostProcessor与当前Bean关联,则与之关联的对象的postProcess- BeforeInitialzation()方法将被调用。
(7)如果在配置文件中配置Bean时设置了init-method属性,则调用该属性指定的初始化方法。
(8)如果有BeanPostProcessor与当前Bean关联,则与之关联的对象的postProcess- AfterInitialzation()方法将被调用。
(9)Bean实例化完成,处于待用状态,可以被正常使用了。
(10)当Spring容器关闭时,如果Bean实现了DisposableBean接口,则destroy()方法将被调用。
(11)如果在配置文件中配置Bean时设置了destroy-method属性,则调用该属性指定的方法进行销毁前的一些处理。
(12)Bean实例被正常销毁。
温馨提示:内容为网友见解,仅供参考
第1个回答  2017-10-24
如果我没记错的话,spring的单例模式容器一加载的时候就被实例化,比如配置struts的filter,当然在配置action的bean时spring默认的策略是没次请求时生成bean,并不是容器一加载就实例化。具体的可以看下spring的书,应该介绍的很详细,相关只是点应该是bean的生命周期
第2个回答  2017-10-24
SET注入,构造方法注入,P命名空间注入

spring配置bean实例化有哪些方式
(3) 实例工厂:没有静态方法,因此配置时,先实例化工厂,在实例化需要的bean。<!-- 实例工厂获取bean,先实例化工厂再实例化bean--> <bean id="fac" class="com.persia.PersonServiceBeanInsFactory"\/> <bean id="personService3" factory-bean="fac" factory-method="createInstance"\/> 对应...

springbean初始化和实例化?
没有静态方法,因此配置时,先实例化工厂,在实例化需要的bean。 !--实例工厂获取bean,先实例化工厂再实例化bean-- beanid="fac"class="com.persia.PersonServiceBeanInsFactory"\/ beanid="personService3"factory-bean="fac"factory-method="createInstance"\/ 对应类 publicPersonServiceBeancreateInstance(){ returnnew...

spring实例化bean的三种方式(springbean实例化和初始化)
spring配置bean实例化有哪些方式1、Springboot启动类:并通过@EnableConfigurationProperties指定可以使用properites来实例化bean的对象类型。2、是的,Spring管理Bean的方法就是修汽车的方式。3、如果我没记错的话,spring的单例模式容器一加载的时候就被实例化,zd比如配置struts的filter,当然在配置action的bean...

SpringBean的配置详解
Spring的实例化方式主要分为两种:构造方式实例化和工厂方式实例化。构造方式实例化包括无参构造方法实例化和有参构造方法实例化,几乎所有的实例化都是通过无参构造方式完成。有参构造方法实例化则需要参数的注入,通过标签嵌入在标签内部提供构造参数。工厂方式实例化包括静态工厂方法实例化和实例工厂方法,前...

spring中的bean
Spring的Bean管理方式灵活多样,主要有两种途径:XML配置和注解方式。首先,通过XML配置,可以通过无参构造器、实例工厂方法或静态工厂方法初始化Bean。例如,无参构造器方式在配置文件中明确指定Bean1的实例化,而工厂方法模式则允许自定义实例化过程。XML配置还支持通过id和name属性为Bean命名,其中name允许...

Spring创建bean详解--实例化bean
首先,进入createBean的入口,需要参考Spring的初始化单例池的相关内容。接下来,确认当前的bean定义已经解析了class,并复制当前的bean定义,这一步骤在AbstractAutowireCapableBeanFactory.createBean方法中执行。在实例化bean之前,会执行实现了InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation...

java | Spring Bean的定义(含创建Bean的三种方式)
Spring bean对象是构成应用程序的支柱,也是由Spring IoC容器管理的。bean是一个被实例化、组装,并通过Spring IoC容器所管理的对象。这些bean是由容器提供的配置元数据创建的。创建Bean的三种方式:1.基于XML配置:从Spring 2.5开始就可以使用注解来配置依赖注入,在可以使用基于注解的配置之前,需要在...

Spring Bean的作用域、条件注解和@Import方式注入
Spring Bean的作用域、条件注解和@Import方式注入是构建Spring应用中的关键概念。首先,作用域(Scope)决定了Spring容器中Bean的生命周期和实例化方式。默认作用域为singleton(单例),意味着一个Bean在整个应用中只存在一个实例,除非显式通过@Scope(value = "prototype")注解修改为prototype(原型),使得...

java,spring实例化bean的3种方法都有什么区别
利用静态factory方法创建,可以统一管理各个bean的创建,如各个bean在创建之前需要相同的初始化处理,则可用这个factory方法险进行统一的处理等等。利用实例化factory方法创建,即将factory方法也作为了业务bean来控制,觉得1可用于集成其他框架的bean创建管理方法,2能够使bean和factory的角色互换。

Spring(3)——装配 Spring Bean 详解
为了消除多例Bean的歧义,Spring提供了@Primary和@Qualifier注解。@Bean注解则允许在方法上创建动态Bean,提供了更大的灵活性和可扩展性。Bean的作用域决定实例化次数,Spring提供了singleton和prototype等5种作用域。在MVC中,Action通常选择prototype作用域。Spring EL提供了更强大的注入方式,允许在配置中使用...

相似回答