当前位置: 首页 > 面试题库 >

将预构造的Bean添加到Spring应用程序上下文

云季萌
2023-03-14
问题内容

我正在编写一个实现以下方法的类:

public void run(javax.sql.DataSource dataSource);

在这种方法中,我希望使用类似于以下内容的配置文件来构造Spring应用程序上下文:

<bean id="dataSource" abstract="true" />

<bean id="dao" class="my.Dao">
  <property name="dataSource" ref="dataSource" />
</bean>

是否可以在配置文件中引用“ dataSource” bean的任何地方强制Spring使用传递给我的方法的DataSource对象?


问题答案:

我发现两个Spring接口可以用来实现我所需要的。该BeanNameAware接口允许Spring通过调用来告诉一个对象的应用程序上下文中它的名字setBeanName(字符串)方法。该FactoryBean的接口告诉Spring不使用对象本身,而是当返回,而对象的getObject()方法被调用。将它们放在一起,您将获得:

public class PlaceholderBean implements BeanNameAware, FactoryBean {

    public static Map<String, Object> beansByName = new HashMap<String, Object>();

    private String beanName;

    @Override
    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }

    @Override
    public Object getObject() {
        return beansByName.get(beanName);
    }

    @Override
    public Class<?> getObjectType() {
        return beansByName.get(beanName).getClass();
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

}

Bean的定义现在简化为:

<bean id="dataSource" class="PlaceholderBean" />

占位符在创建应用程序上下文之前会获得其值。

public void run(DataSource externalDataSource) {
    PlaceholderBean.beansByName.put("dataSource", externalDataSource);
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    assert externalDataSource == context.getBean("dataSource");
}

事情似乎已成功运行!



 类似资料:
  • 问题内容: 我试图以编程方式设置一个Spring Boot应用程序上下文根。上下文根的原因是我们希望从中访问该应用,并将所有控制器路径附加到该应用。 这是Web应用程序的应用程序配置文件。 这是主页的索引控制器。 应用程序的新根目录应位于,但仍位于。 我错过了什么导致Spring Boot在请求映射之前不附加上下文根的问题? 问题答案: 你为什么要尝试推出自己的解决方案。Spring-boot已经

  • 问题内容: 我有一些带有自定义注释的类,不应实例化(抽象类,它只是真实bean的子组件)。但是在此类的顶部,在运行时,在上下文初始化阶段,我想将额外的bean放入应用程序上下文中。 因此,基本上,我需要扫描类路径,处理结果,并将新bean引入当前的应用程序上下文中。 似乎spring-mvc,spring-tasks和spring-integration正在这样做(我试图从源中学习它-没运气) 我

  • 问题内容: 由于采用了插件架构,因此我试图以编程方式将bean添加到我的webapp中。我有一个通过注释创建的Spring bean ,并且正在实现接口。 我的覆盖函数如下所示: 基本上,我不知道如何向给setApplicationContext的applicationContext对象添加一个bean。谁能告诉我我将如何处理错误的方法? 好的,这就是我最终得到的解决方案: 问题答案: 在Spri

  • 我正在尝试以编程方式设置一个spring boot应用程序上下文根。上下文根的原因是我们希望从访问应用程序,并将所有控制器路径附加到它。 下面是Web-App的应用程序配置文件。 这是主页面的索引控制器。 应用程序的新根应该位于,但它仍然位于。 我错过了什么导致spring boot没有在请求映射之前添加上下文根?

  • 我在web中配置了spring根web上下文。xml文件。我也有几个与此父项相关的子上下文。所有子上下文都是手动创建的: 我想在这个子上下文中管理会话和请求范围的bean。 如何正确创建和配置子上下文,使其能够处理web应用程序范围? 现在我在尝试自动装配会话范围的bean时出现以下错误(显然):