SpringBoot自动装配原理及starter实战开发

1、重要注解:

  • @@EnableAutoConfiguration:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})//导入参数类型到IOC
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}
  • @AutoConfigurationPackage:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})//保存扫描路径,提供给Spring-data-jpa查询 
public @interface AutoConfigurationPackage {
    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};
}
  • springboot自动装配的核心注解@Import:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
    Class<?>[] value();
}

如果参数是普通类,将该类实例化交给IOC容器管理;
如果参数是ImportBeanDefinitionRegistrar的实现类,支持手工注册bean;
如果参数是ImportSelector的实现类,注册selectImports返回的数组(类全路径)到IOC容器,批量注册;

  protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) { 
            return EMPTY_ENTRY;
        } else {
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);//获取注解属性
            //从META-INF/spring.factories加载类
            List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            configurations = this.removeDuplicates(configurations);
            Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
            this.checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            configurations = this.getConfigurationClassFilter().filter(configurations);
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
        }
    }

在这里插入图片描述

2、实战:

2.1在一个项目中写一个starter,将整个项目打包成jar包,作为一个dependency即依赖引入到另一个项目中:

  • starter项目结构:
    在这里插入图片描述

  • pxm.xml:
    在这里插入图片描述

  • 基础配置类:

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

@ConfigurationProperties(prefix = "his")//his是将来调用方在yml中配置的前缀
public class Properties {
    String name;
    String password;

    public Properties() {
    }
    
    public Properties(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Properties{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
  • 业务逻辑类:
import org.springframework.beans.factory.annotation.Autowired;

public class Service {
    @Autowired
    private Properties properties;
    //调用方在starter中的方法传递参数
    public void test(String name){
        System.out.println("Hello"+name);
    }
    //获取到调用方在yml中配置的属性
    public void test1(){
        System.out.println(properties.toString());
    }
}

  • 核心配置(自动装配)类:
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(Properties.class)//参数为配置对象
public class HelloAutoConfigure {
    //书写一个配置类对象成员变量
    private final Properties properties;
    //书写自动配置类有参构造将成员变量传入
    public HelloAutoConfigure(Properties properties) {
        this.properties = properties;
    }

    @Bean
    @ConditionalOnMissingBean
    public Service service(){

        return new Service();
    }
}

  • 在resource目录下创建的配置文件:
    在这里插入图片描述
    要是需要配置多个类得话,用,\隔开即可:
    在这里插入图片描述

基础配置类,业务逻辑类,核心配置类,以及配置文件都完成以后,启动一下项目,正常启动就说明配置成功了。

2.2、将整个项目打成jar包:
找到项目右侧的Maven
在这里插入图片描述
打包完成后jar包已经放在自己的maven仓库里了,只需要在另一个项目中将该jar包作为依赖引入到另一个项目中即可:
在这里插入图片描述
另外一个项目的pom.xml:
在这里插入图片描述
引入成功后的结果:
在这里插入图片描述
进行基础类的配置:
在这里插入图片描述
经行测试:
在这里插入图片描述
测试结果:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值