Spring 创建 bean 但不注入它
Spring creating bean but not injecting it
我知道有很多关于 Spring Autowired 问题的问题,但我没能找到任何与我的相似的东西,很抱歉,如果它被骗了...
我在自动装配创建的 bean 时遇到问题(调试显示构造函数是 运行),但是它没有被注入。没有手动实例化的调用。
我在项目中还有许多其他自动装配的字段,它们工作正常。
不过,最有趣的是我在不同的项目中使用了相同的模式和配置 并且它在那里工作 ...
那么,下面是代码:
已创建但未注入的 bean:
@Component("genericDao")
public class GenericHibernateJpaDao implements GenericDao {
@Autowired
protected EntityManagerFactory entityManagerfactory;
public GenericHibernateJpaDao() {
}
//getters, setters and dao methods
}
GenericDao 接口只定义了方法,没有注释。
定义 bean 的超级服务class:
@Configurable
public abstract class AbstractService {
@Autowired
protected GenericDao genericDao;
//getters, setters
}
服务实现(声明位):
@Service
@Component
public class WechatMessageService extends AbstractService implements IMessageService {
genericDao.saveOrUpdate(n);
处的服务实现断点显示 genericDao 为空(这也是抛出 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/>
我猜这只是我这边的一些相当愚蠢的错误,但我就是想不通,谷歌搜索也无济于事。
感谢您的帮助。
如果您没有启用加载时编织(为了使用 AspectJ),则不需要使用 @Configurable
注释。
尝试从 AbstractService
中删除 @Configurable
,因为它是抽象的 class。还要从 WechatMessageService
中删除 @Component
,因为您已经有 @Service
,所以不需要 @Component
。
为您的 AbstractService
class 尝试以下方法:
public abstract class AbstractService {
@Resource(name = "genericDao")
protected GenericDao genericDao;
//getters, setters
}
使用 @Resource
可以更好地执行按名称自动装配,因此您不需要使用限定符。
好吧,事实证明我在调试过程中的前提是错误的。
虽然我没有手动启动 DAO bean,但我在测试初始化时创建了 service 的手动实例,因为我需要向它传递一个虚拟对象。
所以是的...
感谢大家的帮助,因为它促使我意识到这一点,并帮助我更好地理解 Spring 及其注释。
我知道有很多关于 Spring Autowired 问题的问题,但我没能找到任何与我的相似的东西,很抱歉,如果它被骗了...
我在自动装配创建的 bean 时遇到问题(调试显示构造函数是 运行),但是它没有被注入。没有手动实例化的调用。 我在项目中还有许多其他自动装配的字段,它们工作正常。 不过,最有趣的是我在不同的项目中使用了相同的模式和配置 并且它在那里工作 ...
那么,下面是代码:
已创建但未注入的 bean:
@Component("genericDao")
public class GenericHibernateJpaDao implements GenericDao {
@Autowired
protected EntityManagerFactory entityManagerfactory;
public GenericHibernateJpaDao() {
}
//getters, setters and dao methods
}
GenericDao 接口只定义了方法,没有注释。
定义 bean 的超级服务class:
@Configurable
public abstract class AbstractService {
@Autowired
protected GenericDao genericDao;
//getters, setters
}
服务实现(声明位):
@Service
@Component
public class WechatMessageService extends AbstractService implements IMessageService {
genericDao.saveOrUpdate(n);
处的服务实现断点显示 genericDao 为空(这也是抛出 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/>
我猜这只是我这边的一些相当愚蠢的错误,但我就是想不通,谷歌搜索也无济于事。
感谢您的帮助。
如果您没有启用加载时编织(为了使用 AspectJ),则不需要使用 @Configurable
注释。
尝试从 AbstractService
中删除 @Configurable
,因为它是抽象的 class。还要从 WechatMessageService
中删除 @Component
,因为您已经有 @Service
,所以不需要 @Component
。
为您的 AbstractService
class 尝试以下方法:
public abstract class AbstractService {
@Resource(name = "genericDao")
protected GenericDao genericDao;
//getters, setters
}
使用 @Resource
可以更好地执行按名称自动装配,因此您不需要使用限定符。
好吧,事实证明我在调试过程中的前提是错误的。 虽然我没有手动启动 DAO bean,但我在测试初始化时创建了 service 的手动实例,因为我需要向它传递一个虚拟对象。 所以是的...
感谢大家的帮助,因为它促使我意识到这一点,并帮助我更好地理解 Spring 及其注释。