How does Wicket's @SpringBean annotation work?
How does Wicket's @SpringBean
annotation work? Does it use reflection at run time? Does it make the compiler inject some code开发者_如何学C? Or what?
@SpringBean
works using Wicket's underlying Injector mechanism. When you instantiate a Wicket component, the constructor of Wicket's component base class introspects the class being instantiated, looking for the @SpringBean
annotation. If the bean is found, then Wicket generates a proxy for the spring bean and injects it into the component's field. This is Wicket's equivalent of Spring's @Autowired
annotation, the effect is similar.
It doesn't, however, have anything to do with Spring's own context/classpath scanning functionality (e.g. @Component
), which is about auto-discovery of what is and isn't a bean, rather having anything to do with wiring.
The class marked with a @SpringBean annotation has to have one of:
- A no-args constructor
- A superclass with a no-args constructor
- Implement an interface
An exception will be thrown if these conditions are not met as Wicket will not be able to proxy the class.
Spring uses the class loader and ASM at runtime to find all annotated classes.
You can configure where spring should search for beans:
<context:component-scan base-package="some.package.to.start.from"/>
This uses the ClassPathBeanDefinitionScanner internally which will use the PathMatchingResourcePatternResolver to find the classes and the ASM-based MetadataReader to read the annotations.
精彩评论