Spring Boot - 访问servlet中的组件

时间:2015-08-25 17:00:20

标签: spring servlets spring-boot

我有一个春季启动应用程序,为我的基于运动衫的API提供服务。我要求服务层将blob数据作为流提供给客户端。我写了一个servlet来做到这一点,并按如下方式配置它。

    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        return new ServletRegistrationBean(new BlobReaderServlet(),"/blobReader/*");
    }

但是,在servlet代码中,我似乎无法注入任何组件(它们都是null)。我需要注入一个实际从数据库加载blob数据的组件。

@WebServlet(name = "BlobReaderServlet",
        urlPatterns = {"/blobreader"})
@Component
public class BlobReaderServlet extends HttpServlet {

    Logger logger = Logger.getLogger(this.getClass().getName());

    @Inject
    DocumentLoaderComponent blobLoader;

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

我强烈怀疑servlet毕竟不是一个弹簧管理组件,并且依赖注入不起作用。如何从上下文访问组件?

更新

这比我想象的要简单得多。

@Override
    public void init() throws ServletException {
        ApplicationContext ac = (ApplicationContext) getServletConfig().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
        this.documentBlob = (DocumentBlob) ac.getBean("documentBlobBean");
    }

1 个答案:

答案 0 :(得分:1)

您的servlet不是Spring托管bean,这是正确的。那是因为您直接实例化实例(即在bean方法中调用new BlobReaderServlet())。另一种解决方案是按如下方式更改配置类:

@Bean
public ServletRegistrationBean servletRegistrationBean(){
    return new ServletRegistrationBean(blobReaderServlet(),"/blobReader/*");
}

@Bean
public BlobReaderServlet blobReaderServlet(){
    return new BlobReaderServlet();
}

这将允许Spring管理实例并对其执行自动装配。