@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
以下摘自Spring文档翻译
@Configuration 是一个类级注释,指示对象是一个bean定义的源。 @Configuration 类通过 @Bean 注解的公共方法声明bean。 @Bean 注释是用来表示一个方法实例化,配置和初始化是由 Spring IoC 容器管理的一个新的对象。
通俗的讲 @Configuration 一般与 @Bean 注解配合使用,用 @Configuration 注解类等价与 XML 中配置 beans,用 @Bean 注解方法等价于 XML 中配置 bean 。举例说明:
XML配置代码如下:
<beans>
<bean id = "userService" class="com.user.UserService">
<property name="userDAO" ref = "userDAO"></property>
</bean>
<bean id = "userDAO" class="com.user.UserDAO"></bean>
</beans>
等价于@Bean注释
@Configuration
public class Config {
@Bean
public UserService getUserService(){
UserService userService = new UserService();
userService.setUserDAO(null);
return userService;
}
@Bean
public UserDAO getUserDAO(){
return new UserDAO();
}
}
Spring Boot 启动、事件通知与配置加载原理
1. @SpringBootConfiguration
进入之后可以看到这个注解是继承了
@Configuration
的,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。通俗的讲
@Configuration
一般与@Bean
注解配合使用,用@Configuration
注解类等价与 XML 中配置 beans,用@Bean
注解方法等价于 XML 中配置 bean 。举例说明:@Bean
注释2. @EnableAutoConfiguration
@EnableAutoConfiguration
的作用启动自动的配置,@EnableAutoConfiguration
注解的意思就是Springboot根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web
,来判断你的项目是否需要添加了webmvc
和tomcat
,就会自动的帮你配置web项目中所需要的默认配置。SpringFactoriesLoader 机制:
以下摘自Spring文档翻译
4. 更多
根据上面的理解,
HelloWorld
的入口类SpringboothelloApplication
,我们可以使用:使用
@ComponentScan
注解代替@SpringBootApplication
注解,也可以正常运行程序。原因是@SpringBootApplication
中包含@ComponentScan
,并且springboot会将入口类看作是一个@SpringBootConfiguration
标记的配置类,所以定义在入口类Application中的SpringboothelloApplication
也可以纳入到容器管理。二. SpringApplication.run
2.1 入口 run 方法执行流程
2.2 运行事件 深入各方法
2.2.1 开始启动运行监听器 SpringApplicationRunListeners
顾名思意,运行监听器的作用就是为了监听 SpringApplication 的run方法的运行情况。在设计上监听器使用观察者模式,以总信息发布器 SpringApplicationRunListeners 为基础平台,将Spring启动时的事件分别发布到各个用户或系统在 META_INF/spring.factories文件中指定的应用初始化监听器中。使用观察者模式,在Spring应用启动时无需对启动时的其它业务bean的配置关心,只需要正常启动创建Spring应用上下文环境。各个业务'监听观察者'在监听到spring开始启动,或环境准备完成等事件后,会按照自己的逻辑创建所需的bean或者进行相应的配置。观察者模式使run方法的结构变得清晰,同时与外部耦合降到最低。
}
2.2.3 创建应用上下文对象 ApplicationContext
根据
this.webApplicationType
来判断是什么环境,web环境和普通环境使用不同的应用上下文。再使用反射相应实例化。Class.forName() 的作用
Class.forName:返回与给定的字符串名称相关联类或接口的 Class 对象。
首先你要明白在 java 里面任何 class 都要装载在虚拟机上才能运行
两者是一样的效果。
2.2.4 创建上下文启动异常报告对象 exceptionReporters
通过
getSpringFactoriesInstances
创建SpringBootExceptionReporter
接口的实现,而该接口的实现的就是FailureAnalyzers
——上下文启动失败原因分析对象。}
2.2.6
2.2.7
参考链接
@SpringBootApplication注解
springboot快速入门及@SpringBootApplication注解分析
[深入剖析Spring Boot]启动、事件通知与配置加载原理
spring boot实战(第八篇)上下文的创建(TODO)