SpringBoot复习:(10)SpringApplication中的initializer成员变量是怎么初始化的?

initializers成员变量定义如下:
在这里插入图片描述

在构造方法里通过setInitializers
在这里插入图片描述
setInitializers的代码很简单:
在这里插入图片描述
其中的参数通过getSpringFactoriesInstances来获取的,该方法的代码如下:
在这里插入图片描述
其中调用的重载的方法代码如下:
在这里插入图片描述
它调用了SpringFactoriesLoader的静态方法loadFactoryNames方法,其代码如下:
在这里插入图片描述
它所调用的loadSpringFactories代码如下:

	private static Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) {
		Map<String, List<String>> result = cache.get(classLoader);
		if (result != null) {
			return result;
		}

		result = new HashMap<>();
		try {
			Enumeration<URL> urls = classLoader.getResources(FACTORIES_RESOURCE_LOCATION);
			while (urls.hasMoreElements()) {
				URL url = urls.nextElement();
				UrlResource resource = new UrlResource(url);
				Properties properties = PropertiesLoaderUtils.loadProperties(resource);
				for (Map.Entry<?, ?> entry : properties.entrySet()) {
					String factoryTypeName = ((String) entry.getKey()).trim();
					String[] factoryImplementationNames =
							StringUtils.commaDelimitedListToStringArray((String) entry.getValue());
					for (String factoryImplementationName : factoryImplementationNames) {
						result.computeIfAbsent(factoryTypeName, key -> new ArrayList<>())
								.add(factoryImplementationName.trim());
					}
				}
			}

			// Replace all lists with unmodifiable lists containing unique elements
			result.replaceAll((factoryType, implementations) -> implementations.stream().distinct()
					.collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList)));
			cache.put(classLoader, result);
		}
		catch (IOException ex) {
			throw new IllegalArgumentException("Unable to load factories from location [" +
					FACTORIES_RESOURCE_LOCATION + "]", ex);
		}
		return result;
	}

其中包含如下代码片段:
在这里插入图片描述
FACTORIES_RESOURCE_LOCATION 常量值为 “META-INF/spring.factories”,该方法给调用者返回一个List,
然后接着往下执行:
在这里插入图片描述
createSpringFactoriesInstances通过反射生成factories对象实例,
在这里插入图片描述

然后这个方法返回一个List,最后setInitializers方法把这个List设置到SpringApplication的成员变量initializers
在这里插入图片描述

在 C++ ,类成员变量可以通过几种方式进行初始化: 1. **默认初始化**(Member Variables without Initializer): 当没有指定初始值时,基本数据类型的成员变量会被隐式地设置为它们的默认值(例如,整数为0,浮点数为0.0等),而引用、指针、对象则通常会设置为 `nullptr` 或空的对象。 ```cpp class MyClass { public: int myInt; // 默认初始化为0 // ... }; ``` 2. **赋值初始化**(Initialization with a Value): 直接在声明时给成员变量赋值,这被称为初始化列表。 ```cpp class MyClass { public: MyClass() : myInt(10), myString("Hello") {} // 使用初始化列表 int myInt; // 赋值为10 std::string myString; // 赋值为"Hello" }; ``` 3. **构造函数内初始化**(Initialization in Constructor Body): 也可以在类的构造函数体内部对成员变量进行初始化。 ```cpp class MyClass { public: MyClass(int initialValue) : myInt(initialValue), myString("Initial String") {} int myInt; std::string myString; }; ``` 4. **构造函数外部初始化**(Field Initializers): C++17 引入了字段初始化,允许在声明时直接初始化成员变量,这称为静态初始化(Static Initialization)。 ```cpp class MyClass { public: MyClass() : myInt{10}, myString{"Static Init"} {} static int myInt; // 静态变量 std::string myString; }; MyClass::myInt = 0; // 初始化静态变量 ``` 注意:对于复杂的结构或动态分配内存的变量,通常在构造函数完成初始化以保证资源管理的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值