<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来获取也是不错的方法。
真正出现上面代码问题的也是少数,出现的时候,一般是为了图方便,一个很多方法都要用到的变量,如果都需要用参数的
方式传递多麻烦呀,这样私有变量多好,不用参数那样丑陋。但是丑陋并不代表不好,以对的,自己习惯的方式编程,才能
尽量避免问题的发生。
相关推荐
在SpringSecurity中,我们可以通过定义`PasswordEncoder`的bean,选择不同的实现类(如`BCryptPasswordEncoder`),来实现密码编码方式的灵活切换。 在Java中,多态性是面向对象编程的三大特性之一,它允许我们使用...
1. **Spring Core Container**: 包括Bean Factory和ApplicationContext,是Spring框架的基础,负责管理所有Bean的生命周期和依赖关系。 2. **Data Access/Integration**: 提供了对各种数据访问技术的支持,如JDBC、...
4. **接口与多态**:在Spring中,通常推荐使用接口而不是具体的实现类进行依赖注入,这样可以更好地实现多态和解耦。例如,`MyRepository`可能实现了`Repository`接口,`MyService`依赖的是`Repository`接口,而非...
- **注解驱动的Bean定义**:通过`@Component`、`@Service`、`@Repository`和`@Controller`等注解来标记类,自动注册为Spring管理的Bean。 - **基于Java类的配置**:通过`@Configuration`注解和`@Bean`方法来定义Bean...
监听器可以是任何对象,包括Spring管理的bean或其他组件。 4. **事件监听器注册** 在Spring容器中,监听器通过声明式或编程式的方式进行注册。声明式注册通常是通过在XML配置文件中添加`<bean>`标签,或者在Java...
Spring框架简化了应用程序的开发,通过容器管理bean的生命周期,使得组件之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。 Spring Boot: Spring Boot是Spring框架的扩展,旨在简化Spring应用的初始搭建...
在 Spring Boot 中,我们使用 `@Bean` 注解来声明一个方法将返回一个 Spring 管理的 bean。例如,创建一个简单的 `HelloService`: ```java @Configuration public class AppConfig { @Bean public HelloService...
这将返回`hello` Bean的实例,可以使用多态来调用其方法。 Spring遵循开闭原则,即对扩展开放,对修改关闭。当需求变更时,我们应该尽可能地扩展现有类而不是修改它们,以减少引入新错误的可能性。 Spring还支持...
总的来说,Spring的泛型依赖注入是其IOC功能的一个强大扩展,它增强了代码的灵活性,提供了类型安全的依赖注入,简化了多态服务的配置,使得大型项目中的依赖管理变得更加优雅和高效。通过深入理解和实践这一特性,...
- Spring Bean的生命周期:初始化、销毁方法,Bean的作用域。 - Spring MVC:请求处理流程,DispatcherServlet,ModelAndView,Controller注解。 4. **Spring Boot**: - 自动配置:Spring Boot如何通过@...
- **3.3 更多DI的知识**:进一步探讨了Spring的依赖注入机制,包括构造器注入、setter注入、接口注入等,并介绍了如何处理多态依赖。 3. **Bean的作用域** - **3.4 Bean的作用域**:Spring中的Bean可以有多种作用...
1. **Java基础**:初阶部分通常会涵盖Java的基础语法,如变量、数据类型、运算符、流程控制语句、数组、类和对象、封装、继承、多态等。还会涉及异常处理、文件I/O、集合框架、线程并发等进阶话题。 2. **面向对象...
1. Spring的配置文件,如`applicationContext.xml`,用于配置Bean、数据源、事务管理器等。 2. Hibernate的配置文件,如`hibernate.cfg.xml`,定义数据库连接信息、缓存策略等。 3. SpringMvc的配置文件,如`servlet...
- 多态情况下的处理:对于具有多态性的服务,可以根据不同的实现类型选择合适的实例进行注入。 3. **使用`@Autowired`和`@Qualifier`** - `@Autowired`用于自动装配依赖对象,通常用在成员变量、构造器参数、方法...
Spring容器管理bean的生命周期,包括: - 实例化bean。 - 依赖注入。 - 如果bean实现了特定接口,如BeanNameAware、BeanFactoryAware,会调用相应的方法。 - 如果有BeanPostProcessor,会调用...
9. **配置文件**:Spring的XML配置文件是理解项目结构的关键,包括Bean的定义、依赖关系的声明、数据源配置等,通过阅读和理解这些配置,能深入了解Spring的工作原理。 10. **实战经验**:通过分析和运行这个项目,...
1. Spring IOC:理解依赖注入的概念,Bean的生命周期,以及XML和注解两种配置方式。 2. AOP(面向切面编程):代理模式、通知类型、切点表达式,以及如何实现自定义切面。 3. Spring MVC:请求处理流程,...
4. **bean**:在Spring框架中,bean表示由容器管理的对象。在C++版本中,也会有相应的bean类或接口,它们通过IoC容器进行实例化和管理。 5. **注解**:尽管C++不像Java那样原生支持注解,但开发者可能通过自定义预...