使用构造函数注入

时间:2016-06-13 12:20:51

标签: java spring dependency-injection

我们说我有一个通过组件扫描初始化的服务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 ---/  

1 个答案:

答案 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);
    }
}