Java 在多个配置中配置相同的注释 bean 类
Java Config same annotation bean in multiple config classes
我正在尝试从 xml 切换到 java 配置。
我们有一个核心库,然后是使用核心库的实现。我们在每个实现中也有 webapp 和 cli。我正在尝试模块化配置。我们确实对某些包使用组件扫描。我 运行 陷入配置 类 中的循环依赖问题。我需要将相同的 @Component 注入到多个 java 配置 类 中创建的 bean 中。我的配置如下:
@Configuration
@ComponentScan(basePackages = {"my.components"})
@ImportResource({
"classpath:data-access-config.xml"
})
@PropertySource(value = "classpath:core.props", ignoreResourceNotFound = true)
public class CoreAppConfig {
@Autowired
Environment env;
@Autowired
ComponentBean bean;
@Bean
public MyBean myBean() {
return new MyBean(bean);
}
}
@Configuration
@Import({CoreAppConfig.class})
@PropertySource(value = "classpath:my-app.props")
public class MyAppConfig {
@Autowired
Environment env;
@Autowired
ComponentBean bean;
@Bean
public MyBean2 myBean2() {
return new MyBean2(bean);
}
}
@Configuration
@ComponentScan(basePackages = {"my.app.services"})
@Import({MyAppConfig.class, CoreAppConfig.class})
public class MyWebAppConfig {
@Autowired
Environment env;
@Autowired
MyAppConfig myAppConfig;
@Autowired
ComponentBean bean;
@Bean
public MyRestService myRestService() {
return new MyRestService(bean);
}
}
解决这个问题的最佳方法是什么?
1 个选项是不使用组件扫描。其他人?
编辑:
我遇到的异常是 BeanCurrentlyInCreationException。如果我从 MyAppConfig 中删除 @Import({CoreAppConfig.class}) 或 @Autowired ComponentBean Bean,问题就会消失。
编辑 2:
所以我认为这是特定bean的循环依赖问题。我可以用其他 bean 做我想做的事,只有这个特定的 bean 给我带来了问题。
关于确定循环依赖的任何提示?
编辑 3:
好的,所以我找出了罪魁祸首。在 CoreAppConfig 中,我创建了一个 Bean MyPropsBean。然后在 MyAppConfig 中,我创建了相同的 MyPropsBean。我希望用 MyAppConfig.MyPropsBean 覆盖 CoreAppConfig.MyPropsBean。我认为这是导致问题的原因,因为 CoreAppConfig 和 MyAppConfig 都自动装配 ComponentBean。我该如何解决这个问题?覆盖 bean 的最佳方法是什么?
所以我通过将 MyAppConfig bean 的创建移动到单独的配置 class 来解决这个问题。然后我使用@PropertySources 并创建传入动态参数的 MyAppConfig bean。
我正在尝试从 xml 切换到 java 配置。
我们有一个核心库,然后是使用核心库的实现。我们在每个实现中也有 webapp 和 cli。我正在尝试模块化配置。我们确实对某些包使用组件扫描。我 运行 陷入配置 类 中的循环依赖问题。我需要将相同的 @Component 注入到多个 java 配置 类 中创建的 bean 中。我的配置如下:
@Configuration
@ComponentScan(basePackages = {"my.components"})
@ImportResource({
"classpath:data-access-config.xml"
})
@PropertySource(value = "classpath:core.props", ignoreResourceNotFound = true)
public class CoreAppConfig {
@Autowired
Environment env;
@Autowired
ComponentBean bean;
@Bean
public MyBean myBean() {
return new MyBean(bean);
}
}
@Configuration
@Import({CoreAppConfig.class})
@PropertySource(value = "classpath:my-app.props")
public class MyAppConfig {
@Autowired
Environment env;
@Autowired
ComponentBean bean;
@Bean
public MyBean2 myBean2() {
return new MyBean2(bean);
}
}
@Configuration
@ComponentScan(basePackages = {"my.app.services"})
@Import({MyAppConfig.class, CoreAppConfig.class})
public class MyWebAppConfig {
@Autowired
Environment env;
@Autowired
MyAppConfig myAppConfig;
@Autowired
ComponentBean bean;
@Bean
public MyRestService myRestService() {
return new MyRestService(bean);
}
}
解决这个问题的最佳方法是什么?
1 个选项是不使用组件扫描。其他人?
编辑:
我遇到的异常是 BeanCurrentlyInCreationException。如果我从 MyAppConfig 中删除 @Import({CoreAppConfig.class}) 或 @Autowired ComponentBean Bean,问题就会消失。
编辑 2:
所以我认为这是特定bean的循环依赖问题。我可以用其他 bean 做我想做的事,只有这个特定的 bean 给我带来了问题。
关于确定循环依赖的任何提示?
编辑 3:
好的,所以我找出了罪魁祸首。在 CoreAppConfig 中,我创建了一个 Bean MyPropsBean。然后在 MyAppConfig 中,我创建了相同的 MyPropsBean。我希望用 MyAppConfig.MyPropsBean 覆盖 CoreAppConfig.MyPropsBean。我认为这是导致问题的原因,因为 CoreAppConfig 和 MyAppConfig 都自动装配 ComponentBean。我该如何解决这个问题?覆盖 bean 的最佳方法是什么?
所以我通过将 MyAppConfig bean 的创建移动到单独的配置 class 来解决这个问题。然后我使用@PropertySources 并创建传入动态参数的 MyAppConfig bean。