栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

无论如何将内部类@ Inject / @ Autowire转换为外部类?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

无论如何将内部类@ Inject / @ Autowire转换为外部类?

可以通过

@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可以将其注入内部类的构造函数中。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/498074.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号