【问题标题】:How does Wicket's @SpringBean annotation work?Wicket 的@SpringBean 注解是如何工作的?
【发布时间】:2009-12-22 16:14:27
【问题描述】:

Wicket 的@SpringBean 注释是如何工作的?它在运行时使用反射吗?它会让编译器注入一些代码吗?还是什么?

【问题讨论】:

  • Spring API 中没有@SpringBean 注解。不过,Wicket 中有一个,您正在使用它吗?
  • 啊,我不知道 - 是的,我正在使用 Wicket。我将更改问题和标签以反映这一点。谢谢。
  • @Tarquila - 我认为在春季解决这个问题更容易。并为 Wicket 添加一个新的。
  • 我认为这个问题的公认答案应该改变。 @skaffman 的答案似乎是真正的正确答案。

标签: java spring wicket


【解决方案1】:

@SpringBean 使用 Wicket 的 underlying Injector mechanism 工作。当您实例化一个 Wicket 组件时,Wicket 的组件基类的构造函数会内省正在实例化的类,寻找@SpringBean 注释。如果找到了 bean,Wicket 会为 spring bean 生成一个代理,并将其注入到组件的字段中。这是Wicket相当于Spring的@Autowired注解,效果差不多。

然而,它与 Spring 自己的上下文/类路径扫描功能(例如 @Component)没有任何关系,它是关于自动发现什么是和不是 bean,而不是有任何事情要做带接线。

【讨论】:

  • 使用这个只需要在Wicket应用中添加SpringComponentInjector监听器即可监听组件实例化。
【解决方案2】:

标有@SpringBean 注解的类必须具有以下之一:

  1. 无参数构造函数
  2. 具有无参数构造函数的超类
  3. 实现接口

如果不满足这些条件,则会引发异常,因为 Wicket 将无法代理该类。

【讨论】:

  • 这是有用的信息,但并不是问题的真正答案。将问题或其他答案作为评论可能会更好。
【解决方案3】:

Spring 在运行时使用类加载器和 ASM 来查找所有带注释的类。

你可以configurespring应该在哪里搜索bean:

<context:component-scan base-package="some.package.to.start.from"/>

这在内部使用ClassPathBeanDefinitionScanner,它将使用PathMatchingResourcePatternResolver 来查找类,并使用基于ASM 的MetadataReader 来读取注释。

【讨论】:

  • 这种机制与 @SpringBean 没有任何关系,它是 Wicket 构造,而不是 Spring 构造。
  • 我从未使用过 Wicket。我以为他的意思是@Component 等注释。很高兴知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2015-09-29
  • 1970-01-01
相关资源
最近更新 更多