SpringBoot原理(面试率90%)

一、起步依赖

原理:Maven的依赖传递

二、自动配置

自动配置就是 当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。

方案一、

使用@Component注解
然后在启动类上加上@ComponentScan({“扫描范围”})来自动配置

方案二、

使用@Import注解导入,导入的形式主要有以下几种,其中第四种更优雅方便,也是Spring Boot所采用的方式:
1、导入普通类

@Import({类名.class,......})

2、导入配置类(被@Configuration声明的类)

@Import({配置类类名.class,......})

配置类以及类中通过@Bean声明的bean都会被导入IOC容器

3、导入ImportSelector接口实现类

@Import({ImportSelector接口实现类类名.class,......})

ImportSelector接口的selectImports方法会返回一个String[ ],该数组中存放了所有要被导入IOC容器的类的全类名,若有类为配置类,则该配置类及类中通过@Bean声明的bean都会被导入IOC容器,如

 public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    //将所有要交给IOC的类的全类名写入String数组返回
        return new String[]{"com.example.CommonConfig","......"};
    }
}
//下面是配置类CommonConfig

@Configuration
public class CommonConfig {
    @Bean
    public SAXReader saxReader(){
        return new SAXReader();
    }
    @Bean
    public JSONObject jsonObject(){
        return new JSONObject();
    }
}

//导入ImportSeletor接口的实现类
@Import({MyImportSeletor.class})

4、在启动类上加上 @EnableXxxx注解,注解里面封装了@Import注解,@Import注解中封装了要导入IOC的类(包括配置类和ImportSelector接口实现类),如:

Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
//封装了@Import注解,@Import注解封装了ImportSelector接口实现类,
//MyImportSelector返回的String数组中封装了所有要导入到IOC容器的类的全类名
@Import(MyImportSelector.class)
public @interface EnableCommonConfig {
}

//启动类

@SpringBootApplication
@ServletComponentScan
@EnableCommonConfig//加上@EnableXxxx注解
public class TliasApplication {
    public static void main(String[] args) {
        SpringApplication.run(TliasApplication.class, args);

    }

}

spring boot自动装配第三方组件的原理:
入口在启动类的@SpringBootApplication注解
@SpringBootApplication里面封装了三个注解:

@SpringBootConfiguration:声明启动类为一个配置类
@ComponentScan扫描范围为启动类所在包及其子包
@EnableAutoConfiguration(核心)

里面封装了一个 @Import注解,@Import注解里封装了一个ImportSelector接口的实现类AutoConfigurationImportSelector.class,该实现类的底层封装了一个String数组,数组里面封装了所有要交给IOC容器的类,这些类的来源是从
META-INF/spring/
xxxxx.imports文件(2.7.x以后)以及spring.factories文件中遍历读取的(早期)

并不是所有的类都会被装配,@Conditional开头的注解为条件装配注解,在满足一定的条件后才会装配,位置:方法、类,如:

@ConditionalOnClass :根据 name(全类名)或value(类型.calss) 判断环境中是否有对应的字节码文件(类),才注册bean到IOC,如:

    @Bean
    @ConditionalOnClass(name = "io.jsonwebtoken.Jwts")//项目中存在该类才会注册该bean到IOC
    public SAXReader saxReader(){
        return new SAXReader();
    }

@ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册bean到IOC容器,还可以使用name或value属性指定bean

    @Bean
    @ConditionalOnMissingBean(value = 类型.calss 或者 name = "bean名")//项目中不存在该bean才会注册到IOC
    public SAXReader saxReader(){
        return new SAXReader();
    }

@ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器

    @Bean
    @ConditionalOnProperty(name="name",havingValue = "cxl")//配置文件中存在指定的属性与值,才会注册bean
    public SAXReader saxReader(){
        return new SAXReader();
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值