【问题标题】:Injecting a service in spring boot filter在 Spring Boot 过滤器中注入服务
【发布时间】:2019-04-14 22:58:42
【问题描述】:

有一个自动装配服务的过滤器。 我将服务作为构造函数参数注入 - 从注册过滤器的配置中。

MyFilter implements Filter {
    private final ServiceToBeInjected serviceToBeInjected;

    public MyFilter(ServiceToBeInjected serviceToBeInjected) {
        this.serviceToBeInjected = serviceToBeInjected;
    }
}

public class ConfigClass {
    private final ServiceToBeInjected serviceToBeInjected;

    @Autowired
    public ConfigClass(ServiceToBeInjected serviceToBeInjected) {
        this.serviceToBeInjected = serviceToBeInjected;
    }

    @Bean
    public FilterRegistrationBean<MyFilter> filterRegistrationBean() {
        final FilterRegistrationBean<MyFilter> filterRegBean = new FilterRegistrationBean<>();
        filterRegBean.setFilter(new MyFilter(serviceToBeInjected));
        filterRegBean.addUrlPatterns(");    
        return filterRegBean;
    }
}

我觉得从配置自动装配可能不太好。 还有其他更好的方法吗?

【问题讨论】:

标签: java spring-boot dependency-injection autowired


【解决方案1】:

如果MyFilter 只构造一次(单例),那么它可以是一个组件,这意味着它将被隐式自动装配。

@Component
MyFilter implements Filter {
    private final ServiceToBeInjected;

    // Autowired implicitly
    public MyFilter(ServiceToBeInjected serviceToBeInjected) {
        this.serviceToBeInjected = serviceToBeInjected;
    }
}

然后您的 bean 可以将过滤器作为方法参数

public class ConfigClass {
    @Bean
    public FilterRegistrationBean<MyFilter> foo(final MyFilter filter) {
        final FilterRegistrationBean<MyFilter> bean = new FilterRegistrationBean<>();
        bean.setFilter(filter);
        bean.addUrlPatterns("");
        return bean;
    }
}

如果MyFilter 需要构造不止一次,那么你所做的就很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 2016-08-16
    • 2018-07-05
    • 2019-10-01
    • 2019-12-23
    • 2015-04-09
    • 1970-01-01
    • 2016-07-06
    相关资源
    最近更新 更多