spring bean 多态

<bean id="test" class="com.XXX.Testmpl" scope="singleton" /></br>

<bean id="test" class="com.XXX.TestImpl" scope="prototype" />

 

singleton:SpringIoc容器只会创建该Bean的唯一实例,所有的请求和引用都只使用这个实例
Property: 每次请求都创建一个实例
request:    在一次Http请求中,容器会返回该Bean的同一个实例,而对于不同的用户请求,会返回不同的实例。需要注意的是,该作用域仅在基于Web的Spring ApplicationContext情形下有效,以下的session和global Session也是如此
session:同上,唯一的区别是请求的作用域变为了session
global session:全局的HttpSession中,容器会返回该bean的同一个实例,典型为在是使用portlet context的时候有效(这个概念本人也不懂)

注意:如果要用到request,session,global session时需要配置

servlet2.4及以上:
在web.xml中添加:
<listener>
    <listener-class>org.springframework.web.context.scope.RequestContextListener />
</listener>

servlet2.4以下:
需要配置一个过滤器
<filter>
    <filter-name>XXXX</filter-name>
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
<filter-mapping>
    <filter-name>XXXX</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

另外,从2.0开始,可以自己定义作用域,但需要实现scope,并重写get和remove方法

特别要引起注意的是:
   一般情况下前面两种作用域是够用的,但如果有这样一种情况:singleton类型的bean引用一个prototype的bean时会出现问题,因为singleton只初始化一次,但prototype每请求一次都会有一个新的对象,但prototype类型的bean是singleton类型bean的一个属性,理所当然不可能有新prototpye的bean产生,与我们的要求不符

 

 

singleton表示该bean全局只有一个实例,Spring中bean的scope默认也是singleton.

prototype表示该bean在每次被注入的时候,都要重新创建一个实例,这种情况适用于有状态的Bean.

对于SSH架构的系统,很少关心这方面,因为我们用到的一般都是singleton. Bean的注入由Spring管理。

对于有状态的Bean呢?

例如:一个bean中有一个私有的成员变量 excutePool(线程池),在init方法中初始化它,他被配置成定时任务,配置init-model,并且每次执行完或会关闭线程池。他的后果就是定时任务第一次执行完,执行第二次的时候就会报错(线程池被关闭、不可用的错误)。

 

 

而如果是prototype的话,就不会出现资源共享的问题。

对于SSH来说,Bean的配置是没错的,配置为singleton ;实际应该是这个例子不应该用私有变量。这样就使得这个Bean

由无状态变成了有状态Bean.还是应该尽量使用无状态Bean.如果在程序中出现私有变量,尽量替换为参数
对于每个访问私有变量的方法增加变量传入或者通过ThreadLocal来获取也是不错的方法。

 

真正出现上面代码问题的也是少数,出现的时候,一般是为了图方便,一个很多方法都要用到的变量,如果都需要用参数的

方式传递多麻烦呀,这样私有变量多好,不用参数那样丑陋。但是丑陋并不代表不好,以对的,自己习惯的方式编程,才能

尽量避免问题的发生。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring中的多态bean是指通过接口或父类类型来引用具体实现类的对象。多态bean使得代码更具灵活性和可扩展性,可以根据需要更换具体实现类而不需要修改引用它的代码。 在Spring中,使用多态bean可以通过配置文件或注解来实现。其中,配置文件方式是通过使用<bean>标签的"class"属性来指定具体实现类,同时使用"interface"属性来指定接口类型。这样,可以通过接口类型来引用具体实现类的对象。例如,在配置文件中可以这样定义一个多态bean: <bean id="myBean" class="com.example.MyBeanImpl" interface="com.example.MyBeanInterface" /> 而注解方式可以使用@Component注解标注具体实现类,并使用@Autowired或@Resource注解来注入多态bean。例如: @Component public class MyBeanImpl implements MyBeanInterface { // ... } @Autowired private MyBeanInterface myBean; 这样,通过@Autowired注解将具体实现类的对象注入到多态bean引用中。 多态bean的使用可以使得代码更加松耦合,提高代码的可维护性和可测试性。同时,Spring的IOC容器在管理多态bean时,会根据具体情况自动选择合适的实现类来创建对象,从而简化了开发过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring面试题](https://download.csdn.net/download/u011225629/8666175)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [spring bean 多态](https://blog.csdn.net/csh081/article/details/84612194)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值