我们说我有一个通过组件扫描初始化的服务bean:
@Service
public class MyService { ... }
我在我的Java应用程序配置中配置了一个bean A
,它依赖于另一个在Java配置中定义的bean B
,而后者依赖Service
使用构造函数注入。我可以在bean工厂中使用自动装配A
并将其传递给B
:
@Bean
@Autowired
public A a(MyService service) {
return new A(b(service));
}
@Bean
public B b(MyService service) {
return new B(service);
}
但是,这对我来说并不是很干净。 a()
不应该关注MyService
。但是如果我打电话给new B(service)
,我需要以某种方式将服务转移到b()
,如果这是一个方法参数,a()
需要在那里放一些东西。
我试过了:
@Autowired private MyService service;
@Autowired
public A a() {
return new A(b());
}
@Bean
public B b() {
return new B(service);
}
但这会将null
注入new B(...)
- 显然,Spring会在调用b()
后填充该字段。
我也尝试过:
public B b() {
return new B(context.getBean(MyService.class));
}
...这导致与循环引用相关的BeanInstantiationException
。
如何直接将MyService
bean导入b()
' new B(...)
?
更新:以上是我实际想要做的简化。
真实情况是我有一堆Action
bean使用共享DataService
bean来访问数据。然后我有一个CompositeAction
类,其中包含对几个Action
对象的引用,并根据运行时条件调用相应的对象。
我想配置两个类型为CompositeAction
的bean,每个bean都有自己手工配置的委托Action
bean集。但我希望Action
bean可以通过构造函数注入与DataService
一起自动装配。
CompositeAction ----> Action ---\
| \
\-----> Action ---\ \
----> DataService
CompositeAction ----> Action ---/ /
| /
\------> Action ---/
答案 0 :(得分:0)
为什么不呢?
@Configuration
public class MvcConfigurer extends WebMvcConfigurerAdapter
implements EmbeddedServletContainerCustomizer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// Resources without Spring Security. No cache control response headers.
registry.addResourceHandler("/static/public/**")
.addResourceLocations("classpath:/static/public/");
// Resources controlled by Spring Security, which
// adds "Cache-Control: must-revalidate".
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/")
.setCachePeriod(3600*24);
}
}