Introduction
I've struggled for weeks with wanting to use a constructor with arguments along with
Spring Annotations (in particular
@Autowired) but most
blog posts and tutorials say that this
isn't possible or needs to use
Spring Expressions.
Hypothesis
There has got to be some way to do this. The alternative I have been using was to have an
empty object autowired in and then manually run a bunch of setters to inject the required configuration. This ends up being error prone and verbose to verify (e.g. every public method has to check that the required fields are not null).
Results
After searching the web for a long time I finally found that you CAN use multi-argument constructors if you refrain from using the
@Component or @Service annotations and instead create the classes in a
@Configuration class with
@Bean annotations. After creating a class (manually, with new) you can autowire it by using
AutowireCapableBeanFactory.
autowireBean(Object) method.
Conclusion
My code is a lot more readable and simple now, and let me find a few subtle bugs that did not turn up in the unit tests. I ended up with complex object creation logic, but it is out in the @Configuration classes instead of inside of the core objects. I am much happier with this situation.
No comments:
Post a Comment