赞
踩
@Autowired
private ApplicationContext applicationContext;
@Autowired
public DataSourceTransactionManager transactionManager;
@Autowired
public AutowireCapableBeanFactory autowireCapableBeanFactory;
要搞清楚自动装配的原因, 我们需要去分析Spring Boot的启动类.
@SpringBootApplication 标注的类 就是SpringBoot项目的启动类, 这个注解也是SpringBoot实现自动配置的核心
元注解:
@SpringBootConfiguration
里面就是@Configuration, 标注当前类为配置类, 其实只是做了一层封装改了个名字而已.
(@Indexed注解,是用来加速应用启动的, 不用关心), 本质上就是将启动类交给Spring进行管理
源码如下:
这个注解主要是导入一个配置文件 AutoConfigurationPackages.Registrar.class
registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry): 这个方法是ImportBeanDefinitionRegistrar接口的一部分,用于在Spring应用程序上下文中注册额外的bean定义。当一个@Configuration类使用了@Import注解并且指定了实现ImportBeanDefinitionRegistrar接口的类时,这个方法会被调用。在这个例子中,它使用PackageImports(一个假定存在的辅助类)来获取包名,并将这些包名作为字符串数组传递给另一个重载的register方法,以便在注册表中注册这些包中的类作为Spring bean定义。
determineImports(AnnotationMetadata metadata): 这个方法是DeterminableImports接口的一部分,用于确定哪些类应该被导入到当前的@Configuration类或@SpringBootApplication类中。在这个例子中,它返回了一个单例集合(Set),其中包含了一个PackageImports对象。这个对象封装了应该被扫描的包的信息,这样Spring就能自动发现并注册这些包中的@Component、@Service、@Repository等注解的类。
Registrar实现了 ImportBeanDefinitionRegistrar 类, 就可以被注解@Import导⼊到spring
容器里. (String[])(new PackageImports(metadata)).getPackageNames().toArray(new
String[0]) : 当前启动类所在的包名. 所以:@AutoConfigurationPackage 就是将启动类所在的包下⾯所有的组件都扫描注冊到spring 容器中.
使用@Import注解,导入了实现ImportSelector接口的实现类.
selectImports() 方法底层调用 getAutoConfigurationEntry() 方法, 获取可自动配置的配置类信息集合.
getAutoConfigurationEntry() 方法通过调用getCandidateConfigurations(annotationMetadata, attributes) 方法获取在配置文件中配置的所有自动配置类的集合
getCandidateConfigurations 方法的功能:
这里面包含了很多第三方依赖的配置文件(连续按两下shift可以查看对应的源码)
SpringBoot 自动配置原理的大概流程如下:
当SpringBoot程序启动时, 会加载配置文件当中所定义的配置类, 通过 @Import 注解将这些配置类全
部加载到Spring的IOC容器中, 交给IOC容器管理
SpringBoot的自动配置原理源码口是 @SpringBootApplication 注解, 这个注解封装了3个注
解
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。