SpringBoot之了解自动配置原理
承接上文:
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指定的条件,则进行组件注入.
组件注解:

实例采用以下两个为例:
- @ConditionalOnMissingBean(name="tom11")
- @ConditionalOnBean(name="tom11")
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
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)
功能:
- 开启类配置绑定功能
- 把这个类这个组件自动注册到容器中
需要把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
参考:
结束:
如果你看到这里或者正好对你有所帮助,希望能点个关注或者推荐,感谢;
有错误的地方,欢迎在评论指出,作者看到会进行修改。
SpringBoot之了解自动配置原理的更多相关文章
- springboot核心技术(二)-----自动配置原理、日志
自动配置原理 配置文件能配置的属性参照 1.自动配置原理: 1).SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration 2).@Enable ...
- 【springboot】之自动配置原理
使用springboot开发web应用是很方便,只需要引入相对应的GAV就可以使用对应的功能,springboot默认会帮我们配置好一些常用配置.那么springboot是怎么做到的呢?这篇文章将一步 ...
- SpringBoot 2.X集成 jdbc自动配置原理探究
前言 Springboot对于数据访问层,不管是 SQL还是 NOSQL,Spring Boot 底层都是采用 Spring Data 的方式统一处理.Spring Data 是 Spring 家族中 ...
- SpringBoot自动配置原理
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面Spring的文章(以学习的顺序排好): S ...
- SpringBoot的自动配置原理过程解析
SpringBoot的最大好处就是实现了大部分的自动配置,使得开发者可以更多的关注于业务开发,避免繁琐的业务开发,但是SpringBoot如此好用的 自动注解过程着实让人忍不住的去了解一番,因为本文的 ...
- 3. SpringBoot ——自动配置原理浅析
SpringBoot的功能之所以强大,离不开它的自动配置这一大特色.但估计很多人只是知其然而不知其所以然.下面本人对自动配置原理做一个分析: 在使用SpringBoot时我们通过引入不同的Starte ...
- 3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
1.外部配置加载顺序 SpringBoot也可以从以下位置加载配置: 优先级从高到低 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置 1.命令行参数 所有的配置都可以在命令行上进行指定 ...
- SpringBoot之自动配置原理
我在前面的Helloworld的程序中已经分析过一次,配置原理了: 1).SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration 2).@En ...
- springboot(八) 嵌入式Servlet容器自动配置原理和容器启动原理
1.嵌入式Servlet容器自动配置原理 1.1 在spring-boot-autoconfigure-1.5.9.RELEASE.jar => springboot自动配置依赖 jar包下,E ...
随机推荐
- Charles下载及安装破解-自己编辑
Charles下载地址 地址:https://www.charlesproxy.com/latest-release/download.do 2. Charles破解 破解地址:https://www ...
- 72 个网络应用安全实操要点,全方位保护 Web 应用的安全
原文地址:Web Application Security Checklist 原文作者:Teo Selenius(已授权) 译者 & 校正:HelloGitHub-小熊熊 & 卤蛋 ...
- macOS 下使用命令行进行用户(组)管理,就是这么简单! dscl 你很有必要了解一下!!
大家好,我是@小猿来也... Command-line interface to Directory Services. 在 linux 系统中我们习惯了使用 useradd,userdel,user ...
- Java算法面试题(史上最强、持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- 简单聊聊Ehcache缓存
最近工作没有那么忙,有时间来写写东西.今年的系统分析师报名已经开始了,面对历年的真题,真的难以入笔,所以突然对未来充满了担忧,还是得抓紧时间学习技术. 同事推了一篇软文,看到了这个Ehcache,感觉 ...
- Netty 框架学习 —— 单元测试
EmbeddedChannel 概述 ChannelHandler 是 Netty 程序的关键元素,所以彻底地测试它们应该是你的开发过程中的一个标准部分,EmbeddedChannel 是 Netty ...
- .NET Core添加日志插件
二. 首先控制器的方法中写: private readonly ILogger<fluueController> _logger; public fluueController(ILogg ...
- 在vue项目中使用scss,以及vscode适配scss语法(解决使用scss语法编辑器报错)
项目搭建好之后 安装sass 依赖包 npm install --save-dev sass-loader //sass-loader依赖于node-sass npm install --save-d ...
- java变量及常量
变量 本质:就是代表一个"可操作的存储空间",空间位置是确定的,但是里面放置什么值不确定.我们可通过变量名来访问"对应的存储空间",从而操纵这个"存储 ...
- OSPF路由协议
一.OSPF的工作过程 二.OSPF的基本概念 三.DR与BDR 四.OSPF数据包类型 五.OSPF邻接关系的建立 六.OSPF的路由器类型 一.OSPF的工作过程 OSPF路由协议针对每一个区域分 ...