SpringBoot详解 二 (自动配置实现原理)

本文详细介绍了SpringBoot如何扫描并注入外部包,包括三种方式:使用`@ComponentScan`,`@Import`和`spring.factories`文件。`spring.factories`使得在使用外部jar时能自动加载配置。SpringBoot自动配置基于条件判断配置Bean,通过`@SpringBootApplication`、`@EnableAutoConfiguration`和`@ComponentScan`注解实现。同时,展示了如何自定义一个自动配置类,包括服务类、属性映射类和自动配置类的创建,并在`spring.factories`中注册。启动后,自定义服务类即可被注入到容器中。
摘要由CSDN通过智能技术生成

1.外部包注入的方式

Spring Boot自动配置默认扫描当前工程的package,也就是所在@SpringBootApplication的包路径

,所以外部包一般是不能直接被扫描到(当@SpringBootApplication的包路径和外部包的package一样时,外部包中的@service,@Configuration也会被注入),如果要扫描外部包可以通过以下三种方式。

方法一:使用@ComponentScan或@ComponentScans

方式二:使用@Import

方式三:使用 spring.factories 文件

2.作用

spring.factories 的作用是使用外部 jar 时不用再写配置,会自动加入已经配置好的配置,实现开箱即用。

3.SpringBoot自动配置的实现原理

SpringBoot的核心就是自动配置,自动配置又是基于条件判断来配置Bean,自动配置就是将对象实例化到容器中。(具体源码可以看spring-boot-autoconfigure的jar包)。

springboot进行实例化时SpringFactoriesLoader加载META-INF/spring.factories文件,将配置文件载入到spring容器。

会过滤出key为org.springframe.boot.autoconfigure.EnableConfiguration全限定名对应的值。

(最主要的注解就是@enableAutoConfiguration,而这个注解会导入一个EnableAutoConfigurationImportSelector的类,而这个类会去读取一个spring.factories下key为EnableAutoConfiguration全限定名对应值.)     

收集配置文件中配置工厂类。

@SpringBootApplication注解其实就包含@SpringBootConfiguration,EnableAutoConfiguration,ComponentScan这三个注解

@SpringBootConfiguration  :springbootp配置
@EnableAutoConfiguration   :开启springboot自动配置
@ComponentScan              :springboot的作用域

自己实现一个自动配置

1.定义一个服务类

package cn.xl.service;

public class UserMyService {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String say() {
        return "I am " + name;
    }
}

2.定义一个属性映射类

package com.util;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "autoconfiguser")
public class UserMyProperties {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3.创建一个自动配置类

package com.autoconfig;

import cn.xl.service.UserMyService;
import com.util.UserMyProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(UserMyProperties.class)
@ConditionalOnClass(UserMyService.class)
@ConditionalOnProperty(prefix = "autoconfiguser",value = "enabled",matchIfMissing = true)
public class UserMyAutoConfig {

    @Autowired
    UserMyProperties userMyProperties;

    @Bean
    public UserMyService autoConfigUserService() {
        UserMyService userMyService = new UserMyService();
        userMyService.setName(userMyProperties.getName());
        return userMyService;
    }
}

4.创建属性文件

在资源目录下创建一个META-INF/spring.factories 配置自动配置的属性文件

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.autoconfig.UserMyAutoConfig

5.启动测试

启动后UserMyService就可以注入到容器中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值