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

Spring的JavaConfig和CustomScopeConfigurer问题

从光启
2023-03-14
问题内容

我看到一些奇怪的行为,我希望这里的人能对此问题有所启发。

让我开始描述我的设置。首先,一个简单的数据对象

public class Apple {
    private String name;
    public Apple withName(String name) {
        this.name = name;
        return this;
    }
    public String getName() {
        return name;
    }
}

还有一个测试班

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={TestConfig.class})
public class AppleTest {
    @Autowired private Apple apples;

    @Test
    public void simpleTest() {
        System.out.println("OBJ: "+apples);
    }
}

配置如下

@Configuration
public interface ConfigInterface {
    public Apple getApple();
}

有实施班

@Configuration
@Import(AbstractTestConfig.class)
public class TestConfig implements ConfigInterface {
    public Apple getApple() {
        return new Apple().withName("Granny apples");
    }
}

随着配置依赖…

@Configuration
public class AbstractTestConfig {
    @Autowired ConfigInterface conf;

    @Bean Apple myTestApple() {
        return conf.getApple();
    }
}

所有这些都很好。我运行测试,看到预期的输出。但随后,我将扳手扔了进去,并修改了AbstractTestConfig,使其看起来如下。

@Configuration
public class AbstractTestConfig {
    @Autowired ConfigInterface conf;

    @Bean Apple myTestApple() {
        return conf.getApple();
    }

    // NEW CODE
    @Bean CustomScopeConfigurer scopeConfigurer() {
        return new CustomScopeConfigurer();
    }
}

当需要构造bean 时,突然该@Autowired对象conf为null Apple

更奇怪的是,如果我将CustomScopeConfigurerbean移到TestConfig该类上,那么它将起作用。

关于范围或CustomScopeConfigurer对象,我是否不了解?


问题答案:

从Spring @Bean
javadoc复制:

BeanFactoryPostProcessor-返回@Bean方法

对于返回Spring
BeanFactoryPostProcessor(BFPP)类型的@Bean方法,必须特别注意。因为BFPP对象必须在容器生命周期的早期实例化,所以它们会干扰@Configuration类中的@
Autowired,@
Value和@PostConstruct之类的注释的处理。为了避免这些生命周期问题,请将BFPP返回的@Bean方法标记为静态。例如:

@Bean
 public static PropertyPlaceholderConfigurer ppc() {
     // instantiate, configure and return ppc ...
 }

通过将此方法标记为静态,可以在不引起其声明@Configuration类实例化的情况下调用该方法,从而避免了上述生命周期冲突。但是请注意,如上所述,静态@Bean方法不会针对范围和AOP语义进行增强。这在BFPP情况下可行,因为其他@Bean方法通常不引用它们。提醒一下,将为具有返回类型可分配给BeanFactoryPostProcessor的任何非静态@Bean方法发出WARN级别的日志消息。



 类似资料:
  • 我已将我的Spring应用程序配置如下: 我使用组件扫描来选择@配置。我的问题是Spring会为B注入豆子吗

  • 我有一个注释类,它提供了我可以在所有项目中使用的核心功能: 在XML中,它看起来像: 这里也讨论了它,但我需要使用XML和JavaConfig来完成它。是否可能,如何实现?

  • 我希望你能帮我做以下几件事: 我正在使用spring安全和spring MVC建立一个web应用程序,我需要重定向的流到登录页面,一旦有一个尝试访问一个禁止的资源(403 HTTP状态代码)。 现在,spring安全已经完成了防止未经授权访问我在Restful API(@RESTController)中公开的每一个资源的工作,并使用适当的403默认页面进行响应。但由于我需要重定向到登录页面,我需要

  • 我正在尝试让Spring Batch2.2与JavaConfig一起工作。 现在,他们有一个注释,它设置了很多东西。默认注释为其职务数据使用datasource,但我们不想保存此数据,也不想为其创建表。文档中提到了一些关于自定义的内容,但我无法使其工作: 用户必须提供作为上下文中的bean,或者在配置类本身中实现,例如: 在我们的旧版本中,我们可以使用类,因此它将所有数据保存在内存中。是否可以使用

  • 我在JavaConfig中发现了这一点,它看起来如下所示: 如果我的假设错了,请纠正我。 3)我需要将我的类注释为@Component(Scope=“Workflow”)。同样,xml配置将如下所示:

  • 问题内容: 根据Spring的使用Spring IoC配置AspectJ方面 的文档,以便为Spring IOC配置方面,必须在xml配置中添加以下内容: 正如@SotiriosDelimanolis所建议的那样,应在JavaConfig中将其重写为以下内容: 但是,这仅在以本机AspectJ 语法编写方面时才起作用。如果它是用Java编写并带有注释的,则会收到以下错误消息: 未为Profiler