Java Spring DI无法使用Java配置

时间:2016-07-16 16:45:19

标签: java spring dependency-injection

我是Java Spring的新手,并尝试使用Java配置并将依赖项注入类构造函数。我想使用构造函数注入,因为类方法需要依赖项。它不适合我。

用例:从Java对象创建一个JSON字符串,并在返回之前对其进行验证。

类:FakeJsonBuilder

依赖关系:JsonValidator

主类:Per Spring文档中@SpringBootApplication注释是一个便利注释,它添加了@ Configuration,@ EnableAutoConfiguration和@ComponentScan,所以我应该很好地去参与依赖注入。

@SpringBootApplication
public class MySpringApplication {

    public static void main(String[] args){

        // Register the class we use for Java based configuration
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext();
        context.register(ApplicationConfiguration.class);
        context.refresh();

        SpringApplication.run(MySpringApplication .class, args);
    }
}

Java配置类:

@Configuration
public class ApplicationConfiguration {

    @Bean
    public JsonValidator jsonValidator(){
        return new JsonValidatorImpl();
    }

    @Bean
    public JsonBuilder(){
        return new FakeJsonBuilder();
    }
}

FakeJsonBuilder类:

public class FakeJsonBuilder implements JsonBuilder{

    private static Log logger = LogFactory.getLog(FakeJsonBuilder.class);
    private static JsonValidator jsonValidator;

    // I need an empty constructor for the ApplicationConfiguration setup to work.
    public MlrModelJsonBuilder(){};

    @Autowired
    public FakeJsonBuilder (JsonValidator jsonValidator){
        this.jsonValidator = jsonValidator;

        boolean validatorInjected = (jsonValidator != null);
        logger.info("Validator injected: " + validatorInjected);
    }

.......... More methods

没有注入jsonValidator依赖项,即日志消息注入验证器:false

1 个答案:

答案 0 :(得分:0)

引用马丁:福勒http://martinfowler.com/articles/injection.html "我的长期默认对象是尽可能在构造时创建有效对象。这个建议可以追溯到Kent Beck的Smalltalk最佳实践模式:构造方法和构造函数参数方法。带参数的构造函数可以清楚地说明在显而易见的位置创建有效对象的含义。如果有多种方法可以执行此操作,请创建显示不同组合的多个构造函数。"

我来自.NET背景并使用Ninject将我的依赖项注入到类构造函数中,原因是Fowler给出的。我引用Fowler是因为他的可信度,但你会发现许多来源提供相同的参数,即如果类方法需要依赖,那么它应该被注入到构造函数中。所以我在这里找到了如何使用Java Spring(我恢复到我的C#语法 - 原谅违规):

配置类

@Configuration
public class ApplicationConfiguration {

    @Bean
    public IJsonValidator jsonValidator(){
        return new JsonValidator();
    }

    @Bean
    public IJsonBuilder jsonBuilder(){
        return new JsonBuilder(jsonValidator());
    }
}

我们注入依赖关系的类

public class JsonBuilder implements IJsonBuilder {

    private static IJsonValidator _jsonValidator;

    // @Autowired // not needed per Sotirios. tested and verified
    public JsonBuilder(IJsonValidator jsonValidator) {
        _jsonValidator = jsonValidator;
    }

    public String getFoobar() {

        // Returns false. jsonValidator was injected
        boolean foo = (_jsonValidator == null);

        return "Validator was injected: " + foo;
    }

... more methods