关于Spring 3的另一个问题,servlet,@ autowired

时间:2011-03-17 15:16:36

标签: spring servlets datasource autowired

我想我已经阅读了Spring上的每一个问题和答案,并在这里和在Springsource.org上自动装配一个servlet,但我仍然无法使它工作。

我想要做的就是在我的servlet中自动设置数据源。我知道容器创建了servlet而不是Spring。

以下是我的测试servlet中的代码:

package mypackage.servlets;

imports go here...

@Service
public class TestServlet extends HttpServlet
{
  private JdbcTemplate _jt;

  @Autowired
  public void setDataSource(DataSource dataSource)
  {
    _jt = new JdbcTemplate(dataSource);
  }

  etc etc

在我的applicationContext.xml中,我有:

<context:annotation-config />
<context:component-scan base-package="mypackage.servlets />
<import resource="datasource.xml" />

并在我的datasource.xml中:

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/db" />

如果我无法实现这一点,我只会在servlet的init方法中使用WebApplicationContextUtils,但我真的很想在我所做的所有阅读之后完成这项工作。

我正在使用Spring 3,Java 1.6。

谢谢,

2 个答案:

答案 0 :(得分:1)

您需要通过Spring MVC控制器替换您的Servlet。因为Spring不会注入其他人创建的类(servlet),然后是Spring itselfe(除了@Configurable)。

(举一个非常简单的例子,看看STS Spring Template Project:MVC)。

答案 1 :(得分:0)

我想要做的是免费获取我的Servlet中的DataSource引用,即不在某些类上调用静态getDatasource方法。

以下是我学到的以及如何使其发挥作用:

Spring无法配置或自动装配Servlet。 Servlet是在加载Spring的应用程序上下文之前创建的。请参阅问题SPR-7801:https://jira.springsource.org/browse/SPR-7801

我所做的是在applicationContext.xml中创建一个DataSource并将其导出为属性:

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/db" />
<bean class="org.springframework.web.context.support.ServletContextAttributeExporter">
  <property name="attributes">
    <map>
      <entry key="myDatasource">
        <ref bean="dataSource"/>
      </entry>
    </map>
  </property>
</bean>

在我的servlet的init方法中,我读了属性:

public void init(ServletConfig config)
{
  Object obj = config.getServletContext().getAttribute("myDatasource");
  setDataSource((DataSource)obj);
}

public void setDataSource(DataSource datasource)
{
  // do something here with datasource, like 
  // store it or make a JdbcTemplate out of it
}

如果我一直在使用DAO而不是从servlet中访问数据库,那么通过将它们标记为@Configurable可以很容易地为@Autowired连接它们,并且还能够使用@Transactional和其他Spring好东西。< / p>