问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-21 01:06

我来回答

3个回答

热心网友 时间:2022-06-17 00:19

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..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实例被正常销毁。

热心网友 时间:2022-06-17 00:19

如果我没记错的话,spring的单例模式容器一加载的时候就被实例化,比如配置struts的filter,当然在配置action的bean时spring默认的策略是没次请求时生成bean,并不是容器一加载就实例化。具体的可以看下spring的书,应该介绍的很详细,相关只是点应该是bean的生命周期

热心网友 时间:2022-06-17 00:20

SET注入,构造方法注入,P命名空间注入
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手提电脑怎能连接wifi笔记本电脑怎么连接wifi步骤 ...但是手机wifi能搜到并且能正常使用,这是怎么回事? 可我看别人没有路由器,带着电脑去有无限信号的地方就能上网啊 WULIANGYE五粮液东方娇子醇柔醇品52%vol-适用对象 五粮液东方娇子醇品52度浓香型白酒500ml*6瓶整箱装 五粮液 东方娇子醇品52%vol 适用对象 2024清明节高速路免费吗2024清明节高速免费时间 等离子电视跟卧室床头只有一墙之隔,关了电视电源的话有辐射吗? 电视机的后面是墙,墙的另一头是床头,这样电视对孕妇有没有辐射。辐射... ...联想代理的九阴真经手游用什么软件可以在电脑上玩 如何通过spring的配置文件得到bean对象 spring 中怎么取得bean 如何取得Spring管理的bean 如何用spring获取bean 如何查看 spring注入的bean 采用spring注解后如何注入bean问题 急急急:Java普通工具类获取Spring中注入bean时偶尔发生异常 spring中哪些类需要作为bean来进行注入管理 spring 用哪种方式注入bean好 spring 如何用注解的方式给普通类注入bean spring在多线程中怎么注入bean 如何调用spring配置文件手动注入的bean spring的bean注入属性有哪几种方式 spring 普通类 怎么注入bean spring注入bean的几种方式 word表格文字上下居中怎么弄 word中的表格文字怎么上下居中 word表格里文字如何上下居中 word表格上下居中怎么弄 word表格文字上下居中怎么设置 关于Spring注入,静态工具类怎么注入属性 谁知道Spring获取Bean的几种方式 红外测距仪有什么特点? 测距仪主要是通过什么实现的? 苹果手机里的号码怎么导入安卓手机 怎么从苹果手机导出电话号码到安卓手机 怎么将苹果手机里的电话号码导入安卓手机 苹果手机如何导入电话号码 苹果手机电话号码怎么弄到安装手机上 怎么使用短信辅助验证? 请使用手机号发送短信验证,怎么用手机号验证? 怎样给10690510295102发送短信验证 如何发短信获取验证码? 怎样发送短信验证 如何发短信获取验证码 想做短信验证怎么选? 怎么在电脑上使用wifi万能钥匙 笔记本电脑能不能用wifi万能钥匙 电脑能不能用wifi万能钥匙 qq上怎么找更多的免费气泡