Spring的源码浅析

由于博客内容为空,暂无法提供包含关键信息的摘要。
package cn.lzx.spring;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;


/**
 * <pre>
 *     总结:
 *     1. Spring容器在启动的时候,先回保存所有注册进行的bean的定义信息
 *      1.1. xml注册的bean
 *      1.2. @Service,@Bean标注的bean
 *     2. spring容器会在合适的时候创建这些bean
 *      2.1. 用到这个bean的时候,利用getBean创建这个bean,并加入单例池
 *      2.2. 最后会统一创建剩下的bean
 *     3. 后置处理器
 *      3.1. 每一个bean创建完成之后,都会使用各种后置处理器进行处理,来增强bean的功能
 *      3.2. 例如属性注入的 AutowiredAnnotationBeanPostProcessor
 *      3.3. public AutowiredAnnotationBeanPostProcessor() {
 * 		        this.autowiredAnnotationTypes.add(Autowired.class);
 * 		        this.autowiredAnnotationTypes.add(Value.class);
 * 		      }
 * 		3.4. AnnotationAwareAspectJAutoProxyCreator aop的后置处理器,创建代理对象的后置处理器
 * 	   4. 事件驱动模型
 * 	    4.1. ApplicationListener 事件监听器
 * 	    4.2. ApplicationEventMulticaster事件派发器
 *
 *
 *
 * </pre>
 * <pre>
 *  // 刷新IOC容器
 *  1. refresh()
 *      // 预刷新处理
 *      =======================================对上下文环境,初始化属性,早期的事件进行预处理=====================================
 *      1.1. prepareRefresh();
 *          // 初始化资源文件,属性设置,留给子类实现(父类空实现)
 *          1.1.1. initPropertySources();
 *          // 通过属性解析器,对上面初始化的属性就行校验操作
 *          1.1.2. getEnvironment().validateRequiredProperties()
 *          // 允许将一下事件添加到这个集合,待事件派发器初始化完毕,就发布事件
 *          1.1.3. this.earlyApplicationEvents = new LinkedHashSet<>();
 *      =======================================对上下文环境,初始化属性,早期的事件进行预处理=====================================
 *
 *      ======================================对BeanFactory工厂进行预处理,设置属性,以及其他处理================================
 *      // 获取BeanFactory
 *      2.1. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
 *          // 给BeanFactory设置一个序列化ID
 *          2.1.1. this.beanFactory.setSerializationId(getId());
 *          // 获取bean工厂
 *          2.1.2. getBeanFactory()
 *              // 创建一个默认的BeanFactory对象,什么属性都是默认的值
 *              2.1.2.1. return GenericApplicationContext.this.beanFactory = new DefaultListableBeanFactory()
 *
 *      // 对BeanFactory进行预处理,也即是对默认的BeanFactory设置初始属性
 *      3.1. prepareBeanFactory(beanFactory);
 *          // 添加一个处理后置Aware接口的后置处理器,处理一些实现了Aware接口的实现了
 *          3.1.1 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
 *          // 忽略一些接口,这个接口不会成为spring的bean,因此无法注入
 *          3.1.2. beanFactory.ignoreDependencyInterface(ApplicationContextAware.class,EnvironmentAware.class,EmbeddedValueResolverAware.class,ResourceLoaderAware.class,ApplicationEventPublisherAware.class);
 *          // 注册一些可以解析的依赖,也就是可以在Spring中任何地方可以注入的类型
 *          3.1.3. beanFactory.registerResolvableDependency(BeanFactory.class, ResourceLoader.class,ApplicationEventPublisher.class,ApplicationContext.class);
 *          // 注册一下环境组件
 *          3.1.4. beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
 *          // 注册一下环境相关的属性,系统变量组件  ctx.getBean("systemProperties","systemEnvironment");
 *          3.1.5 beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
 *
 *       // 允许在上下文子类中对 bean 工厂进行后处理,默认空实现,留给子类,BeanFactory对象生成之后,对BeanFactory进行处理
 *       4.1. postProcessBeanFactory(beanFactory);
 *       ======================================对BeanFactory工厂进行预处理,设置属性,以及其他处理================================
 *
 *       ======================================执行BeanFactoryPostProcessor================================
 *       // 执行BeanFactoryPostProcessors后置处理器,在BeanFactory标准初始化之后执行的,也是前面的这四步骤
 *       // BeanFactoryProcessor有一个子接口BeanDefinitionRegistryPostProcessor,是Bean注册的后置处理器
 *       // 在BeanFactory中的bean定义未完全加载的时候执行
 *       5.1. invokeBeanFactoryPostProcessors(beanFactory);
 *          // 遍历所有的BeanFactoryPostProcessor,如果beanFactoryPostProcessors存在的话
 *          5.1.1. for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
 *              // 判断是否是bean定义注册器的后置处理器
 *              5.1.1.1. if (postProcessor instanceof BeanDefinitionRegistryPostProcessor){
 *                  // 执行BeanDefinitionRegistryPostProcessor后置处理器的postProcessBeanDefinitionRegistry方法,用于手动注册bean
 * 					5.1.1.1.1. registryProcessor.postProcessBeanDefinitionRegistry(registry);
 * 				    // 保存这个处理器,用于后面执行后置处理器的后置方法
 * 					5.1.1.1.2. registryProcessors.add(registryProcessor);
 * 				5.1.1.2. 如果BeanFactoryPostProcessor
 * 			        // 保存这个处理器,用于后面执行后置处理器的后置方法
 * 					5.1.1.2.1. regularPostProcessors.add(postProcessor);
 * 		  // 如果beanFactoryPostProcessors这个集合不存在元素,则需要去BeanFactory中找
 * 		 5.2. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
 * 		    // 遍历所有找出来的BeanDefinitionRegistryPostProcessor
 *          5.2.1. for (String ppName : postProcessorNames) {
 *              // 判断是否实现了PriorityOrdered接口,因为实现 后置处理器有最高优先级
 * 				5.2.1.1 if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class))
 * 			        // 将后置处理器保存
 * 				    5.2.1.1.1. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
 * 				    // 对实现了PriorityOrdered的BeanDefinitionRegistryPostProcessor还需要排序一下
 * 				    5.2.1.1.2. sortPostProcessors(currentRegistryProcessors)
 * 				    // 执行上面保存的currentRegistryProcessors的BeanDefinitionRegistryPostProcessor后置处理器
 * 				    5.2.1.1.3 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors)
 * 				// 判断是否实现了Ordered接口,因为后置处理器有优先级第二高
 * 				5.2.1.2 if (beanFactory.isTypeMatch(ppName, Ordered.class))
 * 			        5.2.1.2 与5.2.1.1的逻辑步骤完全一样
 * 		 // 所有的BeanDefinitionRegistryPostProcessor执行完毕,需要找到BeanFactoryPostProcessor的后置处理器
 * 		 5.3. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
 * 	        // 对实现了PriorityOrdered接口的优先级进行排序
 * 	        5.3.1. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
 * 	            // 保存优先级最高的
 * 				5.3.1.1. priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
 * 			// 对实现了Ordered接口的优先级进行排序
 * 			5.3.2. if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
 * 		        // 保存优先级第二高的
 * 				5.3.1.1. orderedPostProcessorNames.add(ppName);
 * 			// 保存剩下没有实现优先级顺序的
 * 			5.3.3.	nonOrderedPostProcessorNames.add(ppName);
 * 		    // 对同一类型的的后置处理器还需要排序
 * 		    5.3.4. sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
 * 		    // 执行优先级最高的后置处理器
 * 		    5.3.5. invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
 * 		    5.3.6 执行优先级第二高(Order接口)的后置处理器
 * 		    5.3.7 执行优先级最低的后置处理器
 *      ======================================执行BeanFactoryPostProcessor=================================================
 *
 *      ======================================注册BeanPostProcessor,不会执行=================================================
 *      // 注册BeanPostProcessor,在Bean的前后执行
 *      6.1. registerBeanPostProcessors(beanFactory);
 *          6.1.1. BeanPostProcessor的子接口
 *              //
 *              6.1.1.1. DestructionAwareBeanPostProcessor
 *              6.1.1.2. MergedBeanDefinitionPostProcessor
 *              6.1.1.3. SmartInstantiationAwareBeanPostProcessor
 *              6.1.1.4. InstantiationAwareBeanPostProcessor
 *         // 找到所有的BeanPostProcessor
 *         6.1.2. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
 *         // 对有BeanPostProcessor进行有限及排序分类
 *         6.1.2.1. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
 *              // 保存到priorityOrderedPostProcessors容器中
 *             6.1.2.1.1. priorityOrderedPostProcessors.add(pp);
 *         6.1.2.2. if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
 *         // 保存到orderedPostProcessorNames容器中
 *              6.1.2.2.1. orderedPostProcessorNames.add(pp);
 *         // 保存到nonOrderedPostProcessorNames容器
 *         6.1.2.3.  nonOrderedPostProcessorNames.add(pp);
 *         6.1.2.4. if (pp instanceof MergedBeanDefinitionPostProcessor) {
 *              // 保存到internalPostProcessors这个容器中
 * 			    6.1.2.4.1 internalPostProcessors.add(pp);
 * 		   6.1.3 注册priorityOrderedPostProcessors容器中的BeanPostProcessor,也就是添加到工厂中
 * 		   6.1.4 注册orderedPostProcessorNames容器中的BeanPostProcessor,也就是添加到工厂中
 * 		   6.1.5 注册nonOrderedPostProcessorNames容器中的BeanPostProcessor,也就是添加到工厂中
 * 		   6.1.6 注册internalPostProcessors(MergedBeanDefinitionPostProcessor)容器中的BeanPostProcessor,也就是添加到工厂中
 * 		   // 添加一个监听器的后置处理器
 * 		   6.1.7. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
 * 		       // 后置处理器会将这个bean添加到容器中
 * 		       6.1.7.1 this.applicationContext.addApplicationListener((ApplicationListener<?>) bean);
 *      ======================================注册BeanPostProcessor,不会执行=================================================
 *
 *      ======================================初始化国际化资源组件=============================================================
 *      // 初始化MessageSource组件(做国际化,消息绑定,消息解析)
 *      7.1.initMessageSource();
 *          // 获取bean工厂
 *          7.1.1. getBeanFactory();
 *          // 判断容器中是否有messageSource这个组件
 *          7.1.2. if (beanFactory.containsLocalBean(messageSource))
 *              // 如果有
 *              7.1.2.1. this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
 *              // 如果没有,创建一个这个组件
 *              7.1.2.2. this.messageSource = new DelegatingMessageSource();
 *                  // 存入容器
 *                  7.1.2.2.1 beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
 *              7.1.2.3. MessageSource是取出国际化配置文件中key的值,还能按照区域信息
 *      ======================================初始化国际化资源组件=============================================================
 *
 *      ======================================初始化事件派发器=============================================================
 *      // 初始化事件派发器
 *      8.1. initApplicationEventMulticaster();
 *          // 获取bean工厂
 *          8.1.1 getBeanFactory()
 *          // 判断是否包含这个组件
 *          8.1.2. if (beanFactory.containsLocalBean(applicationEventMulticaster)) {
 *              // 如果包含,从容器中获取
 *              8.1.2.1 this.applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
 *              // 如果不包含,创建一个简单的派发器
 *              8.1.2.2. this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
 *              // 放入IOC容器
 * 			    8.1.2.3. beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
 *     ======================================初始化事件派发器=============================================================
 *
 *      // 初始化特定上下文子类中的其他特殊bean,留给子类的
 *      9.1. onRefresh();
 *
 *     ======================================注册实现了ApplicationLister的监听器=============================================================
 *      // 注册监听器
 *      10.1. registerListeners();
 *          // 找到所有实现了ApplicationListener的监听器
 *          10.1.1. String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
 *          // 遍历,将每一个listener添加到事件分发器中
 * 			10.1.2. getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
 * 		    // 如果存在早前的事件,也就是还没有初始化派发器时发布的事件,会添加到	earlyApplicationEvents这个容器中
 * 		    10.1.3. if (CollectionUtils.isEmpty(this.earlyApplicationEvents)) {
 * 		        // 发布事件
 * 			    10.1.3.1. for (ApplicationEvent earlyEvent : earlyEventsToProcess) { getApplicationEventMulticaster().multicastEvent(earlyEvent);}
 *      ======================================注册实现了ApplicationLister的监听器=============================================================
 *
 *      ======================================实例下剩下的单实例bean=============================================================
 *      // 实例下剩下的单实例bean,因为很多bean在之前初始化过,还有写剩下的没有初始化
 *      11.1. finishBeanFactoryInitialization(beanFactory);
 *          // 实例下剩下的单实例bean
 *          11.1.1. beanFactory.preInstantiateSingletons();
 *              // 遍历所有bean的名称,一一创建bean
 *              11.1.1.1. for (String beanName : beanNames) {
 *                  // 如果是factory bean
 *                  11.1.1.1.1. if (isFactoryBean(beanName)) {
 *                      // factory bean的beanName 为 &beanName
 *                      11.1.1.1.1.1 Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
 *                  // 如果不是FactoryBean
 *                  11.1.1.1.2. Object bean = getBean(beanName);
 *          // 创建或者获取bean
 *          11.1.2. getBean()
 *              // 调用doGetBean创建bean
 *              11.1.2.1 doGetBean(name, requiredType, args, false);
 *                  // 获取bean是否已经被创建
 *                  11.1.2.1.1. Object sharedInstance = getSingleton(beanName);
 *                  11.1.2.1.2. 如果Bean没有存在,获取beanFactory工厂,即将创建bean
 *                  // 标记这个bean已被创建
 *                  11.1.2.1.3. markBeanAsCreated();
 *                  // 获取bean的定义信息
 *                  11.1.2.1.4. RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
 *                  // 获取所有依赖的bean,@DependsOn(XXX.class)
 *                  11.1.2.1.5. String[] dependsOn = mbd.getDependsOn();
 *                  // 遍历所有的dependsOn依赖的bean,先创建
 *                  11.1.2.1.6. for (String dep : dependsOn) { getBean(dep);}
 *                  // 调用这个获取单实例方法,如果是单例bean的前提下
 *                  11.1.2.1.7. getSingleton(beanName, () -> {return createBean(beanName, mbd, args);}
 *                  // 创建bean
 *                  11.1.2.1.8. singletonFactory.getObject(); -->  createBean()
 *                  // 获取bean定义信息
 *                  11.1.2.1.9. RootBeanDefinition mbdToUse = mbd;
 *                  // 让BeanPostProcessor提前拦截,返回代理对象,此时还没开始创建对象
 *                  11.1.2.1.10. Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
 *                      // 判断当前BeanDefinition是不是InstantiationAwareBeanPostProcessor这个后置处理器
 *                      11.1.2.1.10.1. if (bp instanceof InstantiationAwareBeanPostProcessor) {
 *                          // 如果是,之前这个后置处理器的初始化前的方法
 *                          11.1.2.1.10.1.1. bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
 *                          // 如果这个初始化前方法就返回了一个对象
 *   				    	11.1.2.1.10.1.2. if (bean != null) {
 *   				        // 直接执行这个后置处理器的初始化后方法
 *   				    	11.1.2.1.10.1.3. bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
 *   				    	11.1.2.1.10.1.4. 此时bean已经处理完成,这个bean完全是由applyBeanPostProcessorsBeforeInstantiation的逻辑进行处理的
 *   				 // 如果11.1.2.1.10.实例化前后置处理器步骤没有返回一个bean的话,会执行这个创建bean实例
 *                  11.1.2.1.11. Object beanInstance = doCreateBean(beanName, mbdToUse, args);
 *                      11.1.2.1.11.1. Object beanInstance = doCreateBean(beanName, mbdToUse, args);
 *                      // 创建bean的实例
 *                      11.1.2.1.11.2. instanceWrapper = createBeanInstance(beanName, mbd, args);
 *                      // 执行MergedBeanDefinitionPostProcessor后置处理器,实在实例化之后,原始对象,没有属性赋值只有原始对象
 *                      11.1.2.1.11.3. applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
 *                      // 属性注入,依赖注入
 *                      11.1.2.1.11.4. populateBean(beanName, mbd, instanceWrapper);
 *                          // 遍历所有InstantiationAwareBeanPostProcessor后置处理器,执行这个对象的实例化后方法
 *                          11.1.2.1.11.4.1. (InstantiationAwareBeanPostProcessor) ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)
 *                          // 遍历所有InstantiationAwareBeanPostProcessor后置处理器,执行这个对象的实例化后属性初始化方法
 *                          11.1.2.1.11.4.1. (InstantiationAwareBeanPostProcessor) ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
 *                          // 应用bean的属性值,为属性利用set方法赋值
 *                          11.1.2.1.11.4.1. applyPropertyValues(beanName, mbd, bw, pvs);
 *                          // 对包装类的属性赋值 bw为包装类对象,mpvs为封装的属性值对象
 *                          11.1.2.1.11.4.1.1.  bw.setPropertyValues(mpvs);
 *                              // 根据属性名找到对应的字段
 *                              11.1.2.1.11.4.1.1.1. Field field = findField(getWrappedClass(), propertyName);
 *                              // 放开权限
 * 			                    11.1.2.1.11.4.1.1.2. makeAccessible(field);
 * 			                    // 对字段赋值
 * 			                    11.1.2.1.11.4.1.1.3. setField(field, getWrappedInstance(), value);
 * 			          // 属性赋值值后,对bean进行初始化操作
 *                    11.1.2.1.11.5. initializeBean(beanName, exposedObject, mbd);
 *                      // 执行一些aware接口 BeanNameAware,BeanClassLoaderAware,BeanFactoryAware
 *                      11.1.2.1.11.5.1. invokeAwareMethods(beanName, bean);
 *                      // 执行后置处理器初始化之前的方法
 *                      11.1.2.1.11.5.2. wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
 *                      // 执行bean的初始化方法
 *                      11.1.2.1.11.5.3. invokeInitMethods(beanName, wrappedBean, mbd);
 *                          // 执行实现了InitializingBean的接口
 *                          11.1.2.1.11.5.3.1. ((InitializingBean) bean).afterPropertiesSet();
 *                          // 执行用户定义的@Bean(initMethod) <bean init-method/>
 *                          11.1.2.1.11.5.3.2. invokeCustomInitMethod(beanName, bean, mbd);
 *                      // 执行bean的初始化后的后置处理器
 *                      11.1.2.1.11.5.4. wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
 *                    // 注册一些实现了销毁接口的bean,实现了销毁接口的bean,当容器关闭之后需要执行
 *                    11.1.2.1.11.6. registerDisposableBeanIfNecessary(beanName, bean, mbd);
 *                      // 判断这个bean是否实现了DisposableBean
 *                      11.1.2.1.11.6.1. this.bean instanceof DisposableBean
 *                      // 保存实现了DestructionAwareBeanPostProcessor销毁的后置处理器
 *                      11.1.2.1.11.6.2. if (processor instanceof DestructionAwareBeanPostProcessor) { filteredPostProcessors.add(dabpp);}
 *                  // 添加到单例池中
 *                  11.1.2.1.8. addSingleton(beanName, singletonObject);
 *           // 遍历所有的bean,因为在这之前,所有的bean都创建完成
 *          11.1.3. for (String beanName : beanNames) {
 *              11.1.2.1. Object singletonInstance = getSingleton(beanName);
 *              // 如果是SmartInitializingSingleton这种类型,会在所有的bean完成生命周期之后执行
 *              11.1.2.1.1. if (singletonInstance instanceof SmartInitializingSingleton) { smartSingleton.afterSingletonsInstantiated();}
 *      ======================================实例下剩下的单实例bean=============================================================
 *
 *      ======================================完成容器的刷新============================================================
 *      // 完成容器刷新
 *     12.1. finishRefresh();
 *          // 初始化生命周期相关的处理器
 *          12.1.1. initLifecycleProcessor();
 *              // 获取bean工厂
 *              12.1.1.1. ConfigurableListableBeanFactory beanFactory = getBeanFactory();
 *              // 如果包含这个lifecycleProcessor的处理器,则从bean工厂获取对象
 *              12.1.1.2. if (beanFactory.containsLocalBean(lifecycleProcessor)) { this.lifecycleProcessor = beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);}
 *              // 如果容器中不存在,则创建一个默认的生命周期处理器
 *              12.1.1.3. this.lifecycleProcessor = new DefaultLifecycleProcessor();
 *              // 注册这个处理器
 *              12.1.1.4. beanFactory.registerSingleton(lifecycleProcessor, this.lifecycleProcessor);
 *           // 获取12.1.1初始化好的生命周期处理器接口的 onRefresh方法
 *           12.1.2. getLifecycleProcessor().onRefresh();
 *           // 发布一个事件,容器刷新的事件
 *           12.1.3. publishEvent(new ContextRefreshedEvent(this));
 *
 *      ======================================完成容器的刷新============================================================

 *
 *
 *
 *
 *  </pre>
 */
@ComponentScan("cn.lzx.spring")
public class SpringSource {


    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringSource.class);
        Evn evn = ctx.getBean(Evn.class);
        Instantiation instantiation = ctx.getBean(Instantiation.class);
        instantiation.test();
    }
}

@Component
class Evn {

    @Qualifier("systemProperties")
    @Resource
    private Map<String, Object> systemProperties;

    @Qualifier("systemEnvironment")
    @Resource
    private Map<String, Object> systemEnvironment;

    @Bean
    public AntiYa antiYa() {
        return new AntiYa();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值