@Configuration:指明当前类是一个配置类,就是来替代spring的配置文件


@Configuration
public class MyConfigFile {@Beanpublic HelloService helloService(){return new HelloService();}
}

使用@Bean添加组件

@SpringBootTest
class SpringBoot02ApplicationTests {@AutowiredApplicationContext ioc;@Testpublic void testHelloService(){boolean helloService = ioc.containsBean("helloService");System.out.println(helloService);}}

测试:true


@Configuration注解进阶内容

1.创建一个User实体类

package com.hao.springbooton.bean;/*** @author:抱着鱼睡觉的喵喵* @date:2020/12/22* @description:*/
public class User {private String username;private String password;private int age;public User() {}public User(String username, String password, int age) {this.username = username;this.password = password;this.age = age;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", age=" + age +'}';}
}

2.编写一个MyConfig的配置类

/*** @author:抱着鱼睡觉的喵喵* @date:2020/12/22* @description:配置类*/
@Configuration
public class MyConfig {@Bean("hao")public User user(){return new User("tom","123",20);}}

3.在主配置文件从容器中获取user

@SpringBootApplication
public class SpringBootOnApplication {public static void main(String[] args) {ConfigurableApplicationContext run=SpringApplication.run(SpringBootOnApplication.class, args);//判断从容器中获取的是否是单实例User tom = run.getBean("hao", User.class);User tom1 = run.getBean("hao",User.class);System.out.println(tom==tom1);//通过配置类调用查看两次调用的结果MyConfig co = run.getBean(MyConfig.class);System.out.println(co);User user = co.user();User user1 = co.user();System.out.println(user==user1);}
}

结果:

我们编写的MyConfig配置类也是一个组件,配置类中注入的对象也是组件,我们发现通过配置类调用完这个user方法,两者是同一个user对象;所以无论是从另外一个组件中获取(比如MyConfig是一个组件)组件(对象),Spring都会从容器中进行查看是否存在该组件(从一个组件中调用另外一个组件也叫做组件依赖,具体看下面)
我们可以查看@Configuration注解源码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {@AliasFor(annotation = Component.class)String value() default "";boolean proxyBeanMethods() default true;
}

其中的proxyBeanMethods()方法默认值是true,这就保证了单实例


接下来我们引进组件依赖

编写Admin类

public class Admin {private String name;private String img;public Admin() {}public Admin(String name, String img) {this.name = name;this.img = img;}@Overridepublic String toString() {return "admin{" +"name='" + name + '\'' +", img='" + img + '\'' +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

修改User类,增加Admin属性

public class User {private String username;private String password;private int age;private Admin admin;public Admin getAdmin() {return admin;}public void setAdmin(Admin admin) {this.admin = admin;}public User() {}public User(String username, String password, int age) {this.username = username;this.password = password;this.age = age;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", age=" + age +", admin=" + admin +'}';}
}

MyConfig的修改(相关说明已在注释中表明)

/*** @author:抱着鱼睡觉的喵喵* @date:2020/12/22* @description:配置类*//*** Spring 5提供了Full模式和Lite模式* 组件依赖:容器中一个组件调用另外一个组件的情况* Lite:容器中组件没有依赖的情况:使用Lite模式能使容器快速启动* Full:容器中的组件存在依赖的情况,使用Full模式,由于在一个组件中存在调用另外一个组件的情况,所以会查看该组件在容器中是否存在,当然也就降低了容器启动的速度*/
@Configuration(proxyBeanMethods = true)
public class MyConfig {@Bean("hao")public User user(){User tom = new User("tom", "123", 20);//hao组件依赖了admin组件tom.setAdmin(admin());return tom;}@Bean("admin")public Admin admin(){return new Admin("jerry","@the");}
}
@SpringBootApplication
public class SpringBootOnApplication {public static void main(String[] args) {ConfigurableApplicationContext run=SpringApplication.run(SpringBootOnApplication.class, args);MyConfig co = run.getBean(MyConfig.class);User hao = run.getBean("hao", User.class);Admin admin = run.getBean("admin", Admin.class);System.out.println(hao.getAdmin()==admin);}}

此时运行结果:true

此时我把MyConfig类中的注解改为@Configuration(proxyBeanMethods = false)

@Configuration(proxyBeanMethods = false)
public class MyConfig {@Bean("hao")public User user(){User tom = new User("tom", "123", 20);//hao组件依赖了admin组件tom.setAdmin(admin());return tom;}@Bean("admin")public Admin admin(){return new Admin("jerry","@the");}
}

继续测试
结果:false

这说明当proxyBeanMethods = false时,Spring帮我们执行了Lite模式;


总结:假设我在配置类中,注入了两个组件(A和B)到容器中,组件A调用了组件B
Lite(proxyBeanMethods =false)模式:程序运行时Spring不会检查B组件是否存在,即上面举的例子中调用之后直接new个对象。
Full(proxyBeanMethods =true)模式:程序运行时,当A调用B时,Spring会检查容器中是否存在B组件,如果存在就从容器中拿

Lite和Full适用于的情况:当配置类中没有出现组件依赖的情况,使用Lite模式可以提高容器的启动速度。当配置中出现组件依赖的时候,使用Full模式最合适。

===========================================================
@Import是向容器中导入组件,需要和@Configuration注解一块使用

@Import({User.class,Admin.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {}

Spring Boot-@Configuration注解相关推荐

  1. 40 个 Spring Boot 常用注解

    以下文章来源方志朋的博客,回复"666"获面试宝典 作者 | 谭朝红 链接 | ramostear.com 一.Spring Web MVC 与 Spring Bean 注解 Sp ...

  2. 解决spring boot1.5以上版本@ConfigurationProperties提示“Spring Boot Configuration Annotation Processor not..

    Springboot1.5以上版本,在使用 @ConfigurationProperties注解的时候会提示"Spring Boot Configuration Annotation Pro ...

  3. SpringBoot项目中获取yml文件的属性时实体属性类出现Spring Boot Configuration Annotation Processor not found in classpath

    1.SpringBoot项目的项目结构如下: 2.属性实体类 上面出现了Spring Boot Configuration Annotation Processor not found in clas ...

  4. 项目可以运行但是在当前controller类顶部出现Spring Boot Configuration Annotation Proces

    学习pringBoot项目时,在写controller时发现,项目可以运行但是在当前controller类顶部出现Spring Boot Configuration Annotation Proces ...

  5. Spring Boot——[Spring Boot Configuration Annotation Processor not found in classpath]解决方案

    问题描述 使用Spring Boot开发的过程中,写读取Properties配置文件的配置类时提示Spring Boot configuration annotation processor not ...

  6. Spring Boot 核心注解与配置文件

    一.入口类与@SpringBootApplication 注解 Spring Boot项目都会有一个*Application 类,这个类作为Spring Boot 项目的入口类,在这个入口类中有mai ...

  7. Spring Boot @Conditional 注解

    Spring Boot @Conditional注解 @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件的才给容器注册Bean. @Conditional ...

  8. idea提示未配置 Spring Boot 配置注解处理器解决方法

    未配置 Spring Boot 配置注解处理器 解决方法: 在pom.xml里添加依赖 <dependency><groupId>org.springframework.boo ...

  9. Spring的@Configuration注解使用

    Spring的@Configuration注解用于定义配置类,可替换XML配置文件,被 注解的类内部包含有一个或者多个被@Bean注解的方法,这些方法将会被ApplicationContext上下文类 ...

  10. spring boot 相关注解

    spring boot是基于spring 开发的,因此,spring boot工程中可以使用spring 的注解.除了spring注解外,spring boot会使用到的注解有: @SpringBoo ...

最新文章

  1. 2020移动apn接入点哪个快_为什么都是4G网你的就没别人快?跟我这样设置,网速直线提升...
  2. linux从源码编译软件,linux软件包管理——源码包编译安装
  3. 杀毒软件为什么不能启动、运行
  4. b+树时间复杂度_深入理解数据库系统之存储存引擎(二叉搜索树)
  5. java读取pdf文件流,系列篇
  6. Alpha(5/10)
  7. tensordot 的源码解读
  8. angular 拦截器
  9. PHP面试题:mysql_fetch_row() 和mysql_fetch_array之间有什么区别?
  10. golang结构体tag的使用
  11. oracle foreign 查询,ORACLE foreign key
  12. 【Linux命令】nm 查看动态库和静态库中的符号
  13. javascript正则表达式复习
  14. 递归,复制对象,找质数,判断数组
  15. Ubuntu18.04修改主机名和用户名
  16. 火车票放票时间 潜规则
  17. 黑色背景的DW代码配色方案 Colors.xml
  18. vmpalyer虚拟机的使用教程,小白也能看懂
  19. 基于JavaWeb实现的问卷调查系统
  20. R2S设置openWrt软路由

热门文章

  1. Python服务器开发一:python基础
  2. 让IE6支持图片半透明
  3. soapui返回值类型都有哪些_货架的类型都有哪些呢
  4. python列表常用方法_第24p,必须掌握,列表的常用方法
  5. php面向对象的概括图解,深入分析php之面向对象
  6. 翻译职称计算机能力,2018年职称计算机word2003考点辅导:用好Office2003中的翻译功能...
  7. python中paste函数的作用_PIL使用小结(crop和paste函数)
  8. mysql待办事项表名_SSD8-Ex4待办事项列表答案参考
  9. python 曲线回归_线性回归——Python代码实现
  10. android控制电脑,android-remote-control-computer