如何在spring应用程序的servlet过滤器中自动装配bean?

bra*_*orm 5 spring dependency-injection spring-mvc autowired spring-boot

我有一个spring-boot申请.

我的项目中没有ApplicationContext.xml或没有web.xml文件.我更喜欢避免使用它们并在Java代码中配置所有内容.

我已经阅读了以下有关servlet过滤器中bean注入的帖子.

  1. 如何在servlet过滤器中获取Spring bean?

  2. http://www.deadcoderising.com/2015-05-04-dependency-injection-into-filters-using-delegatingfilterproxy/

  3. servlet过滤器中的弹簧注入

读完之后,我开始使用了DelegatingFilterProxy.

我的问题是如何autowire将bean转换为过滤器并避免使用xml文件,尤其是DelegatingFilterProxy配置.

剪切的代码可以从github中托管的第二篇文章中获得.

public class AuditHandler {

    public void auditRequest(String appName, ServletRequest request) {
        System.out.println(appName + ": Received request from " + request.getRemoteAddr() );
    }
}

public class AuditFilter implements Filter {

    private final AuditHandler auditHandler;
    private String appName;

    public AuditFilter(AuditHandler auditHandler) {
        this.auditHandler = auditHandler;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        auditHandler.auditRequest(appName, request);
        chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        appName = filterConfig.getInitParameter("appName");
    }

    public void destroy() {}
}

ApplicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="auditHandler" class="com.deadcoderising.AuditHandler">
    </bean>

    <bean id="auditFilter" class="com.deadcoderising.AuditFilter">
        <constructor-arg ref="auditHandler"/>
    </bean>
</beans>

web.xml

<web-app version="3.0"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         metadata-complete="true">

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext*.xml</param-value>
    </context-param>


    <filter>
        <filter-name>auditFilter</filter-name>
        <filter-class>
            org.springframework.web.filter.DelegatingFilterProxy
        </filter-class>
        <init-param>
            <param-name>targetFilterLifecycle</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>appName</param-name>
            <param-value>di-example</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>auditFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>
Run Code Online (Sandbox Code Playgroud)

mzc*_*mzc 6

您应该FilterRegistrationBean在主Application类(带注释的类@SpringBootApplication)中添加一个,并让Spring提供以下实例AuditHandler:

@Bean
@Autowired
public FilterRegistrationBean auditFilterRegistration(AuditHandler handler) {
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    filterRegistrationBean.setFilter(new AuditFilter(handler));
    filterRegistrationBean.setOrder(3); // ordering in the filter chain
    return filterRegistrationBean;
}
Run Code Online (Sandbox Code Playgroud)

如果这不起作用(例如,您的AuditHandler实现没有正确注释或者它不在默认包扫描路径上),您可以指示Spring提供它(也在您的@SpringBootApplication注释类中):

@Bean
public AuditHandler auditHandler() {
    return new AuditHandlerImplementation();
}
Run Code Online (Sandbox Code Playgroud)