views:

738

answers:

2

How does Wicket's @SpringBean annotation work? Does it use reflection at run time? Does it make the compiler inject some code? Or what?

+1  A: 

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.

Thomas Jung
This mechanism doesn't have anything to do with `@SpringBean`, though, which is a Wicket construct, not a Spring one.
skaffman
I've never used Wicket. I thought he meant the @Component etc. annotations. Good to know.
Thomas Jung
+4  A: 

@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.

skaffman
To use this one only needs to add the SpringComponentInjector listener to the Wicket application to listen to component instantiations.
Matt