如何将 jndi 查找从 xml 转换为 java 配置
how to convert jndi lookup from xml to 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>
到目前为止我成功地转换了这段代码:
<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;
}
还有这个:
<beans:bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate" >
<beans:property name="dataSource" ref="dbDataSource"></beans:property>
</beans:bean>
对此:
@Bean(name = "jdbcTemplate")
public JdbcTemplate jdbcTemplate() {
JdbcTemplate jt = new JdbcTemplate();
jt.setDataSource(dataSource);
return jt;
}
问题是方法 setDataSource() 需要 DataSource 对象,但我不确定如何关联两者 bean.How 以将 JndiObjectFactoryBean 传递给 DataSource?
或者我需要使用其他方法吗?
附加问题:
bean.setJndiName("${db.jndi}")
, ${db.jndi} 是指属性文件,但我总是得到 NameNotFoundException , 如何让它发挥作用?
谢谢!!
使用 JndiDataSourceLookup
代替 JndiObjectFactoryBean
。要在方法中使用 ${db.jndi}
声明一个方法参数并用 @Value
.
注释它
@Bean(name = "dbDataSource")
public DataSource dataSource(@Value("${db.jndi}") String jndiName) {
JndiDataSourceLookup lookup = new JndiDataSourceLookup();
return lookup.getDataSource(jndiName);
}
Autowired methods and constructors can also use the @Value
annotation. -- Spring Reference Guide.
@Bean
方法基本上是工厂方法,也是自动连接方法,因此属于这一类。
在 JdbcTemplate
的工厂方法中,您可以简单地使用 DataSource
方法参数来获取对数据源的引用(如果有多个,您可以使用 @Qualifier
指定要使用的方法参数)。
@Bean
public JdbcTemplate jdbcTemplate(DataSource ds) {
return new JdbcTemplate(ds);
}
目前我正在将 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>
到目前为止我成功地转换了这段代码:
<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;
}
还有这个:
<beans:bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate" >
<beans:property name="dataSource" ref="dbDataSource"></beans:property>
</beans:bean>
对此:
@Bean(name = "jdbcTemplate")
public JdbcTemplate jdbcTemplate() {
JdbcTemplate jt = new JdbcTemplate();
jt.setDataSource(dataSource);
return jt;
}
问题是方法 setDataSource() 需要 DataSource 对象,但我不确定如何关联两者 bean.How 以将 JndiObjectFactoryBean 传递给 DataSource?
或者我需要使用其他方法吗?
附加问题:
bean.setJndiName("${db.jndi}")
, ${db.jndi} 是指属性文件,但我总是得到 NameNotFoundException , 如何让它发挥作用?
谢谢!!
使用 JndiDataSourceLookup
代替 JndiObjectFactoryBean
。要在方法中使用 ${db.jndi}
声明一个方法参数并用 @Value
.
@Bean(name = "dbDataSource")
public DataSource dataSource(@Value("${db.jndi}") String jndiName) {
JndiDataSourceLookup lookup = new JndiDataSourceLookup();
return lookup.getDataSource(jndiName);
}
Autowired methods and constructors can also use the
@Value
annotation. -- Spring Reference Guide.
@Bean
方法基本上是工厂方法,也是自动连接方法,因此属于这一类。
在 JdbcTemplate
的工厂方法中,您可以简单地使用 DataSource
方法参数来获取对数据源的引用(如果有多个,您可以使用 @Qualifier
指定要使用的方法参数)。
@Bean
public JdbcTemplate jdbcTemplate(DataSource ds) {
return new JdbcTemplate(ds);
}