12

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

Tarquila
  • 1,167
  • 3
  • 11
  • 17
  • 1
    There is no `@SpringBean` annotation in the Spring API. There is one in Wicket, though, is that what you're using? – skaffman Dec 23 '09 at 12:08
  • 1
    Ah, I didn't know that - yes I am using Wicket. I'll change the question and tags to reflect that. Thanks. – Tarquila Dec 23 '09 at 13:08
  • @Tarquila - I think it's easier to fix this question for spring. And add a new one for Wicket. – Thomas Jung Dec 23 '09 at 13:38
  • 3
    I think the accepted answer for this question should be changed. @skaffman's answer seems to be the true correct answer. – Snekse Dec 15 '11 at 16:24

3 Answers3

29

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

A. Tapper
  • 1,261
  • 8
  • 17
skaffman
  • 398,947
  • 96
  • 818
  • 769
  • 3
    To use this one only needs to add the SpringComponentInjector listener to the Wicket application to listen to component instantiations. – Matt Jan 09 '10 at 01:09
5

The class marked with a @SpringBean annotation has to have one of:

  1. A no-args constructor
  2. A superclass with a no-args constructor
  3. Implement an interface

An exception will be thrown if these conditions are not met as Wicket will not be able to proxy the class.

Rod
  • 63
  • 1
  • 3
  • 1
    this is useful information but not really an answer to the question. it might be better as a comment the question or another answer. – Martin Serrano Oct 26 '12 at 23:59
0

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
  • 32,428
  • 9
  • 84
  • 114