2017-06-16 62 views
0

我想我dataSource豆注入到我的以下配置sessionFactory豆:如何注入豆成另一种基于消气豆

@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

你可以通过几种方式来做到这一点。我正在简化下面的例子以包含所有案例。

方法#1 - 自动注射按类型

@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 - 明确注射液类型

@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 - 注射液名称 你正在尝试这一个

@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 - 非注射/显式方法调用

@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); 
    } 
} 
1

下面的代码应该工作

@Configuration 
public class HibernateConfig { 

    @Bean(name = "dataSource") 
    public javax.sql.DataSource getDataSource() { 
     ComboPooledDataSource dataSource = new ComboPooledDataSource(); 
     return dataSource; 
    } 

    @Bean(name = "sessionFactory") 
    @Scope("singleton") 
    public FactoryBean<SessionFactory> getSessionFactory(javax.sql.DataSource dataSource){ 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(dataSource); 
     return sessionFactory; 
    } 
} 

Spring提供了一个机制,我们可以通过这样的bean的依赖与@Bean方法参数。它们被框架注入,就像构造函数依赖关系被解析一样。