承接上文:

import注解的使用:

作用:引用时,容器自动创建出这填写的类型的组件,默认组件的名字就是全类名。

往容器中添加两个组件

@Import({User.class, DBHelper.class})

测试:

System.out.println("=======测试import========");
String[] beanNamesForType = run.getBeanNamesForType(User.class);
System.out.println("==============");
for(String s: beanNamesForType){
System.out.println(s);
}
DBHelper bean1 = run.getBean(DBHelper.class);
System.out.println(bean1);

结果:

com.xbhog.pojo.User

user

ch.qos.logback.core.db.DBHelper@68565bc7

可以看出,使用import的组件返回名字时全类名,我们自己写的组件,就是原来的。

条件装配

条件装配:满足Conditional指定的条件,则进行组件注入.

组件注解:

实例采用以下两个为例:

  1. @ConditionalOnMissingBean(name="tom11")
  2. @ConditionalOnBean(name="tom11")
  1. ConditionalOnMissingBean表示当容器中没有这个tom11组件时,执行下面的组件

    @Import({User.class, DBHelper.class})
    @Configuration(proxyBeanMethods = false)
    public class MyConfig {
    @ConditionalOnMissingBean(name="tom11")
    @Bean
    public User user(){
    User user = new User("xbhog", 18);
    return user;
    }
    //@Bean("tom11")
    public Pet tomcat(){
    return new Pet("tomcat");
    }
    }

    主启动程序中的代码片段:

    ConfigurableApplicationContext run = SpringApplication.run(Myapp.class, args);  //返回IOC容器
    boolean tom11 = run.containsBean("tom11");
    //容器中tom11组件:false
    //容器中user组件:true
    System.out.println("容器中tom11组件:"+tom11);
    boolean user = run.containsBean("user");
    System.out.println("容器中user组件:"+user);

    结果:

    容器中tom11组件:false
    容器中user组件:true
  2. ConditionalOnBean表示当容器中存在该组件时,才执行下面的内容

    @Import({User.class, DBHelper.class})
    @Configuration(proxyBeanMethods = false)
    public class MyConfig {
    @ConditionalOnBean(name="tom11")
    @Bean
    public User user(){
    User user = new User("xbhog", 18);
    return user;
    }
    //@Bean("tom11")
    public Pet tomcat(){
    return new Pet("tomcat");
    }
    }

    主程序启动代码:

    ConfigurableApplicationContext run = SpringApplication.run(Myapp.class, args);  //返回IOC容器
    boolean tom11 = run.containsBean("tom11");
    //容器中tom11组件:false
    //容器中user组件:true
    System.out.println("容器中tom11组件:"+tom11);
    boolean user = run.containsBean("user");
    System.out.println("容器中user组件:"+user);

    结果:

    容器中tom11组件:false
    容器中user组件:false

配置绑定:

解决的问题:

将properties文件中的内容绑定到类的属性中,并把它们封装到JavaBean中,以供随时使用

有两种方法实现:

第一种:

采用component+configurationProperties来绑定properties中的数据

properties数据:(brand:别摸我)

mycar.brand = BMW
mycar.price = 200000

编写Car实体类:

package com.xbhog.popj;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component; @Data
@AllArgsConstructor //有参构造
@NoArgsConstructor //无参构造
@Component //将该类加入到容器中,来获得Spring Boot提供的强大的功能
@ConfigurationProperties(prefix="mycar") //实现读取绑定到properties中的以mycar前缀的数据
public class Car {
private String brand;
private String price;
}

编写Controller:

package com.xbhog.controller;

import com.xbhog.popj.Car;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class MyController {
@Autowired //自动匹配到容器中的car
Car car; @RequestMapping("/car")
public Car car(){
return car;
}
}

实现效果:

{"brand":"BMM","price":"200000"}

第二种:

EnableConfigurationProperties+ConfigurationProperties

@EnableConfigurationProperties(类.class)

功能:

  1. 开启类配置绑定功能
  2. 把这个类这个组件自动注册到容器中

需要把EnableConfigurationProperties注解加到配置类中,因为配置类本身就是组件。

MyConfig:

@Configuration
@EnableConfigurationProperties(Car.class) //开启Car配置绑定功能n并把Car自动注册到容器中
public class MyConfig { }

@ConfigurationProperties(prefix = “mycar”)

找到配置文件中application.properties中的前置为mycar的内容

实现效果:

{"brand":"BMM","price":"200000"}

原生配置文件引入:

使用@ImportResouce注解将bean.xml中的组件加入到容器中

bean.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="haha" class="com.xbhog.pojo.User">
<property name="name" value="zhangsan"></property>
<property name="age" value="18"></property>
</bean> <bean id="hehe" class="com.xbhog.pojo.Pet">
<property name="name" value="tomcat"></property>
</bean> </beans>
package com.xbhog.springboot1times;

import ch.qos.logback.core.db.DBHelper;
import com.xbhog.config.MyConfig;
import com.xbhog.pojo.Pet;
import com.xbhog.pojo.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource; //@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.xbhog")
@ImportResource("classpath:bean.xml")
public class Myapp {
public static void main(String[] args) {
/*1. 返回我们IOC容器*/
ConfigurableApplicationContext run = SpringApplication.run(Myapp.class, args);
boolean haha = run.containsBean("haha");
boolean hehe = run.containsBean("hehe");
System.out.println("是否存在:"+haha+"==="+hehe);
}
}

