@Autowired在@Configurable class

时间:2016-07-08 13:37:34

标签: java spring junit dependency-injection

我希望能够在我的java代码中通过调用new() ...创建的实例中自动装配通用DAO服务。我知道@configurable是查看This spring doc的正确方法。

所以这是我的班级代码

@Configurable(dependencyCheck=true)
public class DynVdynOperationsImpl implements DynVdynOperations {

    @Autowired
    private DynVdynInDbDao vdynDao;

我想在Junit测试中使用它,弹簧测试看起来像这样

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { xxx.MainConfig.class })
@ActiveProfiles({ "database-test", "classpath" })
public class DynVdynOperationsImplTest {

   @Test
   public void testSend() {
   underTest = new DynVdynOperationsImpl();
   underTest.sendVdyn("0254", null, null);
   ... }

主配置类看起来像那样,

@Configuration
@EnableSpringConfigured
@ComponentScan(basePackages = {xxx })
public class MainConfig {
...
    @Bean
    @Scope("prototype")
    public DynVdynOperations vdynOperations () {
        return new DynVdynOperationsImpl();
    }

执行测试时,版本vdynDao属性未正确自动装配并保持为空。看看this similar question,我可能在配置中遗漏了有关AspectJ的内容。

有一种简单的方法可以使它工作吗?也就是说,我不想用锤子来杀死苍蝇,而不是在创建物体时将自己注入我的代码中?可以直接从@Service对象中的代码调用spring bean工厂吗?

2 个答案:

答案 0 :(得分:0)

尝试将@Scope("原型")放在DynVdynOperationsImpl的类定义上。

此外,我认为您需要命名bean(即" DynVdynOperations"),而不是使用新的DynVdynOperationsImpl"然后使用: applicationContext.getBean(" DynVdynOperations")创建它的新实例。使用getBean将告诉Spring处理它找到的连接。

答案 1 :(得分:0)

这似乎是最好和最简单的方法。避免使用AspectJ的复杂性。

配置类很好。使用@Scope("prototype")声明bean确保每次我们要求Spring获取此类的bean时都会创建一个新实例。

在测试类中,要求Spring Container使用Application上下文生成bean:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { xxx.MainConfig.class })
@ActiveProfiles({ "database-test", "classpath" })
public class DynVdynOperationsImplTest {

   @Autowired
   ApplicationContext context;

   @Test
   public void testSend() {
   underTest = context.getBean(DynVdynOperations.class);
   underTest.sendVdyn("0254", null, null);
   ... }