@Configuration注解

@Configuration注解的作用是代替以前我们使用的xml配置文件,被注解的类就是配置类,其内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
被@Configuration注解标注配置类本身也是一个组件。

基本使用

Pet类

/*** @author:小关同学爱吃汉堡* @date: 2021/4/5 17:41*/
public class Pet {private String name;public Pet(){}public Pet(String name){this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Pet{" +"name='" + name + '\'' +'}';}
}

User类

/*** @author:小关同学爱吃汉堡* @date: 2021/4/5 17:40*/
public class User {private String name;private Integer age;private Pet pet;public Pet getPet() {return pet;}public void setPet(Pet pet) {this.pet = pet;}public User(){}public User(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}

配置类
我们使用@Bean注解在方法上给容器注册组件,它默认是单实例的

import com.gcl.demo1helloworld.bean.Pet;
import com.gcl.demo1helloworld.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author:小关同学爱吃汉堡* @date: 2021/4/5 17:44*/
@Configuration(proxyBeanMethods = true)  //告诉SpringBoot这是一个配置类,
// 配置类本身也是一个组件
//proxyBeanMethods:代理bean的方法
//  Full(proxyBeanMethods = true)
//  Lite(proxyBeanMethods = false)
//  组件依赖
public class MyConfig {/*** @Bean注解标注的组件是单实例的* 在单实例下* 外部无论对配置类中的这个组件注册的方法调用多少次* 获取到的都是之前注册容器中的单实例对象* @return*/@Bean//相当于xml文件中的bean标签,作用是给容器中添加组件,以方法名作为组件的id,返回类型就是组件类型//返回的值,就是组件在容器中的实例public User user01(){User user = new User("张三",19);user.setPet(pet01());return user;}@Bean("cat")//这里修改组件的id为"cat"public Pet pet01(){return new Pet("cat");}
}

启动类

import com.gcl.demo1helloworld.bean.Pet;
import com.gcl.demo1helloworld.bean.User;
import com.gcl.demo1helloworld.config.MyConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;@SpringBootApplication(scanBasePackages="com.gcl")
public class Demo1HelloworldApplication {public static void main(String[] args) {//返回IOC容器ConfigurableApplicationContext context = SpringApplication.run(Demo1HelloworldApplication.class, args);//从容器中获取组件Pet pet1 = context.getBean("cat", Pet.class);Pet pet2 = context.getBean("cat", Pet.class);//判断@Bean注解标注的组件是否是单实例的System.out.println("组件:"+(pet1==pet2));//结果返回true,可知@Bean标注的组件是单实例的MyConfig bean = context.getBean(MyConfig.class);//结果:com.gcl.demo1helloworld.config.MyConfig$$EnhancerBySpringCGLIB$$b19d16f6@7e97551f//从结果可以看出该配置类被SpringCGLIB增强了System.out.println(bean);//获取到的bean本身就是一个代理对象//如果@Configuration(proxyBeanMethods = true)中的proxyBeanMethods值为true//那么外部每次使用配置类的方法都会从容器中找组件,获取到的就是代理对象//否则获取到的就不是代理对象//当proxyBeanMethods = true时,结果为true,//当proxyBeanMethods = false时,结果为false,User user1 = bean.user01();User user2 = bean.user01();System.out.println(user1 == user2);//当proxyBeanMethods = true时,结果为true,//即:user.setPet(pet01());中的pet01()没有创建新的Pet对象,还是使用容器中已经加载好的Pet对象//当proxyBeanMethods = false时,结果为false,//即:user.setPet(pet01());中的pet01()创建了一个新的Pet对象,容器取消判断容器中是否有重复的组件User user = context.getBean("user01",User.class);Pet cat = context.getBean("cat",Pet.class);System.out.println(user.getPet()==cat);}
}

Full模式与Lite模式

Full模式

保证每个@Bean方法被调用多少次返回的组件都是单实例的
配置类组件之间有依赖关系,方法会被调用得到之前单实例组件

Lite模式

每个@Bean方法被调用多少次返回的组件都是新创建的
配置类组件之间无依赖关系,用Lite模式加速容器启动过程,减少判断容器中是否有相同组件的过程

关于更多Full模式与Lite模式的知识有一篇文章写得很好:
Spring的@Configuration配置类-Full和Lite模式

SpringBoot复习:2(@Configuration注解)相关推荐

