gpt4 book ai didi

java - 是否可以将使用 @Component 定义的 bean 作为 BeanFactoryPostProcessor 的参数注入(inject)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:18:06 26 4
gpt4 key购买 nike

如果需要,需要哪种配置?这是不推荐的吗?

带注释的类:

package com.springbug.beanfactorydependencyissue;

import javax.annotation.Resource;
import org.springframework.stereotype.Component;

@Component
public class DependantBean {

@Resource
DependencyBean dependencyBean; // Isn't initialized correctly

public DependencyBean getDependencyBean() {
return dependencyBean;
}
}

失败的依赖bean:

package com.springbug.beanfactorydependencyissue;

import org.springframework.stereotype.Component;

@Component
public class DependencyBean {

}

测试用例:

package com.springbug.beanfactorydependencyissue;

import static org.fest.assertions.Assertions.assertThat;

import javax.annotation.Resource;

import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;

import com.springbug.beanfactorydependencyissue.DependantBean;

@ContextConfiguration(locations = "/applicationContext.xml")
public class AppTest extends AbstractTestNGSpringContextTests {

@Resource
private DependantBean annotatedBean;

@Test
public void testThatDependencyIsInjected() {
// Fails as dependency injection of annotatedBean.dependencyBean does not work
assertThat(annotatedBean.getDependencyBean()).isNotNull();
}
}

具有“错误”依赖项的自定义 BeanFactoryPostProcessor:

package com.springbug.beanfactorydependencyissue;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanFactoryPostProcessorConfiguration {

/**
* The {@link DependantBean} here causes the bug, can
* {@link BeanFactoryPostProcessor} have regular beans as dependencies?
*/
@Bean
public static BeanFactoryPostProcessor beanFactoryPostProcessor(
DependantBean dependantBean) {
return new BeanFactoryPostProcessor() {

public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory)
throws BeansException {

}
};
}
}

应用程序上下文.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:component-scan base-package="com.springbug.beanfactorydependencyissue" />
</beans>

为什么 BeanFactoryPostProcessorConfiguration 不能引用 DependantBean

AppTest 中生成的 DependantBean 实例不为 null,即它是由 spring 创建的,但其依赖项 (DependencyBean) 为 null。 Spring 一点也不提示的事实让我相信这是 spring 中的一个错误。是否应支持此用例?

顺便说一句,我正在使用 spring-*-3.1.1.RELEASE.jar顺便说一句 2:重现错误的代码也可以找到 here .

最佳答案

也许更简单和描述性的答案:

是的,可以使用 @Component bean BeanFactoryPostProcessor依赖。

但是 BeanFactoryPostProcessor 的每个依赖项将在任何 BeanPostProcessor 之前被实例化活跃。这些包括:

  • CommonAnnotationBeanPostProcessor - 负责@PostConstruct , @Resource和其他一些注释
  • AutowiredAnnotationBeanPostProcessor - 负责@Autowired@Value注释
  • ...还有更多...

所以你总结一下:

是的,可以使用 @Component bean BeanFactoryPostProcessor依赖项,但它们不能使用基于注解的注入(inject)(@Autowired@Resource@WebServiceRef、...)和 BeanPostProcessor 提供的其他功能.


您的示例的解决方法可能是创建 ApplicationContext你所建议的层次结构:

  • 每个上下文初始化并应用其自己的后处理器基础架构,您仍然可以在其中引用父上下文的依赖项。

其他方法可能是(我更喜欢):

  • 使用BeanFactoryAware @Component 上的界面bean 并自己提取依赖项(因为 Spring 不会注入(inject)它)。
  • 定义与BeanFactoryPostProcessor 连接的bean s 在上下文配置中 XML@Configuration (即不要对这些 bean 使用 @Component)。

关于java - 是否可以将使用 @Component 定义的 bean 作为 BeanFactoryPostProcessor 的参数注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16569091/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com