首页 > 解决方案 > 如果容器中不存在依赖项的接口,带有@Autowired 的 bean 如何获取其依赖项

问题描述

我正在学习 Spring 框架,现在我对依赖注入感到困惑。

在这个问题中,我问的是 Java 配置。

我知道@Autowired 注释通过引用已声明接口的合格实现类来自动连接依赖项和bean。

但是,我不知道在我学习的代码中没有 bean 返回时transactionManager(SessionFactory sessionFactory),函数 是如何获取其参数实例的。SessionFactorySessionFactory

@Bean
public LocalSessionFactoryBean sessionFactory(){

    // create session factorys
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();

    // set the properties
    sessionFactory.setDataSource(securityDataSource());
    sessionFactory.setPackagesToScan(env.getProperty("hiberante.packagesToScan"));
    sessionFactory.setHibernateProperties(getHibernateProperties());

    return sessionFactory;
}

@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {

    // setup transaction manager based on session factory
    HibernateTransactionManager txManager = new HibernateTransactionManager();
    txManager.setSessionFactory(sessionFactory);

    return txManager;
}   

我假设transactionManager()它的论点来自sessionFactory(). 但sessionFactory()不返回SessionFactory 实例,它返回LocalSessionFactoryBean. LocalSessionFactoryBean也没有实现,SessionFactory它实现了FactoryBean<SessionFactory>.

在这种情况下,不transactionManager()应该使用参数类型LocalSessionFactoryBeanFactoryBean<SessionFactory>代替SessionFactory? 喜欢:transactionManager(FactoryBean<SessionFactory> sessionFactory)

我对如何transactionManager()获得它的依赖感到困惑。

谢谢,

标签: springdependency-injectionautowired

解决方案


如果我理解正确,您是在告诉 spring 使用通过 LocalSessionFactoryBean 提供的配置为您创建会话工厂,请参阅此处的详细信息,它会为您创建休眠会话工厂并自动连接它。实际上,它的 Spring 框架常见做法是通过让您使用最少的代码创建会话工厂来节省开发人员的工作。


推荐阅读