0

Have a filter where a service is autowired. I am injecting the service as constructor argument - from the config where filter is registered.

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

I kind of felt autowiring from config might not be good. Is there any other better way ?

igr
  • 10,199
  • 13
  • 65
  • 111
Parameswar
  • 1,951
  • 9
  • 34
  • 57
  • Please learn correct indentation. It was unreadable. Fixed it for you this time. – Michael Nov 12 '18 at 08:51
  • `filter` is a class? see https://stackoverflow.com/questions/32494398/unable-to-autowire-the-service-inside-my-authentication-filter-in-spring – Ori Marko Nov 12 '18 at 08:53

1 Answers1

1

If MyFilter is only constructed once (a singleton) then it can be a component, which means it will be autowired implicitly.

@Component
MyFilter implements Filter {
    private final ServiceToBeInjected;

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

Your bean can then take the filter as a method parameter

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

If MyFilter needs to be constructed more than once then what you've done is fine.

Michael
  • 41,989
  • 11
  • 82
  • 128