【问题标题】:"this" reference of applicationcontext in Spring XMLSpring XML 中 applicationcontext 的“this”引用
【发布时间】:2011-10-25 16:38:58
【问题描述】:

有没有办法在 Spring 的 bean 配置文件中引用当前应用程序上下文?

我正在尝试做这样的事情:

<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

    <bean id="some-bean-name" class="com.company.SomeClass">
        <constructor-arg>
            <!-- obviously this isn't right -->
            <bean ref=#{this}/>
        </constructor-arg>
    </bean>

问题是SomeClass 在其构造函数中需要一个 ApplicationContext 实例。有没有办法获取正在加载 bean 的 ApplicationContext 的引用?我知道我可以在 XML 中完成所有加载,但这并不是我所追求的,因为我需要在我的 java 代码中加载 bean。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    您是否考虑过实现ApplicationContextAware?它不会出现在构造函数中,但确实发生在 init() 调用之前,并且会在填充 bean 属性之后发生。

    在填充普通 bean 属性之后但在初始化之前调用 回调,例如 InitializingBean.afterPropertiesSet() 或自定义 初始化方法。之后调用 ResourceLoaderAware.setResourceLoader(org.springframework.core.io.ResourceLoader), ApplicationEventPublisherAware.setApplicationEventPublisher(org.springframework.context.ApplicationEventPublisher) 和 MessageSourceAware(如果适用)。

    public class SomeClass implements ApplicationContextAware {
        //your class definition
        private ApplicationContext myContext;
    
        public void setApplicationContext(ApplicationContext context) throws BeansException {
            myContext = context;
            //load beans here maybe?
        }
    }
    

    如果使用 Spring 2.5 或更高版本,您也可以只 @Autowire(d) 它。

    public class SomeClass {
        //your class definition
        @Autowired
        private ApplicationContext myContext;
    }
    

    当然,执行其中任何一个都会将您的代码绑定到 Spring。

    【讨论】:

    • 您需要在 XML 中做些什么来完成这项工作吗?我已经尝试过接口方法,但似乎没有调用 setter。
    • SomeClass 需要由ApplicationContext 管理。要么通过xml配置,要么通过注解配置。
    • 我想我现在看到了,它只有在 bean 加载了 Spring 时才有效,否则你必须手动调用 setter。\
    • 好吧,您可能不会自己调用 setter。它是由 Spring 设计的,作为 Spring 托管 bean 接收ApplicationContext 的一种方式。我希望看到有人自己称呼它的唯一地方是,如果他们正在构建某种 Spring 扩展,并且他们希望为他们的扩展提供类似的功能。
    • 如果我要求的东西可用,那就太好了,但这对我有用。谢谢!
    猜你喜欢
    • 2014-11-20
    • 2012-06-04
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多