springboot-2-IOC容器的基本注解
@Configuration
告诉springboot这是一个配置类,用于补充IOC容器,
示例:
@Configuration //告诉springboot这是一个配置类,作为IOC容器的自定义补充
public class MyConfig {
@Bean //给容器添加组件bean,方法名即为组件id
public Pet pet(){
return new Pet("左",12.2);
}
}
从IOC容器尝试获取(只要没再pojo上用@Repository就能获取到,否则报错)
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//1、返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看IOC容器中的bean
String[] beanDefinitionNames = run.getBeanDefinitionNames();
for (String i:beanDefinitionNames){
System.out.println(i);
}
//3、从容器中获取自定义的bean
Pet pet = run.getBean("pet", Pet.class);
System.out.println("pet------------>>>>>"+pet);
}
}
@Configuration的proxyBeanMethods属性
属性默认为true,我们每次调用这个方法实际上都是从IOC容器中去找这个bean(在项目启动的时候就加载到IOC容器中去了)为全模式(FULL)
属性调为false,我们每次调用这个方法都会产生一个新的实例,为Lite模式,解决的问题是组件依赖(轻量级模式(每次调用方法不需要从IOC容器中找,运行速度较快)
验证是否为单实例(结果为true)
//4、配置类本身也是一个bean,我们可以通过IOC容器获取配置类
MyConfig ConfigBean = run.getBean(MyConfig.class);
System.out.println("config---------->>>>>>>>"+ConfigBean);
//再通过获取到的bean调用里面的方法获取自定义bean
Pet pet1 = ConfigBean.pet();
Pet pet2 = ConfigBean.pet();
//判断获取到的这两个实例是否一致
System.out.println("equals---------->>>>>>"+pet1.equals(pet2));
但如果我们把配置类的proxyBeanMethods属性设为false(关闭单实例)
每次调用这个方法ConfigBean.pet()放回来的都是一个不同的bean实例(地址一定不同)
组件依赖
就比如在咋person类中,有一个pet属性,我们咋配置类中为这两个pojo都创建了bean实例,其中在person中是直接调用了pet创建实例的方法注入的pet属性,那么现在IOC容器中person实例里的pet实例,是否和IOC容器中的pet实例相同呢?这就是组件依赖,由
proxyBeanMethods属性定义可以知道:开启为true时这两个实例是一致的,但如果false则不一致
由于我们一般都是直接从IOC容器中拿实例对象,而不会直接去调用这个对应的方法去获得实例对象,所以只要没有组件依赖的话,一般把proxyBeanMethods调为false,这样我们的启动速度较快
两种注入注入属性的方法的对照
两种配置bean的方式一起使用会导致多个实例报错(默认为单实例模式)

配置文件的注入属性一般是修改在starter中默认配置好的一些使用环境需要的bean的属性(他们原来就是含有一定的默认属性的
在配置类中注入创建实例化对象并注入属性一般是针对一些自定义的bean的操作
@Import
可以加在任意类的上面,@Import(
{这里是一个集合,把需要实例化的类放到这里就会自动实例化放到IOC容器中}),生成的bean实例的id为全类名用于实例化对象,在IOC容器中添加bean,当配置类中含有这个类的配置时,不会再创建了
@Import注解主要可以用于导入第三方包,然后再使用yaml配置文件注入属性
@Conditional
条件装配:满足Conditional指定的条件,配置类才会进行组件注入
衍生了很多按照不同种类条件的注解

@ImportResource
导入xml配置的xml文件
在一个基础的配置类的上面加上@ImportResource就可以导入其他xml配置文件
示例:
@Configuration(proxyBeanMethods = true) //没有这个注解@ImportResource也会无效
@ImportResource("classpath:applicationContext.xml")
public class MyConfig {}
@ConfigurationProperties
就是使用yaml配置文件进行属性注入,需要和@Component注解配合,前者用于给这个bean实例去别名,后者把这个bean实例放到IOC容器中去。
示例:
@Component
@ConfigurationProperties(prefix = "person")
//有了这个注解之后,如果有注解提示的依赖得话,在yaml文件中就会出现person的提示
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private Integer age;
private Pet pet;
}
springboot应用实践的流程
1、引入场景依赖(在官网上看是否有这个starter)
2、查看自动配置了哪些
在yaml配置文件中添加debug: true即可在控制台看到哪些class生效哪些没生效

3、参照官方文档对yaml配置文件修改一些bean的属性
4、加上需要自定义得类,在用配置类注入属性就完成了IOC容器的配置
了解配置文件的到底是怎么配置的
自动配置类,在spring.factory类中可以全浏览

实例打开HttpEncodingAutoConfiguration一探究竟
//表名这时一个配置类(为轻量级模式)
@Configuration(proxyBeanMethods = false)
//自动配置类的配置属性(关键)
@EnableConfigurationProperties(ServerProperties.class)
//下面均为在一定环境下才生效这个配置类
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
private final Encoding properties;
//@EnableConfigurationProperties配置过来的属性会自动配置到这个里
public HttpEncodingAutoConfiguration(ServerProperties properties) {
this.properties = properties.getServlet().getEncoding();
}
//@Bean表示这里输出一个bean
@Bean
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Encoding.Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Encoding.Type.RESPONSE));
return filter;
}
//@Bean表示这里输出一个bean
@Bean
public LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() {
return new LocaleCharsetMappingsCustomizer(this.properties);
}
static class LocaleCharsetMappingsCustomizer
implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>, Ordered {
private final Encoding properties;
LocaleCharsetMappingsCustomizer(Encoding properties) {
this.properties = properties;
}
@Override
public void customize(ConfigurableServletWebServerFactory factory) {
if (this.properties.getMapping() != null) {
factory.setLocaleCharsetMappings(this.properties.getMapping());
}
}
@Override
public int getOrder() {
return 0;
}
}
}
把@EnableConfigurationProperties(ServerProperties.class)单独拿出来看
打开serverproties类查看源码
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
//普通属性
private Integer port;
。。。
//还有内部类
public static class Servlet {
。。。
private String contextPath;
。。。
}
}
根据前缀和属性名字,可知道这个地方的port配置应该是