结果:是否存在:true===true

参考:

尚硅谷B站视频

结束:

如果你看到这里或者正好对你有所帮助,希望能点个关注或者推荐,感谢;

有错误的地方,欢迎在评论指出,作者看到会进行修改。

SpringBoot之了解自动配置原理的更多相关文章

  1. springboot核心技术(二)-----自动配置原理、日志

    自动配置原理 配置文件能配置的属性参照 1.自动配置原理: 1).SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration 2).@Enable ...

  2. 【springboot】之自动配置原理

    使用springboot开发web应用是很方便,只需要引入相对应的GAV就可以使用对应的功能,springboot默认会帮我们配置好一些常用配置.那么springboot是怎么做到的呢?这篇文章将一步 ...

  3. SpringBoot 2.X集成 jdbc自动配置原理探究

    前言 Springboot对于数据访问层,不管是 SQL还是 NOSQL,Spring Boot 底层都是采用 Spring Data 的方式统一处理.Spring Data 是 Spring 家族中 ...

  4. SpringBoot自动配置原理

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面Spring的文章(以学习的顺序排好): S ...

  5. SpringBoot的自动配置原理过程解析

    SpringBoot的最大好处就是实现了大部分的自动配置,使得开发者可以更多的关注于业务开发,避免繁琐的业务开发,但是SpringBoot如此好用的 自动注解过程着实让人忍不住的去了解一番,因为本文的 ...

  6. 3. SpringBoot ——自动配置原理浅析

    SpringBoot的功能之所以强大,离不开它的自动配置这一大特色.但估计很多人只是知其然而不知其所以然.下面本人对自动配置原理做一个分析: 在使用SpringBoot时我们通过引入不同的Starte ...

  7. 3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)

    1.外部配置加载顺序 SpringBoot也可以从以下位置加载配置: 优先级从高到低 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置  1.命令行参数 所有的配置都可以在命令行上进行指定 ...

  8. SpringBoot之自动配置原理

    我在前面的Helloworld的程序中已经分析过一次,配置原理了: 1).SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration 2).@En ...

  9. springboot(八) 嵌入式Servlet容器自动配置原理和容器启动原理

    1.嵌入式Servlet容器自动配置原理 1.1 在spring-boot-autoconfigure-1.5.9.RELEASE.jar => springboot自动配置依赖 jar包下,E ...

随机推荐

  1. adb基础命令

    adb运行原理: 启动一个 adb 客户端时,此客户端首先检查是否有已运行的 adb 服务器进程.如果没有,它将启动服务器进程.当服务器启动时,它与本地 TCP 端口 5037 绑定,并侦听从 adb ...

  2. 搭建简单模型训练MNIST数据集

    # -*- coding = utf-8 -*- # @Time : 2021/3/16 # @Author : pistachio # @File : test1.py # @Software : ...

  3. 液晶显示系列(2)之黑色背景的PPT更省电环保吗?常黑与常白型LCD

    原文地址点击这里: 数年前听过一个培训师讲课,他的电脑课件PPT背景颜色是黑色的?美其名曰:黑色省电环保!当时讲台下听课的那些菜鸟们(也包括区区在下)深以为然,不由得心中竖起大拇指:这老师有水平,境界 ...

  4. Java核心API-日期时间

    java.util.Date Date类用来表示时间点. 时间是用距离一个固定时间点的毫秒数表示的,这个时间点就是纪元. UTC时间是为表示这个纪元的科学标准时间,从1970年1月1日0时开始.另一种 ...

  5. Linux中系统时间同步ntpdate简介

    Linux服务器运行久时,系统时间就会存在一定的误差,一般情况下可以使用date命令进行时间设置,但在做数据库集群分片等操作时对多台机器的时间差是有要求的,此时就需要使用ntpdate进行时间同步.所 ...

  6. SpringBoot Validation优雅的全局参数校验

    前言 我们都知道在平时写controller时候,都需要对请求参数进行后端校验,一般我们可能会这样写 public String add(UserVO userVO) { if(userVO.getA ...

  7. C++实现二分法详解

    二分法是在一个排好序的序列(数组,链表等)中,不断收缩区间来进行目标值查找的一种算法,下面我们就来探究二分法使用的一些细节,以及常用的场景: 寻找一个数: 寻找左侧边界: 寻找右侧边界. 一.二分法的 ...

  8. Samba常见漏洞利用

    Samba简介 Samba是linux和unix系统上实现smb协议的一个免费软件,由服务器及客户端程序构成,Samba是面向Linux和Unix环境的Windows互操作性套件.它适用于在可能包括L ...

  9. 资源:VMware秘钥许可证

    一. 激活密钥 YG5H2-ANZ0H-M8ERY-TXZZZ-YKRV8 UG5J2-0ME12-M89WY-NPWXX-WQH88 UA5DR-2ZD4H-089FY-6YQ5T-YPRX6 GA ...

  10. TCP/UDP/HTTP的区别和联系(转载)

    一.TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据. 关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:"我们在传 ...