@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)

官网:https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter

2、查看自动配置了哪些

在yaml配置文件中添加debug: true即可在控制台看到哪些class生效哪些没生效

3、参照官方文档对yaml配置文件修改一些bean的属性

官方:https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#common-application-properties

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容器的基本注解的更多相关文章

  1. SpringBoot框架——从SpringBoot看IoC容器初始化流程之方法分析

    目录 一.概观Spring Boot 二.Spring Boot应用初始化 2.1 初始化入口 2.2 SpringApplication的run方法 2.3 方法分析 三.容器创建与初始化 3.1 ...

  2. 手把手教你调试SpringBoot启动 IoC容器初始化源码,spring如何解决循环依赖

    授人以鱼不如授人以渔,首先声明这篇文章并没有过多的总结和结论,主要内容是教大家如何一步一步自己手动debug调试源码,然后总结spring如何解决的循环依赖,最后,操作很简单,有手就行. 本次调试 是 ...

  3. [Spring]IoC容器之进击的注解

    先啰嗦两句: 第一次在博客园使用markdown编辑,感觉渲染样式差强人意,还是github的样式比较顺眼. 概述 Spring2.5 引入了注解. 于是,一个问题产生了:使用注解方式注入 JavaB ...

  4. IoC容器-Bean管理注解方式(完全注解开发)

    完全注解开发 (1)创建配置类,替代xml配置文件 (2)编写测试类 在实际中一般用springboot做

  5. IoC容器-Bean管理注解方式(创建对象)

    IoC操作Bean管理(基于注解方式) 1,什么是注解 (1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值...) (2)使用注解,注解作用在类上面,方法上面,属性上面 ( ...

  6. IoC容器-Bean管理注解方式(注入属性@Autowired和Qualifier)

    基于注解方式实现属性注入 (1)@Autowired:根据属性类型进行自动装配 第一步 把 service 和 dao 对象创建,在service 和 dao 类添加创建对象注解 第二步 在servi ...

  7. IoC容器-Bean管理注解方式(组件扫描配置)

    4,开启组件扫描细节配置

  8. 05_IOC容器装配Bean(注解方式)

    IOC容器装配Bean(注解方式) 1.使用注解方式进行Bean注册 xml 方式: <bean id="" class=""> spring2.5 ...

  9. SpringBoot启动流程分析(六):IoC容器依赖注入

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  10. SpringBoot启动流程分析(四):IoC容器的初始化过程

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

随机推荐

  1. Hashing散列注意事项

    Hashing散列注意事项 Numba支持内置功能hash(),只需__hash__()在提供的参数上调用成员函数即可 .这使得添加对新类型的哈希支持变得微不足道,这是因为扩展APIoverload_ ...

  2. 反应式系统实现MQTT客户机

    反应式系统实现MQTT客户机 Implementing an MQTT client for reactive systems MQTT Reactive是从LiamBindle的MQTT-C库派生的 ...

  3. Java静态方法和实例方法的区别以及this的用法

    Java静态方法和实例方法 相同之处:都能接收传过来的参数,都能返回参数. 不同之处:有static就是静态方法,静态方法在另外一个类里面,不用new这个静态方法所在的类,也能直接访问这个方法,比较方 ...

  4. 【NX二次开发】获取体是实体还是片体UF_MODL_ask_body_type()

    判断体是实体还是片体:UF_MODL_ask_body_type() //输出 Body type: //UF_MODL_SOLID_BODY 5601 //UF_MODL_SHEET_BODY 56 ...

  5. 11:(1055, "'bbs02.app01_category.name' isn't in GROUP BY")

    后台报错:[err] 1055 --  'xxx' isn't in GROUP BY 解决方案: 初步判断是数据库(版本?配置?)的问题 进入mysql 的my.ini配置文件 ctrl+f 搜索找 ...

  6. Netty 框架学习 —— EventLoop 和线程模型

    EventLoop 接口 Netty 是基于 Java NIO 的,因此 Channel 也有其生命周期,处理一个连接在其生命周期内发生的事件是所有网络框架的基本功能.通常来说,我们使用一个线程来处理 ...

  7. 【模拟7.14】建造游乐园(play)

    这题是玄学的数论 首先考虑如何枚举偶数点度的图 可以考虑取出i-1个点 那么成图的数量为2^C(i-1,2) (原因单独取出的i点能平衡已建图中的奇数点,原因是某种性质....) 然后求带联通标号的欧 ...

  8. C# 位图BitArray 小试牛刀

    前面聊了布隆过滤器,回归认识一下位图BitMap,阅读前文的同学应该发现了布隆过滤器本身就是基于位图,是位图的一种改进. 位图 先看一个问题, 假如有1千万个整数,整数范围在1到1亿之间,如何快速确定 ...

  9. NUC980 运行 RT-Thread 时使用 GPIO

    如何使用 GPIO? NuMaker-RTU-NUC980 板子引出的 IO 有: 分别有一个 I2C1.GPIO.SPI0.UART4,RT-Thread 中 NuMaker-RTU-NUC980 ...

  10. 详解C++中继承的基本内容

    有些类与类之间存在特殊的关系,有共性也有特性,比如动物类可以细分为猫,狗等.下级别的成员除了拥有上一级的共性,还有自己的特性,这个时候就可以考虑继承的技术,减少重复代码. 一.继承中的对象模型 1.1 ...