在使用Spring时,有时会碰到这种情况:
引用
需要在一个类中使用一个非Singlton类型的Bean,比如每次方法调用都需要new一个新的Bean。但是,由于Spring的依赖注入是在Bean初始化完成之后进行的,而且只进行一次,因此就无法在每次方法调用时注入新的Bean。
那么如何解决这个问题呢,一般的做法可能是实现Spring的ApplicationContextAware接口,然后在没个方法中显示地调用ApplicationContext的getBean方法,当然这个Bean在Spring的配置文件中是配置成非Singlton的。如下面代码所示:
public class ClazzA implements ApplicationContextAware{
private ApplicationContext applicationContext;
void setApplicationContext(ApplicationContext applicationContext){
this.applicationContext = applicationContext;
}
public void methodA(){
Object bean = this.applicationContext.getBean("...");
...
}
public void methodB(){
Object bean = this.applicationContext.getBean("...");
...
}
...
}
上面的代码可以解决我们之前说的问题,但是,这样做就形成了对Spring框架代码的依赖,降低了应用程序代码的可以执行和可重用性。
不过不用担心,Spring已经为我们考虑到了这一点,并且提供了几种更好的解决方案。下面讲一下其中的两种。这两种方法Spring都是通过使用CGLIB自动生成字节码来完成的。
解决方案一:Lookup Method。
仍然以上面的ClazzA为例。这种方法需要将ClazzA定义为抽象类,并在该类中定义一个抽象的createBean方法。修改后的代码如下:
public abstract class ClazzA{
public void methodA(){
ClazzB bean = this.applicationContext.getBean("...");
...
}
public void methodB(){
ClazzB bean = this.applicationContext.getBean("...");
...
}
public abstract ClazzB createBean();
...
}
然后在Spring的配置文件中做如下定义:
<bean id="clazzB" class="edu.sjtu.spring.ClazzB" scope="prototype">
<!-- inject dependencies here as required -->
</bean>
<!-- commandProcessor uses statefulCommandHelper -->
<bean id="clazzA" class="edu.sjtu.spring.ClazzA">
<lookup-method name="createBean" bean="command"/>
</bean>
这样定义之后,Spring就会使用CGLIB自动生成一个实现了createBean方法的ClazzA的一个实现类,并让createBean返回ClazzB。
上面所说的那个createBean方法必须符合下面的方法签名:
<public|protected> [abstract] <return-type> theMethodName(no-arguments);
详细信息可以参见Spring文档的3.4节。
解决方案二:使用ServiceLocatorFactoryBean。
这种方案交第一种方案更加灵活一点,但是付出的代价是要单独定一个工厂接口。这种方法在Spring的ServiceLocatorFactoryBean类的API文档中有详细介绍,这里就不再累述了。
分享到:
相关推荐
它们分别代表了Spring对依赖注入(Dependency Injection,DI)的实现和数据库操作的简化处理。 首先,让我们来深入理解Spring的`getBean`方法。`getBean`是Spring容器的核心接口`ApplicationContext`或`BeanFactory...
在Spring框架中,`getBean`方法是核心的组件实例化和管理的入口,它用于从IoC容器中获取指定的Bean。这个过程涉及到多个步骤,确保Bean的正确创建、初始化以及依赖注入。以下是`getBean`方法的主要流程: 1. **开始...
Spring Bean 的循环依赖完全掌握 在 Spring 框架中,Bean 的循环依赖是指多个 Bean 之间存在相互依赖关系,导致 Bean 的创建和初始化过程变得复杂。为了彻底掌握 Spring Bean 的循环依赖,我们需要搞清楚四个问题:...
综上所述,通过`ApplicationContext`的`getBean`方法,我们可以方便地在Spring应用中获取到任何已注册的Bean,而无需直接依赖于Spring容器。这种方式使得我们的代码更加解耦,易于维护。同时,通过实现`...
在Java开发中,Spring框架是应用最广泛的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)容器。它极大地简化了组件之间的依赖管理,提高了代码的可测试性和可维护性。本篇文章将深入...
4. 获取bean实例:使用`BeanFactory`的`getBean(String beanId)`方法获取bean实例,此时,所有依赖的bean都会被自动注入。 **六、自定义`ApplicationContext`** 如果你需要更高级的功能,如事件监听、AOP支持等,...
在Spring框架中,静态方法内部注入Bean导致空指针异常是一个常见的问题,特别是在处理较旧的项目时。这里我们分析两种解决这个问题的方法。 首先,让我们深入理解问题的原因。在Spring中,`@Autowired`注解用于自动...
在这个名为“Spring依赖注入使用setter设注入demo”的示例中,我们将深入探讨如何通过setter方法实现Spring的依赖注入。 首先,理解依赖注入的基本思想:对象之间的依赖关系不是由对象自身管理,而是由外部容器(在...
**Spring 依赖注入 (DI) 与 Bean** Spring 框架的核心特性之一就是依赖注入(Dependency Injection,简称 DI),这是一种设计模式,它允许我们控制组件之间的耦合,而不是让组件自行创建它们所依赖的对象。这有助于...
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入方式,包括构造器注入、设值注入...
Spring 3.0引入了`getBean(Class)`,Spring 4.1增加了对`getBean(Class,Object...)`的支持,允许传入默认参数。Spring 5.1中,引入了`getBeanProvider`,支持延迟查找,提供更细粒度的控制。 **集合类型依赖查找** ...
尽管Spring对单例bean的循环依赖处理得很巧妙,但对以下情况无能为力: 1. **原型作用域的bean**:由于原型bean每次请求都会创建新的实例,Spring无法跟踪和管理这些实例,因此无法处理它们之间的循环依赖。 2. **...
加载spring配置文件,提供getBean接口.
`getBean`是Spring框架提供的一个方法,位于`ApplicationContext`接口中,用于从Spring容器中获取一个已注册的bean实例。通常,bean在配置文件中定义,然后通过`getBean`来获取并使用。例如,我们可以使用以下方式...
本示例将深入讲解如何在Spring中通过实例工厂方法实现依赖注入,并通过一个完整的可运行的`SpringIOCTest4`项目来展示这一过程。 首先,理解依赖注入的基本概念。依赖注入允许我们把一个对象(依赖)传递到另一个...
在Java开发中,Spring框架因其强大的依赖注入(Dependency Injection, DI)和面向切面编程(Aspect Oriented Programming, AOP)功能而被广泛使用。掌握如何获取Spring容器对于管理和访问其管理的bean至关重要。本文...
它允许我们不直接在类内部创建依赖对象,而是通过构造函数、setter方法或者接口回调等方式将依赖对象传递进来。这种方式降低了类与类之间的耦合,使得代码更易于维护和扩展。在Spring中,我们可以通过XML配置文件、...
浅谈Spring IoC容器的依赖注入原理 Spring IoC容器的依赖注入原理是Spring框架的核心机制之一,负责将服务对象(Bean)实例化并将其提供给客户端使用。依赖注入原理可以分为两个阶段:IoC容器初始化和Bean实例化。 ...
本篇将详细讲解如何使用构造器注入作为Spring依赖注入的一种方式,并通过一个完整的可运行示例——"SpringIOCTest2"来加深理解。 首先,理解依赖注入的概念。依赖注入允许我们不在类内部创建对象,而是通过外部源...
在本文中,我们将深入探讨如何通过Spring框架实现依赖注入,这是Spring的核心特性之一,对于理解和掌握Spring认证至关重要。依赖注入(Dependency Injection,简称DI)是一种设计模式,它允许我们解耦组件,提高代码...