@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. 基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化

    基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化 Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Auto ...

  2. Autofac入门

    注意:本文为原创文章,任何形式的转载.引用(包括但不限于以上形式)等,须先征得作者同意,否则一切后果自负. 简介 Autofac 是一个令人着迷的.NET IoC 容器. 它管理类之间的依赖关系.当应 ...

  3. javaBean命名规范 get / set 后的首字母大写

    javaBean命名规范 Sun 推荐的命名规范 1 ,类名要首字母大写,后面的单词首字母大写 2 ,方法名的第一个单词小写,后面的单词首字母大写 3 ,变量名的第一个单词小写,后面的单词首字母大写 ...

  4. 快速上手pandas(上)

      pandas is a fast, powerful, flexible and easy to use open source data analysis and manipulation to ...

  5. 【Java】equals 和 == 的区别

    之前有在 Java字符串比较(3种方法)以及对比 C++ 时的注意项 中写过一点关于 equals()与==的比较,但最近的Java考试复习过程中发现有部分情况没涉及到,故重新学习一下 在编写代码的时 ...

  6. winform/WPF 多语言的实现

    WPF实现起来非常现代化,可以参考 https://www.cnblogs.com/yang-fei/p/4854460.html winform主要说一下实现过程和注意点,实现参考AutoUpdat ...

  7. DOS命令行(5)——Windows系统的配置与管理(下)

    whoami --查看当前有效用户 这个工具可以用来获取本地系统上当前用户(访问令牌)的用户名和组信息,以及相应的安全标识符(SID).声明.本地系统上当前用户的权限.登录标识符(登录 ID).例如, ...

  8. OpenResty高并发

    在电商项目中所有的访问都是通过首页访问进去的,那么首页门户的访问频率会是非常高的,用我们专业术语来说就是并发量高,这时问题就来了,并发量高我们在做程序时就要保证首页的抗压能力强,而且还要保证抗压的同时 ...

  9. Unity_DOTween

    DOTween官网 DG.Tweening.Ease枚举详解 2019.12.12补充: 问题:当前dotween动画没播放完,便再次播放有冲突的操作,如连续多次播放.正播.倒播,导致显示不正常或报错 ...

  10. .Net Core:限流

    一.环境 1.vs2019 2..Net Core 3.1 3.引用 AspNetCoreRateLimit 4.0.1 二.基础使用 1.设置 在Startup文件中配置如下,把配置项都放在前面: ...