`
csh081
  • 浏览: 17437 次
  • 性别: 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-SpringBoot-使用多态给项目解耦.doc

    在SpringSecurity中,我们可以通过定义`PasswordEncoder`的bean,选择不同的实现类(如`BCryptPasswordEncoder`),来实现密码编码方式的灵活切换。 在Java中,多态性是面向对象编程的三大特性之一,它允许我们使用...

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

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

    spring_demo

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

    跟我学spring系列 蒋开涛

    - **注解驱动的Bean定义**:通过`@Component`、`@Service`、`@Repository`和`@Controller`等注解来标记类,自动注册为Spring管理的Bean。 - **基于Java类的配置**:通过`@Configuration`注解和`@Bean`方法来定义Bean...

    event.rar-Spring事件监听机制

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

    java开发方面的学习,包括Java基础部分、高级部分、以及spring、springboot、springcloud.zip

    Spring框架简化了应用程序的开发,通过容器管理bean的生命周期,使得组件之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。 Spring Boot: Spring Boot是Spring框架的扩展,旨在简化Spring应用的初始搭建...

    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功能的一个强大扩展,它增强了代码的灵活性,提供了类型安全的依赖注入,简化了多态服务的配置,使得大型项目中的依赖管理变得更加优雅和高效。通过深入理解和实践这一特性,...

    java面试宝典,包含java基础篇、多线程、spring、springboot、mysql、redis、mq等等经典面试问题

    - Spring Bean的生命周期:初始化、销毁方法,Bean的作用域。 - Spring MVC:请求处理流程,DispatcherServlet,ModelAndView,Controller注解。 4. **Spring Boot**: - 自动配置:Spring Boot如何通过@...

    Spring3(1-7)

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

    Java学习的资料(内含初阶+进阶+项目(spring,springboot等))

    1. **Java基础**:初阶部分通常会涵盖Java的基础语法,如变量、数据类型、运算符、流程控制语句、数组、类和对象、封装、继承、多态等。还会涉及异常处理、文件I/O、集合框架、线程并发等进阶话题。 2. **面向对象...

    Spring4+Hibernate4+SpringMvc

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

    深入理解java的spring-ioc的使用.docx

    - 多态情况下的处理:对于具有多态性的服务,可以根据不同的实现类型选择合适的实例进行注入。 3. **使用`@Autowired`和`@Qualifier`** - `@Autowired`用于自动装配依赖对象,通常用在成员变量、构造器参数、方法...

    java常用面试题及答案

    Spring容器管理bean的生命周期,包括: - 实例化bean。 - 依赖注入。 - 如果bean实现了特定接口,如BeanNameAware、BeanFactoryAware,会调用相应的方法。 - 如果有BeanPostProcessor,会调用...

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

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

    MySQL,Spring,Java面试题

    1. Spring IOC:理解依赖注入的概念,Bean的生命周期,以及XML和注解两种配置方式。 2. AOP(面向切面编程):代理模式、通知类型、切点表达式,以及如何实现自定义切面。 3. Spring MVC:请求处理流程,...

    fantexi_springc_plus_源码.zip

    4. **bean**:在Spring框架中,bean表示由容器管理的对象。在C++版本中,也会有相应的bean类或接口,它们通过IoC容器进行实例化和管理。 5. **注解**:尽管C++不像Java那样原生支持注解,但开发者可能通过自定义预...

Global site tag (gtag.js) - Google Analytics