java - 如何将一个 bean 注入(inject)另一个基于 getter 的 bean

标签 java spring hibernate dependency-injection

我想按照以下配置将我的 dataSource bean 注入(inject)到我的 sessionFactory bean 中:

@Configuration
public class HibernateConfig {

    @Bean(name="dataSource")
    public javax.sql.DataSource getDataSource(){
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //set dataSource parameters from a .properties file
        return dataSource;
    }

    @Bean(name="sessionFactory")
    @Scope("singleton")
    public  FactoryBean<SessionFactory> getSessionFactory(){
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        //How to reference/inject/autowire the dataSource bean declared above in the sessionFactory#dataSource property ??
        return sessionFactory;
    }
}

请问我该如何实现这一目标?

最佳答案

您可以通过几种方式做到这一点。我在下面进行了简化,以包含所有带有工作示例的案例。

方法#1 - 按类型自动注入(inject)

@Configuration
public class HibernateConfig {

    @Bean
    public A getMyA() {
        return new A();
    }

    @Bean
    public B getMyB(A a) {
        System.out.println(a != null);
        return new B();
    }
}

class A {}
class B {}

方法 #2 - 按类型显式注入(inject)

@Configuration
public class HibernateConfig {

    @Bean
    public A getMyA() {
        return new A();
    }

    @Bean
    @Autowired
    public B getMyB(A a) {
        System.out.println(a != null);
        return new B();
    }
}

class A {}
class B {}

方法 #3 - 按名称注入(inject) 您正在尝试这个

@Configuration
public class HibernateConfig {

    @Bean(name = "myOtherBeanName")
    public A getMyA() {
        return new A();
    }

    @Bean
    @Autowired
    public B getMyB(@Qualifier("myOtherBeanName") A a) {
        System.out.println(a != null);
        return new B();
    }
}

class A {}
class B {}

方法 #4 - 非注入(inject)/显式方法调用

@Configuration
public class HibernateConfig {

    @Bean(name = "myOtherBeanName")
    public A getMyA() {
        return new A();
    }

    @Bean
    public B getMyB() {
        // call me as usual - getMyA()
        return new B();
    }
}

class A {}
class B {}

有很多方式它真正成为品味/偏好的问题。

以上所有内容都可以使用最小的主类进行测试运行:

public class Main {

    public static void main(String[] args) {
        new AnnotationConfigApplicationContext(HibernateConfig.class);
    }
}

关于java - 如何将一个 bean 注入(inject)另一个基于 getter 的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44586345/

相关文章:

java - 初始化数组中的 int

java - 如何将 Maven 添加到 IntelliJ 中现有的 Java Web 应用程序?

Spring集成计划作业

java - Hibernate 搜索前缀

java - 声明已关闭

java - Firebase找不到引用的方法

java - 将 HashMap 键值 (String) 转换为 Vector <String>?

java - 如何将 spring bean 注入(inject) jersey 的资源类中?

java - 为什么 UTF8 字符编码在我的项目中无法正常工作?

hibernate - 为什么 Envers 为每个表创建一个审计表