springboot自动配置原理详解1

java 专栏收录该内容
9 篇文章 0 订阅

spirng中注解释的属性注入

1.开发配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ems
jdbc.username=root
jdbc.password=root

2.开发配置类

@PropertySource(value = "classpath:jdbc.properties")  // 用来读取小配置文件
@Configuration   // 加上此注解说明当前类为配置类
public class JdbcProerties {
    private DruidDataSource druidDataSource = new DruidDataSource();
    @Value("${jdbc.driver}")  // @Value  属性注入 对当前属性进行注入
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean // 方法的返回值就是交流工厂管理的对象  方法名就是唯一标识
    public DruidDataSource getDruidDataSource() {
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }
  }

3.测试


@RestController  // 此注解 相当于  2个注解  @ResponseBody + @Controller
@RequestMapping("/test")   //对外访问路劲
public class TestJdbcProperties {

    @Autowired   //根据类型注入
    private DruidDataSource druidDataSource;

    @RequestMapping("/test")
    public String test(){

        System.out.println(druidDataSource);

        return "test jdbc properties";
    }

}

4.测试结果
测试结果

springboot的自动配置

1.springboot中的注解式的属性注入

  1. 开发application.properties
server.port=8989
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ems
jdbc.username=root
jdbc.password=root
  1. 书写属性配置类

@Data  // lombok 中的注解  此注解相当于 get set toString 方法
@AllArgsConstructor  // 有参构造
@NoArgsConstructor  // 无参构造
@Accessors(chain = true)  // 链式调用 get cat 方法

//属性配置类 读取springboot 中核心配置项 并且将值映射到对应的属性上 但是需要保证属性名和key值一样
//prefix 前缀  jdbc
@ConfigurationProperties(prefix = "jdbc")
public class JDBCProperties {
    private String username;
    private String password;
    private String url;
    private String driver;
}

  1. 书写配置类
// 配置类  读取属性配置类的信息
@EnableConfigurationProperties(value = JDBCProperties.class)
@Configuration
public class DataSourceConf {

    @Autowired
   JDBCProperties jdbcProperties;

    @Bean
    public DruidDataSource getDruidDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setPassword(jdbcProperties.getUsername());
        dataSource.setUsername(jdbcProperties.getUsername());
        dataSource.setDriverClassName(jdbcProperties.getDriver());
        dataSource.setUrl(jdbcProperties.getUrl());
        return dataSource;
    }
}

  1. 测试结果
    测试结果
  2. 小细节
开启properties  需要引入核心依赖  
<!--此jar包可以让配置文件有提示-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency> 

@Implrrt注解

  1. 自定义ImportSelector
public class Myselector implements ImportSelector {


    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        //AnnotationMetadata  代表配置类的相关信息
        //对象在容器中的唯一标识是当前类的权限定名
        String[] strs = {"com.baizhi.test1.Red","com.baizhi.test1.Yellow"};

        return strs;
    }
}

  1. 书写java配置 并引入自定义的ImportSelector
//  @Configuration  @Bean   springBoot 中的java配置
@Configuration
//加在类上  可以将一个对象交由工厂管理
@Import(value = Myselector.class)
public class ConfTest {

    public class ColorConf {

        @Bean
        public Pink getBlue() {
            Pink blue = new Pink();
            return blue;
        }
    }
}

  1. 测试
public class test {
    public static void main(String[] args) {
        // 从工厂中获取相应的bean
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ConfTest.class);
        //获取所有bean对象 返回一个数组
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        //遍历打印输出
        for (String beanDefinitionName : beanDefinitionNames) {

            System.out.println(beanDefinitionName);
        }

    }
}

  1. 测试结果

测试结果

结语

1. 了解自动配置原理前提工作前提都做好了,接下来 具体翻源码,绝对详细,喜欢的点
赞谢谢大家了,大家一起进步,爱你们,么么哒!
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值