no8-springboot原理第一次课-自动配置原理-启动流程-自定义启动器

飞一样的编程
飞一样的编程
擅长邻域:Java,MySQL,Linux,nginx,springboot,mongodb,微信小程序,vue

分类: springboot 专栏: springboot学习 标签: 自定义启动器 启动流程原理

2023-03-23 21:06:49 754浏览

boot 自定义启动器,启动流程原理

自动配置原理

@SpringBootApplication

作用:启动类上加的注解,这个类的同级别或者子包下面的组件才会被扫描到

是一个复合注解,等价于@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解

假设我把thymeleaf的自动配置类给剔除就会导致需要视图解析器的接口访问不到。

如果不剔除的话项目启动就会有这个自动配置类加载进去

描述注解

@Target:这是一个描述注解

@Retention:说明注解的生命周期以及作用域。有些注解是可以改变你代码运行结果的,有些注解不能(比如重写。@Override)

RetentionPolicy.SOURCE:只是在代码中有,编译后的class文件里没有,所以不会造成任何影响

RetentionPolicy.RUNTIME:对代码有影响

@Documented:注解标准文档

@SpringBootConfiguration:表示springboot启动类是一个配置类

@EnableAutoConfiguration:开关自动配置

@ComponentScan:扫包,默认是扫描当前其同类同级别的包以及子包

最核心的就是@EnableAutoConfiguration

其中selectImports方法返回所有的配置类

在getAutoConfigurationEntry方法中调用getCandidateConfigurations来读取候选配置类,

在getCandidateConfigurations方法中调用SpringFactoriesLoader的静态方法loadFactoryNames。

SpringFactoriesLoader.loadFactoryNames读取META-INF/spring.factories

把自定义的配置类,监听器等配置到META-INF/spring.factories中。

打断点分析一下

查看用到的自动配置类:

127:默认提供了127个自动配置类作为候选

27:会根据我们自己加的依赖,来判断目前项目中需要用到哪些自动配置类

这个是后端数据检验的自动配置类

主要就是找spring.factories这个文件

启动流程

SpringApplication初始化方法

类比替代web.xml文件的那个类

springboot启动流程

当SpringApplication创建完毕后,就开始执行run方法

我们可以在resources目录下新建一个banner.txt来修改默认的banner

自定义banner.txt

 
//							_ooOoo_								  //
//						   o8888888o							  //	
//						   88" . "88							  //	
//						   (| ^_^ |)							  //	
//						   O\  =  /O							  //
//						____/`---'\____							  //						
//					  .'  \\|     |//  `.						  //
//					 /  \\|||  :  |||//  \						  //	
//				    /  _||||| -:- |||||-  \						  //
//				    |   | \\\  -  /// |   |						  //
//					| \_|  ''\---/''  |   |						  //		
//					\  .-\__  `-`  ___/-. /						  //		
//				  ___`. .'  /--.--\  `. . ___					  //	
//				."" '<  `.___\_<|>_/___.'  >'"".				  //
//			  | | :  `- \`.;`\ _ /`;.`/ - ` : | |				  //	
//			  \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//		========`-.____`-.___\_____/___.-`____.-'========		  //	
//				             `=---='                              //
//		^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//         佛祖保佑       永无BUG		永不修改				  //

提个问题:是先进run方法还是先进自动配置?

答:先进run

启动器starter

自定义starter

把之前爱旅行项目中jedis的方式往redis里存值改造成一个启动器

1.创建autoconfigure模块

  • 修改pom文件
  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
    </parent>

<dependencies>
        <!--导入自动配置的相关依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>

        <!--方便idea能检测到该依赖中用到的配置属性,能够自动补全,其实就是在编译的时候在
        META-INF下生成一个spring-configuration-metadata.json文件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <!--jedis依赖-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>
  • 新建一个属性类
@Data
@ConfigurationProperties(prefix = "jfit.redis")
public class MyRedisProperties {
    private int database = 0;
    private String host="localhost";
    private int timeout=2000;//单位是秒,默认值为0,表示无限制
    private String password;
    private int port=6379;
}
  • 新建一个自动配置类
@Configuration
@EnableConfigurationProperties(MyRedisProperties.class)
@ConditionalOnClass(JedisPool.class)
public class MyRedisAutoConfiguration {
    @Autowired
    MyRedisProperties redisProperties;

    @Bean
    public JedisPoolConfig setPoolConfig(){
        return new JedisPoolConfig();
    }

    @Bean
    public JedisPool setPool(){
        JedisPool jedisPool = new JedisPool(setPoolConfig(),
                redisProperties.getHost(),
                redisProperties.getPort(),
                redisProperties.getTimeout(),
                redisProperties.getPassword(),
                redisProperties.getDatabase());

        return  jedisPool;

    }

    //RedisAPI这是我专门定义的一个工具类
    @Bean
    public RedisAPI setProperties(){

        RedisAPI redisAPI = new RedisAPI();
        redisAPI.setJedisPool(setPool());

        return redisAPI;

    }
}
  • resources下META-INF下新建一个spring.factories
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.redis.spring.boot.redisspringbootautoconfigure.MyRedisAutoConfiguration

2.创建starter模块

在pom文件中引用一下上面步骤安装好的依赖即可

 <dependencies>
        <dependency>
            <groupId>com.jf3q</groupId>
            <artifactId>redis-spring-boot-autoconfigure</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

3.测试模块

在pom文件中把第二步安装好的依赖导入就可以使用了

注意:

  • 在创建自动配置模块的时候,一直无法生成那个json文件。导致application.properties里不能自动提示

解决方案:我建自动配置模块的时候把springboot-test引入了导致无法生成json文件

  • 加jedis依赖的时候不要写版本号,不然有可能出现版本不一致导致的错误,因为这个jedis其实在boot的版本里已经设置版本了(人家设置的这个版本是跟其他jar是兼容的)

好博客就要一起分享哦!分享海报

此处可发布评论

评论(2展开评论

周杰伦 能力:10

2023-03-28 10:34:21

头像是鸡宇哥吗
蓝色妖姬 能力:10

2023-03-27 20:00:33

我天天刷枪,刷出神经病了,哈哈哈哈
点击查看更多评论

展开评论

您可能感兴趣的博客

客服QQ 1913284695