  1. SpringBoot学习之@Configuration注解和@Bean注解

    @Configuration 1.@Configuration注解底层是含有@Component ,所以@Configuration 具有和 @Component 的作用. 2.@Configurat ...

  2. springboot情操陶冶-@SpringBootApplication注解解析

    承接前文springboot情操陶冶-@Configuration注解解析,本文将在前文的基础上对@SpringBootApplication注解作下简单的分析 @SpringBootApplicat ...

  3. springboot中的@Conditional注解

    springboot中使用@Configuration注解完成一个配置类的配置,被该注解标注的类会在程序启动时自动的加载到IOC容器,但如果我们想通过一些条件来控制被@Configuraion注解标注 ...

  4. 难以想象SpringBoot中的条件注解底层居然是这样实现的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...

  5. 面试:SpringBoot中的条件注解底层是如何实现的?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...

  6. 好程序员分享SpringBoot须掌握的注解

    前言 Spring经历了如下几个阶段: 第一阶段:xml配置 在Spring 1.x时代,使用Spring开发满眼都是xml配置的Bean,随着项目的扩大,我们需要把xml配置文件放到不同的配置文件里 ...

  7. springboot项目中的注解 启动项目的方式 解决spring的bean.xml配置不生效 spring的基础JDBC配置

    依赖 创建一个 Spring Boot 工程时,可以继承自一个 spring-boot-starter-parent ,也可以不继承 先来看 parent 的基本功能有哪些? 定义了 Java 编译版 ...

  8. SpringBoot数据访问Mybatis注解版,配置版,注解与配置一体版

    SpringBoot数据访问Mybatis注解版,配置版,注解与配置一体版 注解版: 1.改druid 连接池,不改可以跳过这步 添加依赖 <dependency><groupId& ...

  9. SpringBoot:概述,注解,搭建,部署

    1,SpringBoot简介 1.1,SpringBoot概述 Spring框架非常优秀,然而它最大的问题在于"配置过多".基于Spring的企业级开发项目,需要大量的配置文件,S ...

最新文章

  1. 在CentOS 6.3 64bit上安装Apache Trafficserver 4.2.3
  2. ViSP中识别AprilTag的C++实例代码与运行结果
  3. nyoj-66 分数拆分
  4. Matlab实用程序--图形应用-枝干图
  5. java EF6,EF Core 2.0和EF6(Entity Framework 6)中配置实体映射关系
  6. keytool命令总结
  7. C++ 类成员引用变量的使用
  8. 微信小程序保存图片到相册;uni-app小程序保存网络图片到相册;小程序保存图片到相册拒绝授权后重新拉起授权;保存图片到系统相册;小程序保存图片测试可以,真机保存图片失败
  9. python中序列(列表list和元组tuple)的用法
  10. 【原创】CLEVO P157SM外接鼠标键盘失灵解决:更换硅脂(附带最新跑分数据)
  11. -bash-4.1问题
  12. Discuz 论坛实现qq小程序
  13. 03.Web大前端时代之:HTML5+CSS3入门系列~H5功能元素
  14. GD32实战6__串口读写
  15. Urbansound8k声音分类深度学习实战
  16. 【Python怎么批量修改文件名称】
  17. C/C++新手学习项目(三) 魔兽世界之三:开战
  18. Java md5加解密汉字_Java加解密_MD5
  19. 关于revision 的cover letter
  20. 55. Jump Game(跳跃游戏)

热门文章

  1. CSS自定义鼠标样式。JS获取鼠标坐标,实现提示气泡框跟随鼠标移动
  2. 在Ubuntu 14.04 64bit上下载更新x265源码
  3. 将BST转换为有序的双向链表!
  4. ue4商城资源 The Forest v1.5 森林景观场景
  5. leetcode-155 最小栈
  6. 你知道dos和cmd之间的关系以及区别吗?
  7. python_2开发简单爬虫
  8. 链表 -- 双向循环链表(线性表)
  9. UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP
  10. 使用html5进行视频播放