如何将jndi查找从xml转换为java配置

Fre*_*ezY 9 java spring spring-java-config

目前我正在将xml转换为java配置.但我坚持了几天,我已经研究了几天.这里的问题是:

Xml配置:

     <jee:jndi-lookup id="dbDataSource" jndi-name="${db.jndi}" resource-ref="true" />

     <beans:bean id="jdbcTemplate"
     class="org.springframework.jdbc.core.JdbcTemplate" >
     <beans:property name="dataSource" ref="dbDataSource"></beans:property>
     </beans:bean>
Run Code Online (Sandbox Code Playgroud)

到目前为止,我设法转换此代码:

<jee:jndi-lookup id="dbDataSource" jndi-name="${db.jndi}" resource-ref="true" />

对此:

@Bean(name = "dbDataSource")
public JndiObjectFactoryBean dataSource() {
   JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
   bean.setJndiName("${db.jndi}");
   bean.setResourceRef(true); 
   return bean; 
}
Run Code Online (Sandbox Code Playgroud)

还有这个 :

     <beans:bean id="jdbcTemplate"
     class="org.springframework.jdbc.core.JdbcTemplate" >
     <beans:property name="dataSource" ref="dbDataSource"></beans:property>
     </beans:bean>
Run Code Online (Sandbox Code Playgroud)

对此:

@Bean(name = "jdbcTemplate")
public JdbcTemplate jdbcTemplate() { 
   JdbcTemplate jt = new JdbcTemplate();
    jt.setDataSource(dataSource);
    return jt;
   }
Run Code Online (Sandbox Code Playgroud)

问题是该方法的setDataSource()需要DataSource对象,但我不知道如何与两个bean.How到JndiObjectFactoryBean中传递给数据源?

或者我需要使用其他方法吗?

额外问题:

bean.setJndiName("${db.jndi}"),$ {} db.jndi是指属性文件,但我总是得到的NameNotFoundException,如何使它工作?

谢谢!!

M. *_*num 16

而不是JndiObjectFactoryBean使用一个JndiDataSourceLookup代替.要${db.jndi}在方法中使用,请声明一个方法参数并使用它进行注释@Value.

@Bean(name = "dbDataSource")
public DataSource dataSource(@Value("${db.jndi}" String jndiName) {
    JndiDataSourceLookup lookup = new JndiDataSourceLookup();
    return lookup.getDataSource(jndiName);
}
Run Code Online (Sandbox Code Playgroud)

自动化方法和构造函数也可以使用@Value注释. - 春季参考指南.

@Bean 方法基本上是工厂方法,也是自动连线方法,因此属于这一类.

在您的工厂方法中,JdbcTemplate您可以简单地使用DataSource方法参数来获取对数据源的引用(如果您有多个,则可以使用@Qualifier方法参数来指定要使用的方法).

@Bean
public JdbcTemplate jdbcTemplate(DataSource ds) { 
    return new JdbcTemplate(ds);
}
Run Code Online (Sandbox Code Playgroud)