Spring的prototype向singleton注入会有问题,具体见
Spring Bean的prototype无用的解决
除了这篇文章里介绍的方法(ApplicationContext .getBean和代理模式)以外,在java(Spring)领域还有集中其他的实现方式。
这里我们说一下。
1. 使用Spring的ObjectFactory
如果本来的代码是这样的
@Autowired private PrototypeBean bean;
在单例里直接使用或者即使是在多例里面获取多次,这样拿到的也是同样的一个实例。
我们的状态bean就无效了。
可以改成这样
@Autowired private ObjectFactory<PrototypeBean> bean;
使用的时候调用getObject方法
bean.getObject()
即可。
2. 使用java的JSR 330提出的Provider<T>
要引入jar包javax.inject
import javax.inject.Provider;
使用上和前面的ObjectFactory类似,只是方法名称变成了get
在我看来Provider和ObjectFactory的区别就是Resource和Autowire的区别。
3.使用Spring的Lookup注解
import org.springframework.beans.factory.annotation.Lookup; import org.springframework.stereotype.Component; @Component public class MySingletonBean { public void showMessage(){ MyPrototypeBean bean = getPrototypeBean(); //do your 自己的逻辑 } @Lookup public MyPrototypeBean getPrototypeBean(){ //spring自己会覆盖该方法 return null; } }
这样不用注入一个属性,但是要增加一个返回null的方法。
相关推荐
本文将深入探讨Spring的Controller是单例还是多例,以及如何确保其在并发环境下的安全性。 首先,根据Spring的默认行为,Controller被设计为单例模式。这意味着在Spring容器中,只会创建一个Controller实例,并且这...
本文将深入探讨Spring依赖注入的概念、工作原理以及如何在实际项目中应用。 依赖注入(Dependency Injection,简称DI)是一种设计模式,它允许组件之间通过外部源来管理其依赖关系,而不是由组件自己来创建或查找...
然而,在某些情况下,我们可能需要在非Spring注解的类中访问Spring容器中的Bean,或者在这些类中使用YAML配置文件中的配置信息。本篇将详细介绍如何在这样的场景下实现这一目标。 首先,让我们来理解如何在非Spring...
2. **Bean实例化**:根据BeanDefinition,Spring容器创建Bean实例,可以是单例或多例。 3. **依赖注入**:Spring容器根据BeanDefinition中的依赖关系,为Bean注入依赖对象。 4. **初始化**:Spring容器调用Bean的...
7. `@Scope`:定义Bean的作用范围,如单例(`prototype`)或多例(`singleton`)。 8. `@PostConstruct` 和 `@PreDestroy`:这两个注解分别标识在Bean初始化后和销毁前需要执行的方法。 学习Spring IOC Annotation...
在多例模式下,我们需要一个额外的类 `C` 来动态地从 Spring 容器中获取新的 `B` 实例,因为直接在 `Run` 类中注入 `B` 仍然只会得到一个实例。`C` 类通过 `ApplicationContext` 获取新的 `B` 实例,确保每个线程都...
Spring实现单例模式的方式是通过静态工厂方法`getInstance()`确保任何时候返回的都是同一对象,防止了类的多次实例化。 依赖注入是Spring的核心特性,它允许组件之间的依赖关系在运行时通过容器进行管理,而不是在...
在Spring框架中,注解是实现依赖注入和配置的核心机制之一。本文将深入探讨Spring注解的基本原理,包括它们如何被解析、处理以及如何影响应用程序的生命周期。 首先,我们需要了解注解在Java语言中的本质。注解是一...
在 Spring 框架中,可以使用 @PostConstruct 和 @PreDestroy 注解来指定初始化和销毁方法。例如: @PostConstruct public void init() { } @PreDestroy public void destory() { } Spring 的自动扫描注入机制可以...
Struts框架中的Action设计有两种模式:单例(Singleton)与多例(Multiton/Prototype)。为了理解这两种模式在Struts2中的实现与适用场景,我们需先了解单例模式和多例模式的基本概念及其在Web应用中的行为特点。 ...
在Spring框架中,静态方法内部注入Bean导致空指针异常是一个常见的问题,特别是在处理较旧的项目时。这里我们分析两种解决这个问题的方法。 首先,让我们深入理解问题的原因。在Spring中,`@Autowired`注解用于自动...
Bean可以被配置为单例(Singleton)或多例(Prototype)模式,Spring会根据不同的生命周期策略进行管理。 #### 六、自定义Spring容器 虽然本文提到的例子是基于XML配置,但Spring也支持注解驱动的方式,通过`@...
总的来说,Lookup方法注入是Spring提供的一种解决策略,它使得单例bean能够正确处理非单例依赖,避免了在多线程环境中可能出现的问题,同时保持了代码的简洁性。通过理解和熟练运用这种方法,开发者可以更好地利用...
在本文中,我们将深入探讨如何通过Spring框架实现依赖注入,这是Spring的核心特性之一,对于理解和掌握Spring认证至关重要。依赖注入(Dependency Injection,简称DI)是一种设计模式,它允许我们解耦组件,提高代码...
10. `@Configuration` 和 `@Bean`: 在Spring 3.0引入的基于注解的配置中,`@Configuration`类可以替代XML配置文件,`@Bean`注解则标记方法为bean的生产者,返回的对象会被添加到Spring容器中。 以上是Spring框架中...
Spring框架是Java开发中的核心组件,以其依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)的理念,极大地简化了企业级应用的复杂性。Spring框架提供了多种功能,...
7. **Spring Boot**:Spring Boot简化了Spring应用程序的启动和配置过程,书中可能涉及快速启动Spring应用程序的方法,以及自动配置的概念。 8. **测试**:Spring提供了一套强大的测试工具,包括单元测试、集成测试...
2. prototype(多例):只有在getBean时被实例化。 FactoryBean是另外一种方式来获取对象实例,通过getBean方法可以取得实体类,实际使用一般是在后期,spring去集成mybatis,mybatis中的核心对象SqlSessionFactory...
在Java企业级开发中,Spring框架扮演着至关重要的角色,它是现代Java应用的核心组件之一。Spring框架通过提供依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)等特性,简化...