根据前缀和内部类名字和内部类的属性,可知contextPath配置应该是

配置文件配置到组件使用的流程

springboot-2-IOC容器的基本注解的更多相关文章
- SpringBoot框架——从SpringBoot看IoC容器初始化流程之方法分析
目录 一.概观Spring Boot 二.Spring Boot应用初始化 2.1 初始化入口 2.2 SpringApplication的run方法 2.3 方法分析 三.容器创建与初始化 3.1 ...
- 手把手教你调试SpringBoot启动 IoC容器初始化源码,spring如何解决循环依赖
授人以鱼不如授人以渔,首先声明这篇文章并没有过多的总结和结论,主要内容是教大家如何一步一步自己手动debug调试源码,然后总结spring如何解决的循环依赖,最后,操作很简单,有手就行. 本次调试 是 ...
- [Spring]IoC容器之进击的注解
先啰嗦两句: 第一次在博客园使用markdown编辑,感觉渲染样式差强人意,还是github的样式比较顺眼. 概述 Spring2.5 引入了注解. 于是,一个问题产生了:使用注解方式注入 JavaB ...
- IoC容器-Bean管理注解方式(完全注解开发)
完全注解开发 (1)创建配置类,替代xml配置文件 (2)编写测试类 在实际中一般用springboot做
- IoC容器-Bean管理注解方式(创建对象)
IoC操作Bean管理(基于注解方式) 1,什么是注解 (1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值...) (2)使用注解,注解作用在类上面,方法上面,属性上面 ( ...
- IoC容器-Bean管理注解方式(注入属性@Autowired和Qualifier)
基于注解方式实现属性注入 (1)@Autowired:根据属性类型进行自动装配 第一步 把 service 和 dao 对象创建,在service 和 dao 类添加创建对象注解 第二步 在servi ...
- IoC容器-Bean管理注解方式(组件扫描配置)
4,开启组件扫描细节配置
- 05_IOC容器装配Bean(注解方式)
IOC容器装配Bean(注解方式) 1.使用注解方式进行Bean注册 xml 方式: <bean id="" class=""> spring2.5 ...
- SpringBoot启动流程分析(六):IoC容器依赖注入
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程分析(四):IoC容器的初始化过程
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
随机推荐
- 我的N年软件测试感悟
1.前言 大家好!我是Meng前段时间,很荣幸被一合作伙伴邀请发表一篇文章,主题为"这些年,我所从事软件测试的一些感悟",正好趁着这个机会,我也好好总结一下. 2.测试培训 对于软 ...
- 笔记-13-多线程 Thread方法 线程安全 生产者和消费者 死锁和阻塞 练习
题目1 编写程序,创建两个线程对象,一根线程循环输出"播放背景音乐",另一根线程循环输出"显示画面";要求: 1: 1个线程使用Runnable接口的匿名内部类 ...
- 十三、给已安装的nginx动态添加模块
给已安装的nginx动态添加模块说明:已经安装好的nginx,需要添加一个未被编译安装的模块,需要怎么弄呢?具体:这里以安装 --with-http_ssl_module模块为例nginx的模块是需要 ...
- js正则中文
hi,大家好 今天跟小伙伴们浅谈以下如何用正则表示中文以及如何去运用.众所周知中文在计算机中是不能进行存储的.那我们是以什么办法让我们和计算机进行更好的沟通呢?常用的几种中文编码格式utf-8编码ut ...
- NX二次开发-向量乘矩阵的几何意义
函数:UF_MTX3_vec_multiply_t() 或者UF_MTX3_vec_multiply().推荐使用UF_MTX3_vec_multiply_t() 函数说明:将向量按照矩阵进行变换:绝 ...
- 聚类算法K-Means算法和Mean Shift算法介绍及实现
Question:什么是聚类算法 1.聚类算法是一种非监督学习算法 2.聚类是在没有给定划分类别的情况下,根据数据相似度进行样本分组的一种方法 3.理论上,相同的组的数据之间有相同的属性或者是特征,不 ...
- Webflux请求处理流程
spring mvc处理流程 在了解SpringMvc的请求流程源码之后,理解WebFlux就容易的多,毕竟WebFlux处理流程是模仿Servlet另起炉灶的. 下面是spring mvc的请求处理 ...
- 聊一聊 Spring Boot 中 RESTful 接口设计规范
在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性.接口的稳定性.接口的跨域性.接口的协议规则.接口的路径规则.接口单一原则.接口过滤和接口组合等诸多因素,本篇文章将简要分 ...
- leetcode5698.基本计算器
给你一个整数数组 nums ,和两个整数 limit 与 goal .数组 nums 有一条重要属性:abs(nums[i]) <= limit . 返回使数组元素总和等于 goal 所需要向数 ...
- oracle中job无法正常运行,如何排查
1.生产环境Oracle中的job无法正常运行 select * from dba_jobs_running;(查看正在运行的job) 2.select * from dba_jobs(查看job历史 ...