当前位置: 首页 > news >正文

@Autowired原理(三)

         今天接着讲@Autowired注解,对于集合以及数组的成员变量,怎么通过@Autowired的方式注入。

package com.example.springdemo.demos.a16;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.DependencyDescriptor;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.List;@Configuration
public class TestAutowired2 {public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestAutowired2.class);DefaultListableBeanFactory factory = context.getDefaultListableBeanFactory();//1.解析数组类型的依赖注入testArray(factory);//2.解析集合类型的依赖注入testList(factory);}private static void testArray(DefaultListableBeanFactory factory) throws NoSuchFieldException {DependencyDescriptor descriptor = new DependencyDescriptor(Target.class.getDeclaredField("serviceArray"), true);if(descriptor.getDependencyType().isArray()){Class<?> componentType = descriptor.getDependencyType().getComponentType();System.out.println(componentType);String[] names = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(factory, componentType);List<Object> beans = new ArrayList<>();for (String name : names){System.out.println(name);Object bean = descriptor.resolveCandidate(name,componentType, factory);beans.add(bean);}Object array = factory.getTypeConverter().convertIfNecessary(beans, descriptor.getDependencyType());System.out.println(array);}}private static void testList(DefaultListableBeanFactory beanFactory) throws NoSuchFieldException {DependencyDescriptor dd2 = new DependencyDescriptor(Target.class.getDeclaredField("serviceList"),true);if(dd2.getDependencyType() == List.class){Class<?> resolve = dd2.getResolvableType().getGeneric().resolve();System.out.println(resolve);List<Object> list = new ArrayList<>();String[] names = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(beanFactory, resolve);for (String name : names){Object bean = dd2.resolveCandidate(name,resolve,beanFactory);list.add(bean);}System.out.println(list);}}@Componentstatic class Target {@Autowired private Service[] serviceArray;@Autowired private List<Service> serviceList;}interface Service{}@Component("service1")static class Service1 implements Service{private String name;}@Component("service2")static class Service2 implements Service{private String name;}@Component("service3")static class Service3 implements Service{private String name;}}

1.解析数组类型的注入

         首先使用descriptor.getDependencyType()拿到变量的类型,通过descriptor.getDependencyType().getComponentType()拿到数组里面元素的类型,然后通过

BeanFactoryUtils.beanNamesForTypeIncludingAncestors(factory, componentType)方法拿到数组里面的元素的名字。最后使用descriptor.resolveCandidate(name,componentType, factory)获取bean对象。

2.解析集合类型的注入

         同样是先拿到@Autowired注解下的变量类型,判断是否是集合,使用dd2.getResolvableType().getGeneric().resolve()拿到集合里面的泛型类型,然后通过BeanFactoryUtils.beanNamesForTypeIncludingAncestors(beanFactory, resolve)拿到集合里面所有元素的名字,最后通过dd2.resolveCandidate(name,resolve,beanFactory)获取所有的bean对象。

打印结果:

http://www.dtcms.com/a/365933.html

相关文章:

  • 【Qt中信号槽连接connect有接收者和无接收者的区别】
  • LeetCode 20.有效的符号算法解析及栈的相关知识
  • FTL文件格式的原理与应用(AI)
  • 【工具变量】上市公司绿色供应链管理示范企业DID数据(2010-2024年)
  • AUTOSAR进阶图解==>AUTOSAR_TPS_ARXMLSerializationRules
  • Linux学习-硬件
  • 2025年IT行业入门级证书选择与分析
  • 从竞态到原子:pread/pwrite 如何重塑高效文件 I/O?
  • 深入浅出:YOLOv8性能评估指标与电科金仓2025AI新成果
  • SuperMap GIS基础产品FAQ集锦(20250819)
  • C++----模板特化以及模板声明与定义分离问题
  • 2025 大学生必考 IT 行业证书
  • BigemapPro中的坐标定位于与拾取
  • NuttX编译流程与config.h生成解析
  • STM32G4 电流环闭环
  • Springboot3+SpringSecurity6Oauth2+vue3前后端分离认证授权-授权服务
  • 后端框架(SpringBoot):自动配置的底层执行流程
  • 2025年经管专业人士证书选择与分析
  • 深入理解Cloudflare错误1006、1007和1008:原因、解决方案和预防措施
  • Android创建demo脚本
  • 比亚迪欧洲逆袭特斯拉,新能源出海新纪录!
  • Redis 哨兵模式(Sentinel Mode)
  • Reflection反射
  • rsync + lsyncd 的高效文件实时同步系统
  • Docker Pull 代理配置方法
  • 投影矩阵:计算机图形学中的三维到二维转换
  • GDAL 下载安装
  • 【深度学习新浪潮】用3DGS做三维重建有哪些主要的技术路线可供选择?
  • 论文介绍:“DUSt3R”,让 3D 视觉从“繁琐”走向“直观”
  • Redis初阶学习