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 及其注释。