我希望能够在我的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工厂吗?
答案 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);
... }