我想我已经阅读了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。
谢谢,
保
答案 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>