如何使用@Autowired而不是手动加载Spring bean?

时间:2016-08-17 22:58:05

标签: java spring dependency-injection jndi autowired

我有一个连接MySQL数据库的小型Java应用程序。对于数据库连接 ONLY ,我想使用Spring来管理基于JNDI的连接池。

我有上面的工作实现,但这需要手动加载JNDI连接bean,而我想使用@Autowired。

如何将我的工作代码转换为使用@Autowired来获取JNDI连接的代码?

这是我的beans.xml文件(在src / main / resources文件夹中):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns= ....>

   <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/Database"/>
    </bean>

   <bean id="databaseMapper2Impl" 
      class="com.dataaccess.DatabaseMapper2Impl">
      <property name="dataSource"  ref="dataSource" />    
   </bean>

</beans>

这是我DatabaseMapper2Impl班的一部分:

public class DatabaseMapper2Impl {

    private DataSource dataSource;
    private JdbcTemplate jdbcTemplateObject;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
        this.jdbcTemplateObject = new JdbcTemplate(dataSource);
    }

    public OrderDTO getOrder(String orderNumber, String envToUse) {

        String getOrderSql = "SELECT * FROM REPORTING.ORDER where ORDER_NUMBER = ? limit 1";
        List<OrderDTO> orders = jdbcTemplateObject.query(getOrderSql, new Object[] { orderNumber }, new OrderMapper());
        if (orders == null || orders.isEmpty()) {
            return null;
        } else {
            return orders.get(0);
        }
    }
}

这是手动实例化JNDI连接bean的类:

public class DataDelegateImpl {

    public OrderDTO getOrder(String orderNumber, String envToUse) {

        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
        DatabaseMapper2Impl x = (DatabaseMapper2Impl) context.getBean("databaseMapper2Impl");
        return x.getOrder(orderNumber, envToUse);
    }
}

1 个答案:

答案 0 :(得分:0)

为了让Spring管理你的DatabaseMapper2Impl bean的实例化和注入,你必须创建一个ApplicationContext,然后在那个环境中声明bean,就像你一样。

如果问题是如何避免将XML用于该声明,则可以使用DatabaseMapper2Impl注释@Component,而不是使用

ApplicationContext context = new AnnotationConfigApplicationContext(DatabaseMapper2Impl.class);

创建上下文。

如果您确实需要将DatabaseMapper2Impl @Autowired放入DataDelegateImpl的实例中,那么该实例也必须由Spring控制,因此您必须创建更高级别的上下文,并使DataDelegateImpl成为一个bean。