@Autowired和instantiation

时间:2017-08-30 16:06:53

标签: java spring dependency-injection

我找到了以下代码。

 public class Foo {
   @Autowired
   private MyService myService = new MyService();
 }

这是否意味着Spring会覆盖创建Foo时创建的myService实例?

此代码可以在Junit-context中使用Foo,而无需在springcontext中启动。

可以这样做吗?

2 个答案:

答案 0 :(得分:0)

不,做这样的事情也不行。代替:

@Service
public class Foo {

    private MyService myService;

    @Autowired
    public Foo(MyService myService){
        this.myService = myService;
    }

}´

这样Spring在构造服务时会注入您所需的依赖项。对于JUnit上下文,您只需自己提供它,它可以作为一个真实实例或一个模拟:

@Test
public void testFoo(){
    MyService mockService = mock(MyService.class);
    Foo foo = new Foo(mockService);
    foo.myMethod();
    verify(/*Check that foo has done whatever you want with MyService*/);
}

答案 1 :(得分:0)

添加到上面的答案,如果您使用Spring 4,也可以使用ContextConfig运行它,如下所示

使用SpringBoot,您可以使用@Bean注释创建bean,然后自动装配

class MyTestConfig{
@Bean
public MyService myService(){
 return new MyService();
};

}

使用MyTestConfig作为contextConfiguration运行测试用例并自动装配为

@Autowired
public MyService myService