将文件资源注入Spring bean


问题内容

将一些文件资源注入Spring bean的好方法是什么?现在我自动连接ServletContext并使用如下。在Spring MVC中,这样做是否更优雅?

@Controller
public class SomeController {

    @Autowired
    private ServletContext servletContext;

    @RequestMapping("/texts")
    public ModelAndView texts() {
        InputStream in = servletContext.getResourceAsStream("/WEB-INF/file.txt");
        // ...
    }
}

问题答案:

像这样:

@Controller
public class SomeController {

    private Resource resource;

    public void setResource(Resource resource) {
        this.resource = resource;
    }

    @RequestMapping("/texts")
    public ModelAndView texts() {
        InputStream in = resource.getInputStream();
        // ...
        in.close();
    }
}

在您的bean定义中:

<bean id="..." class="x.y.SomeController">
   <property name="resource" value="/WEB-INF/file.txt"/>
</bean>

这将创建一个ServletContextResource使用/WEB-INF/file.txt路径,并将其注入到您的控制器中。

注意,使用这种技术不能使用组件扫描来检测控制器,您需要一个显式的bean定义。