`
csh081
  • 浏览: 16871 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring bean 多态

    博客分类:
  • ssh
阅读更多

<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来获取也是不错的方法。

 

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

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

尽量避免问题的发生。

 

分享到:
评论

相关推荐

    java常用面试题及答案

    spring bean 容器的生命周期是什么样的? Spring中有哪些类型的通知(Advice)? Spring Boot 的核心配置文件有哪几个?它们的区别是什么? springboot集成mybatis的过程 springcloud如何实现服务的注册和发现

    Spring入门(适合有一定的java基础的人)

    1. **Spring Core Container**: 包括Bean Factory和ApplicationContext,是Spring框架的基础,负责管理所有Bean的生命周期和依赖关系。 2. **Data Access/Integration**: 提供了对各种数据访问技术的支持,如JDBC、...

    spring_demo

    4. **接口与多态**:在Spring中,通常推荐使用接口而不是具体的实现类进行依赖注入,这样可以更好地实现多态和解耦。例如,`MyRepository`可能实现了`Repository`接口,`MyService`依赖的是`Repository`接口,而非...

    event.rar-Spring事件监听机制

    监听器可以是任何对象,包括Spring管理的bean或其他组件。 4. **事件监听器注册** 在Spring容器中,监听器通过声明式或编程式的方式进行注册。声明式注册通常是通过在XML配置文件中添加`&lt;bean&gt;`标签,或者在Java...

    Spring boot基于java的配置

    在 Spring Boot 中,我们使用 `@Bean` 注解来声明一个方法将返回一个 Spring 管理的 bean。例如,创建一个简单的 `HelloService`: ```java @Configuration public class AppConfig { @Bean public HelloService...

    最新spring框架学习笔记(全)资料 (2).pdf

    这将返回`hello` Bean的实例,可以使用多态来调用其方法。 Spring遵循开闭原则,即对扩展开放,对修改关闭。当需求变更时,我们应该尽可能地扩展现有类而不是修改它们,以减少引入新错误的可能性。 Spring还支持...

    SpringIOC_泛型依赖注入.zip

    总的来说,Spring的泛型依赖注入是其IOC功能的一个强大扩展,它增强了代码的灵活性,提供了类型安全的依赖注入,简化了多态服务的配置,使得大型项目中的依赖管理变得更加优雅和高效。通过深入理解和实践这一特性,...

    Spring3(1-7)

    - **3.3 更多DI的知识**:进一步探讨了Spring的依赖注入机制,包括构造器注入、setter注入、接口注入等,并介绍了如何处理多态依赖。 3. **Bean的作用域** - **3.4 Bean的作用域**:Spring中的Bean可以有多种作用...

    Spring4+Hibernate4+SpringMvc

    1. Spring的配置文件,如`applicationContext.xml`,用于配置Bean、数据源、事务管理器等。 2. Hibernate的配置文件,如`hibernate.cfg.xml`,定义数据库连接信息、缓存策略等。 3. SpringMvc的配置文件,如`servlet...

    积分商城 跟我学spring3-项目源码

    9. **配置文件**:Spring的XML配置文件是理解项目结构的关键,包括Bean的定义、依赖关系的声明、数据源配置等,通过阅读和理解这些配置,能深入了解Spring的工作原理。 10. **实战经验**:通过分析和运行这个项目,...

    JPA+Spring+Struts2整合

    2. **配置Spring**:创建Spring的配置文件,定义Bean并进行依赖注入,包括DataSource、EntityManagerFactory、TransactionManager等。 3. **配置Struts2**:设置Struts2的配置文件,定义Action类和对应的Action映射...

    Java基础+Struts+Spring+Hibernate总结

    学习Spring框架需要掌握Bean的声明与管理,事务处理,以及Spring Boot快速开发。 Hibernate是一个流行的Java ORM(Object-Relational Mapping,对象关系映射)框架,它消除了Java应用与数据库之间的直接交互,通过...

    Spring面试题

    bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring 框架使用 JavaBean 属性和配置数据来指出必须设置的依赖关系。 ...

    实战C.NET编程.Spring.NET.NHibernate从入门到精通

    掌握Spring.NET容器的使用,包括Bean的生命周期管理,以及如何利用Spring.NET的Web MVC框架开发Web应用。 对于NHibernate,你需要熟悉其基本配置,如何创建映射文件或使用Fluent NHibernate进行对象-关系映射,以及...

    spring+springmvc+hibernateku框架

    在Spring中,可以使用XML配置或注解来定义bean的创建和装配,以及事务管理等服务。 **SpringMVC**是Spring框架的一个模块,专门用于处理Web层的请求和响应。它遵循Model-View-Controller设计模式,将业务逻辑、数据...

    Spring+Hibernate+Struts工作原理

    Spring容器根据XML配置文件或者Java配置类加载并管理Bean,提供如初始化、销毁、依赖查找等服务。Spring还包含许多其他模块,如数据访问/集成、Web、测试等,为整个企业级应用提供了全面的解决方案。 【Hibernate...

    java学习整理文档.docx

    java 学习整理文档 Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定 最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”或者...

    HTML+Java+JavaOOP+JQuery+JSP+Hibernate+Spring+Struts+人事面试

    Java是一种广泛使用的面向对象编程语言(JavaOOP),其特性包括封装、继承、多态和抽象。JavaOOP允许开发者创建可复用的代码模块,提高效率。面试时,面试官可能会询问关于类、对象、接口、异常处理和集合框架等方面...

    2021-OOP-LAB:2021年Spring面向对象的类实验室

    7. **Spring Bean**:在Spring框架中,应用中的对象称为Bean,由Spring容器负责创建、管理和装配。Bean可以通过XML配置、注解或Java配置进行定义。 8. **AOP**:面向切面编程允许开发者将关注点(如日志、事务管理...

    java SOURSE

    - Bean生命周期:了解Spring如何创建、初始化、装配、销毁Bean,以及AOP代理的实现原理。 - 事件驱动:Spring的ApplicationEvent和ApplicationContextEventListener机制,用于在应用上下文间传播自定义事件。 - ...

Global site tag (gtag.js) - Google Analytics