问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

如何让spring的bean不能实例化

发布网友 发布时间:2022-06-09 16:21

我来回答

3个回答

热心网友 时间:2022-07-07 00:40

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-07-07 00:40

私有构造函数并提供带参数的获取实例的方法,就像单例模式或者建造者模式

热心网友 时间:2022-07-07 00:41

私有构造函数,提供带参数的获取实例的方法
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
...括号内为杂质),所选用的试剂(足量)及操作方法均正确的是... ...所含的杂质以及除去这些杂质选用的试剂或操作方法,正确的是( ) 物... 佳能相机wifi传图片到电脑怎样将canon相机上的图片通过wifi导入电脑 佳能无线连电脑预览画面怎样将canon相机上的图片通过wifi导入电脑 支票丢了可以补办吗啊 存的支票找不到了怎么办 ...的时候总是连贯不起来,就像在一个单词一个单词的念一样。 每当我看见那些人用英语很自然交谈的时候,我就觉得他们非常的酷,我 每当听到一个英语长句,我的脑袋就发懵,总是仅仅听到其中几个单词 天玑800U和骁龙765G处理器对比有多大差距? 手机跑分的高低就一定决定手机好坏了吗 电脑怎么登两个 手机跑分4936分怎么样啊?算好还是算坏的? 就跑分一次,但手机特别烫,对手机损害多大?或者会减少使用寿命吗? java的spring框架中的BeanNameAware接口有什么用?怎么用? 我有个多余的车库钥匙,怎么能让车库的遥控钥匙学习汽车钥匙的信号 手机跑分软件会损坏手机吗? 苹果13promax跑分芯片会坏吗 请问 怎么才能写好英语作文? 清洗液是玻璃水吗 玻璃清洗液可以用水代替吗? 电脑如何登陆两个 怎么才能写好英语作文呢?感觉英语作文的好难写啊,想不出来。 如何写好英语作文的方法 第三人开庭不去的结果 民事诉讼第三人没出庭,会有什么后果 法庭第三人不出庭怎么办 电脑上怎么同时登陆两个 经期不稳 化妆品?谁知道啊 给我介绍一下 dw中注释是什么符号 谁有ejb3与hibernate结合的详细介绍 为什么度小满己显示提现到帐,但我帐上确没有呢。 度小满金融贷资料停了、但是没有借钱、有事吗? 做菜时不小心醋放多了怎么办 菜裏面醋放多了怎麼挽救 盐放多了,醋放多了,太辣了怎么办 子公司人员社会保险是否能够由分公司代缴 代缴社保有什么风险? 子女大学期间兼职挣的钱可以代缴父母开车违章罚款吗? 工资五险由子公司代缴,子公司需要给母公司开发票吗 电子商务专业到底属于哪类? opporeno3QQ怎么设置步数? OPPO是否用了QQ计步 大神们,什么视频好用,卫视直播,热点啊什么的? 有什么可以直播tvb例如翡翠台的播放器?大神们帮帮忙 深度完美W10系统电脑复制粘贴用不了该怎么办 4个月宝宝忽然吃奶频繁了是为什么 铁路信号地线种类? 最新芝麻价格
  • 焦点

最新推荐

猜你喜欢

热门推荐