springboot
2022-08-08 15:31:26 10 举报
AI智能生成
spring boot启动 组件加载过程
作者其他创作
大纲/内容
@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@AutoConfigurationPackage
@Import({Registrar.class})
abstract class <font color="#f44336">AutoConfigurationPackages</font> {<br><br>public static void <font color="#2196f3">register</font>(BeanDefinitionRegistry registry, String... packageNames) {<br> if (registry.containsBeanDefinition(BEAN)) {<br> BeanDefinition beanDefinition = registry.getBeanDefinition(BEAN);<br> ConstructorArgumentValues constructorArguments = beanDefinition.getConstructorArgumentValues();<br> constructorArguments.addIndexedArgumentValue(0, addBasePackages(constructorArguments, packageNames));<br> } else {<br> GenericBeanDefinition beanDefinition = new GenericBeanDefinition();<br> beanDefinition.setBeanClass(AutoConfigurationPackages.BasePackages.class);<br> beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, packageNames);<br> beanDefinition.setRole(2);<br> registry.registerBeanDefinition(BEAN, beanDefinition);<br> }<br><br> }<br><br><font color="#f44336">static</font> class <font color="#f44336">Registrar</font> implements ImportBeanDefinitionRegistrar, DeterminableImports {<br> Registrar() {<br> }<br><br> public void registerBeanDefinitions(AnnotationMetadata <font color="#f44336">metadata</font>, BeanDefinitionRegistry registry) {<br> //<font color="#f44336">main Application所在包</font><br> AutoConfigurationPackages.<font color="#2196f3">register</font>(registry, (new AutoConfigurationPackages.PackageImport(<font color="#f44336">metadata</font>)).getPackageName());<br> }<br><br> public Set<Object> determineImports(AnnotationMetadata metadata) {<br> return Collections.singleton(new AutoConfigurationPackages.PackageImport(metadata));<br> }<br> }<br>}<br>
@Import({AutoConfigurationImportSelector.class})
<b><font color="#f44336">AutoConfigurationImportSelector{<br></font></b>public String[] <font color="#f44336">selectImports</font>(AnnotationMetadata annotationMetadata) {<br> if (!this.isEnabled(annotationMetadata)) {<br> return NO_IMPORTS;<br> } else {<br> AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);<br> AnnotationAttributes attributes = this.getAttributes(annotationMetadata);<br> List<String> configurations = this.<font color="#f44336">getCandidateConfigurations</font>(annotationMetadata, attributes);<br> configurations = this.removeDuplicates(configurations);<br> Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);<br> this.checkExcludedClasses(configurations, exclusions);<br> configurations.removeAll(exclusions);<br> configurations = this.filter(configurations, autoConfigurationMetadata);<br> this.fireAutoConfigurationImportEvents(configurations, exclusions);<br> return StringUtils.toStringArray(configurations);<br> }<br> }<br>protected List<String> <b><font color="#f44336">getCandidateConfigurations</font></b>(AnnotationMetadata metadata, AnnotationAttributes attributes) {<br> List<String> configurations = <font color="#f44336">SpringFactoriesLoader</font>.<b style=""><font color="#f44336">loadFactoryNames</font></b>(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());<br> Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");<br> return configurations;<br> }<br>}
<font color="#f44336">abstract</font> class <b><font color="#f44336">SpringFactoriesLoader</font></b>{<br>public static final String FACTORIES_RESOURCE_LOCATION = "<font color="#f44336">META-INF/spring.factories</font>";<br>public static List<String> <font color="#f44336">loadFactoryNames</font>(Class<?> factoryClass, @Nullable ClassLoader classLoader) {<br> String factoryClassName = factoryClass.getName();<br> return (List)<font color="#f44336">loadSpringFactories</font>(classLoader).getOrDefault(factoryClassName, Collections.emptyList());<br> }<br>private static Map<String, List<String>> <font color="#f44336">loadSpringFactories</font>(@Nullable ClassLoader classLoader) {<br> MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);<br> if (result != null) {<br> return result;<br> } else {<br> try {<br> Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");<br> LinkedMultiValueMap result = new LinkedMultiValueMap();<br><br> while(urls.hasMoreElements()) {<br> URL url = (URL)urls.nextElement();<br> UrlResource resource = new UrlResource(url);<br> Properties properties = PropertiesLoaderUtils.loadProperties(resource);<br> Iterator var6 = properties.entrySet().iterator();<br><br> while(var6.hasNext()) {<br> Entry<?, ?> entry = (Entry)var6.next();<br> List<String> factoryClassNames = Arrays.asList(StringUtils.commaDelimitedListToStringArray((String)entry.getValue()));<br> result.addAll((String)entry.getKey(), factoryClassNames);<br> }<br> }<br><br> cache.put(classLoader, result);<br> return result;<br> } catch (IOException var9) {<br> throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var9);<br> }<br> }<br> }<br><br>}<br>
@ComponentScan
Full @Configuration
如果@Bean方法在使用@Configuration注解的类中声明时称之为Full @Configuration
@Bean方法会被CGLIB所代理
被CGLIB的方法是不能被声明为private和final,<br>因为CGLIB是通过生成子类来实现代理的,private和final方法是不能被子类Override的,<br>也就是说,Full @Configuration模式下,@Bean的方法是不能不能被声明为private和final,不然在启动时Spring会直接报错<br>
lite @Bean mode
当@Bean方法在没有使用@Configuration注解的类中声明时称之为lite @Bean mode<br>例如在@Component的类中使用@Bean
@Bean方法不会被CGLIB代理
0 条评论
下一页