Внедрение службы в весенний загрузочный фильтр - PullRequest
0 голосов
/ 12 ноября 2018

Имейте фильтр, где служба подключена автоматически. Я внедряю сервис в качестве аргумента конструктора - из конфига, где зарегистрирован фильтр.

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;
    }
}

Я чувствовал, что автоматическое подключение из конфига может быть не очень хорошим. Есть ли другой лучший способ?

1 Ответ

0 голосов
/ 12 ноября 2018

Если MyFilter создается только один раз (одноэлементно), то он может быть компонентом, что означает, что он будет автоматически подключен автоматически.

@Component
MyFilter implements Filter {
    private final ServiceToBeInjected;

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

Ваш компонент может затем использовать фильтр в качестве параметра метода

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 нужно построить более одного раза, то то, что вы сделали, прекрасно.

...