我知道有很多关于Spring Autowired问题的问题,但是我找不到类似于我的任何东西,所以很抱歉,如果它是一个骗局......
我遇到了自动装配已创建的bean的问题(调试显示构造函数已运行),但它没有被注入。没有手动实例化的调用。 我在项目中有许多其他自动装配的字段,它们工作正常。 但最有趣的是,我在不同的项目中使用了相同的模式和配置,并在那里工作 ......
现在,这是代码:
创建但未注入的bean:
@Component("genericDao")
public class GenericHibernateJpaDao implements GenericDao {
@Autowired
protected EntityManagerFactory entityManagerfactory;
public GenericHibernateJpaDao() {
}
//getters, setters and dao methods
}
GenericDao接口只定义方法,没有注释。
定义bean的服务超类:
@Configurable
public abstract class AbstractService {
@Autowired
protected GenericDao genericDao;
//getters, setters
}
服务实现(声明位):
@Service
@Component
public class WechatMessageService extends AbstractService implements IMessageService {
genericDao.saveOrUpdate(n);
的服务实现中的断点显示genericDao为null(这也是抛出NullPointerEx的行。)
IMessageService是
@Service
@Configurable
@Transactional
application-config.xml(相关位):
<beans .......... default-autowire="byName">
<context:component-scan base-package="package.with.dao" />
<context:component-scan base-package="package.with.service" />
<context:spring-configured/>
我猜它只是我身上的一些相当愚蠢的错误,但我无法弄明白并且谷歌搜索没有帮助。
感谢您的帮助。
答案 0 :(得分:1)
如果您没有启用加载时编织(为了使用AspectJ),则不需要使用@Configurable
注释。
尝试从@Configurable
删除AbstractService
,因为它是一个抽象类。同时从@Component
移除WechatMessageService
,因为您已经有@Service
,因此不需要@Component
。
请为AbstractService
课程尝试以下内容:
public abstract class AbstractService {
@Resource(name = "genericDao")
protected GenericDao genericDao;
//getters, setters
}
使用@Resource
可以更好地执行按姓名自动装配,因此您无需使用限定符。
答案 1 :(得分:0)
嗯,事实证明我在调试过程中误解了我的前提。 虽然我没有手动启动DAO bean,但我在测试的初始化中创建了 service 的手动实例,因为我需要将它传递给一个虚拟对象。 所以是啊......
感谢大家的帮助,因为它让我了解了这一认识并帮助我更好地理解了Spring及其注释。