SpringBoot复习:2(@Configuration注解)
@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注解)相关推荐
- SpringBoot学习之@Configuration注解和@Bean注解
@Configuration 1.@Configuration注解底层是含有@Component ,所以@Configuration 具有和 @Component 的作用. 2.@Configurat ...
- springboot情操陶冶-@SpringBootApplication注解解析
承接前文springboot情操陶冶-@Configuration注解解析,本文将在前文的基础上对@SpringBootApplication注解作下简单的分析 @SpringBootApplicat ...
- springboot中的@Conditional注解
springboot中使用@Configuration注解完成一个配置类的配置,被该注解标注的类会在程序启动时自动的加载到IOC容器,但如果我们想通过一些条件来控制被@Configuraion注解标注 ...
- 难以想象SpringBoot中的条件注解底层居然是这样实现的
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...
- 面试:SpringBoot中的条件注解底层是如何实现的?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...
- 好程序员分享SpringBoot须掌握的注解
前言 Spring经历了如下几个阶段: 第一阶段:xml配置 在Spring 1.x时代,使用Spring开发满眼都是xml配置的Bean,随着项目的扩大,我们需要把xml配置文件放到不同的配置文件里 ...
- springboot项目中的注解 启动项目的方式 解决spring的bean.xml配置不生效 spring的基础JDBC配置
依赖 创建一个 Spring Boot 工程时,可以继承自一个 spring-boot-starter-parent ,也可以不继承 先来看 parent 的基本功能有哪些? 定义了 Java 编译版 ...
- SpringBoot数据访问Mybatis注解版,配置版,注解与配置一体版
SpringBoot数据访问Mybatis注解版,配置版,注解与配置一体版 注解版: 1.改druid 连接池,不改可以跳过这步 添加依赖 <dependency><groupId& ...
- SpringBoot:概述,注解,搭建,部署
1,SpringBoot简介 1.1,SpringBoot概述 Spring框架非常优秀,然而它最大的问题在于"配置过多".基于Spring的企业级开发项目,需要大量的配置文件,S ...
最新文章
- 在CentOS 6.3 64bit上安装Apache Trafficserver 4.2.3
- ViSP中识别AprilTag的C++实例代码与运行结果
- nyoj-66 分数拆分
- Matlab实用程序--图形应用-枝干图
- java EF6,EF Core 2.0和EF6(Entity Framework 6)中配置实体映射关系
- keytool命令总结
- C++ 类成员引用变量的使用
- 微信小程序保存图片到相册;uni-app小程序保存网络图片到相册;小程序保存图片到相册拒绝授权后重新拉起授权;保存图片到系统相册;小程序保存图片测试可以,真机保存图片失败
- python中序列(列表list和元组tuple)的用法
- 【原创】CLEVO P157SM外接鼠标键盘失灵解决:更换硅脂(附带最新跑分数据)
- -bash-4.1问题
- Discuz 论坛实现qq小程序
- 03.Web大前端时代之:HTML5+CSS3入门系列~H5功能元素
- GD32实战6__串口读写
- Urbansound8k声音分类深度学习实战
- 【Python怎么批量修改文件名称】
- C/C++新手学习项目(三) 魔兽世界之三:开战
- Java md5加解密汉字_Java加解密_MD5
- 关于revision 的cover letter
- 55. Jump Game(跳跃游戏)