Spring XML中的“this”引用applicationcontext

4

在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加载。

理想情况下,您的类不应该知道ApplicationContext。这会导致服务定位器与基于构造函数的注入之间的冲突。但是偶尔您可能需要它。因此,“ApplicationContextAware”(侧向加载)是最佳选择。只需确保自己在问“为什么需要ApplicationContext……” - granadaCoder
1个回答

1

你有考虑过实现ApplicationContextAware吗?它不会在构造函数中出现,但会在init()调用之前发生,并且会在bean属性填充完成后立即发生。

在普通bean属性填充完成后但在初始化回调(例如InitializingBean.afterPropertiesSet()或自定义init-method)之前调用。如果适用,将在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似乎没有被调用。 - javamonkey79
SomeClass 需要由 ApplicationContext 进行管理。可以通过 XML 配置或注解配置来实现。 - nicholas.hauschild
我现在明白了,它只有在bean被Spring加载时才起作用,否则你必须手动调用setter方法。 - javamonkey79
嗯,你可能不会自己调用setter方法。它是由Spring设计为一种让你的Spring管理的bean接收ApplicationContext的方式。我期望看到的唯一一个人调用它的地方是,如果他们正在构建Spring的某种扩展,并且希望为他们的扩展提供类似的功能。 - nicholas.hauschild
如果我想要的内容可用那将是很好的,但这对我也够了。谢谢! - javamonkey79
是的,我后来意识到我有一个未受管控的bean,可能需要重构到我的bean xml文件中,但现在我所拥有的就足够了(这是原型代码)。 - javamonkey79

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接