可以通过
@Component注释声明和实例化内部类Bean ,但是解决方案很丑陋,但稍后会介绍。首先,这是使用
<bean>XML声明的方法。给定
package com.example;public class Example { @Autowired private Inner inner; public class Inner { }}你会
<bean name="ex" /><bean name="inner" > <constructor-arg ref="ex"></constructor-arg></bean>
对于内部类,任何构造函数都隐式地将其第一个参数声明为封闭类型的实例。
所以
public Inner() {}以上实际上将被编译为
public Inner (Example enclosingInstance) {}使用Java代码时,语法将隐式提供该参数的参数
enclosingInstance.new Inner();
Spring使用反射来实例化bean类并初始化bean。并且这里描述的概念也适用于反射。将
Constructor用于初始化
Inner类必须具有其第一个参数是封闭类的类型。这就是我们在这里通过声明一个
constructor-arg。
使用的解决方案
@Component取决于几件事。首先,您必须了解上面讨论的所有内容。基本上,对于一个
Constructor对象,在调用时
newInstance(),您需要传递封闭类的实例作为第一个参数。其次,您必须知道Spring如何处理注释。当带注释的类有一个带注释
@Autowired的构造函数时,它将选择初始化Bean的构造函数。它还使用
ApplicationContext解析豆子作为构造函数的参数注入。
根据这两个事实,您可以编写这样的类
@Componentpublic class Example { @Component public class Inner { @Autowired public Inner() {} }}在这里,我们的内部类具有
@Autowired构造函数,因此Spring确切知道
Constructor要使用哪个对象。因此,
@Autowired它还会尝试从中找到一个bean
ApplicationContext来匹配并为构造函数具有的每个参数注入。在这种情况下,唯一的参数是type
Example,即封闭类。由于
Example也用注释
@Component,它也是上下文中的bean,因此Spring可以将其注入内部类的构造函数中。



