Java⾯试官⾯试100问之:SpringBoot启动原理吗?超详细解答
前⾔
SpringBoot为我们做的⾃动配置,确实⽅便快捷,但是对于新⼿来说,如果不⼤懂SpringBoot内部启动原理,以后难免会吃亏。所以这次博主就跟你们⼀起⼀步步揭开SpringBoot的神秘⾯纱,让它不在神秘。
我在这⾥分享⼀个,有很多⼲货,包含jvm,netty,spring,线程,spring cloud等详细讲解,也有详细的学习规划图,⾯试题整理等,我感觉在⾯试这块讲的⾮常清楚:获取⾯试资料只需: 暗号:CSDN
我们开发任何⼀个Spring Boot项⽬,都会⽤到如下的启动类
@SpringBootApplication
publicclass
Application
{
publicstaticvoid
main(
String
[] args){
SpringApplication
.run(
Application
.
class
,
args);
}
}
从上⾯代码可以看出,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼,所以要揭开SpringBoot的神秘⾯纱,我们要从这两位开始就可以了。
⼀、SpringBootApplication背后的秘密
@SpringBootApplication注解是Spring Boot的核⼼注解,它其实是⼀个组合注解:
@Target
(
ElementType
.TYPE)
@Retention
(
RetentionPolicy
.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
(excludeFilters ={
@Filter
(type =
FilterType
.CUSTOM, classes =
TypeExcludeFilter
.
class
),
@Filter
(type =
FilterType
.CUSTOM, classes =
spring ioc注解
AutoConfigurationExcludeFilter
.
class
)})
public
@interface
SpringBootApplication
{
...
}
虽然定义使⽤了多个Annotation进⾏了原信息标注,但实际上重要的只有三个Annotation:
@Configuration(@SpringBootConfiguration点开查看发现⾥⾯还是应⽤了@Configuration)
@EnableAutoConfiguration
@ComponentScan
即@SpringBootApplication=(默认属性)@Configuration+@EnableAutoConfiguration+@ComponentScan。
所以,如果我们使⽤如下的SpringBoot启动类,整个SpringBoot应⽤依然可以与之前的启动类功能对等:
@Configuration
@EnableAutoConfiguration
@ComponentScan
publicclass
Application
{
publicstaticvoid
main(
String
[] args){
SpringApplication
.run(
Application
.
class
, args);
}
}
每次写这3个⽐较累,所以写⼀个@SpringBootApplication⽅便点。接下来分别介绍这3个Annotation。
1、@Configuration
这⾥的@Configuration对我们来说不陌⽣,它就是JavaConfig形式的Spring Ioc容器的配置类使⽤的那个
@Configuration,SpringBoot社区推荐使⽤基于JavaConfig的配置形式,所以,这⾥的启动类标注了@Configuration之后,本⾝其实也是⼀个IoC容器的配置类。
举⼏个简单例⼦回顾下,XML跟config配置⽅式的区别:
(1)表达形式层⾯
基于XML配置的⽅式是这样:
<?xml version=
"1.0"
encoding=
"UTF-8"
>
<beans
xmlns
"/schema/beans"
xmlns:xsi
"/2001/XMLSchema-instance"
xsi:schemaLocation
"/schema/beans /schema/beans/spring-beans-3.0.xsd"
default-lazy-init
"true"
<!--bean定义-->
</beans>
⽽基于JavaConfig的配置⽅式是这样:
@Configuration
publicclass
MockConfiguration
{
//bean定义
}
任何⼀个标注了@Configuration的Java类定义都是⼀个JavaConfig配置类。
(2)注册bean定义层⾯
基于XML的配置形式是这样:
```java
bean
id
"mockService"
class
"..MockServiceImpl"
..
</bean>
⽽基于JavaConfig的配置形式是这样的:
@Configuration
publicclass
MockConfiguration
{
@Bean
public
MockService
mockService(){
returnnew
MockServiceImpl
();
}
}
任何⼀个标注了@Bean的⽅法,其返回值将作为⼀个bean定义注册到Spring的IoC容器,⽅法名将默认成该bean定义的id。(3)表达依赖注⼊关系层⾯
为了表达bean与bean之间的依赖关系,在XML形式中⼀般是这样:
<bean
id
"mockService"
class
"..MockServiceImpl"
>
<propery
name
"dependencyService"
ref
"dependencyService"
/>
</bean>
<bean
id
"dependencyService"
class
"DependencyServiceImpl"
></bean>
⽽基于JavaConfig的配置形式是这样的:
@Configuration
publicclass
MockConfiguration
{
@Bean
public
MockService
mockService(){
returnnew
MockServiceImpl
(dependencyService());
}
@Bean
public
DependencyService
dependencyService(){
returnnew
DependencyServiceImpl
();
}
}
如果⼀个bean的定义依赖其他bean,则直接调⽤对应的JavaConfig类中依赖bean的创建⽅法就可以了。
@Configuration:提到@Configuration就要提到他的搭档@Bean。使⽤这两个注解就可以创建⼀个简单的spring配置类,可以⽤来替代相应的xml配置⽂件。
<beans>
<bean
id
"car"
class
"st.Car"
property
name
"wheel"
ref
"wheel"
</property>
</bean>
<bean
id
"wheel"
class
"st.Wheel"
></bean>
</beans>
相当于:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。