Spring Boot-@Configuration注解
@Configuration:指明当前类是一个配置类,就是来替代spring的配置文件
@Configuration
public class MyConfigFile {
@Bean
public HelloService helloService(){
return new HelloService();
}
}
使用@Bean添加组件
@SpringBootTest
class SpringBoot02ApplicationTests {
@Autowired
ApplicationContext ioc;
@Test
public 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;
}
@Override
public 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;
}
@Override
public 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;
}
@Override
public 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注解的更多相关文章
- Spring Boot常用注解总结
Spring Boot常用注解总结 @RestController和@RequestMapping注解 @RestController注解,它继承自@Controller注解.4.0之前的版本,Spr ...
- spring boot Configuration Annotation Proessor not found in classpath
出现spring boot Configuration Annotation Proessor not found in classpath的提示是在用了@ConfigurationPropertie ...
- Spring Boot 常用注解汇总
一.启动注解 @SpringBootApplication @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documen ...
- 3个Spring Boot核心注解,你知道几个?
Spring Boot 核心注解讲解 Spring Boot 最大的特点是无需 XML 配置文件,能自动扫描包路径装载并注入对象,并能做到根据 classpath 下的 jar 包自动配置. 所以 S ...
- Spring Boot Configuration Annotation Proessor not found in classpath解决办法
From: https://www.cnblogs.com/whtgjy/p/9438317.html 出现spring boot Configuration Annotation Proessor ...
- 解决spring boot1.5以上版本@ConfigurationProperties提示“Spring Boot Configuration Annotation Processor not.."
Springboot1.5以上版本,在使用 @ConfigurationProperties注解的时候会提示“Spring Boot Configuration Annotation Processo ...
- Spring boot 基于注解方式配置datasource
Spring boot 基于注解方式配置datasource 编辑 Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...
- 【SpringBoot】15. Spring Boot核心注解
Spring Boot核心注解 1 @SpringBootApplication 代表是Spring Boot启动的类 2 @SpringBootConfiguration 通过bean对象来获取配置 ...
- spring boot纯注解开发模板
简介 spring boot纯注解开发模板 创建项目 pom.xml导入所需依赖 点击查看源码 <dependencies> <dependency> <groupId& ...
- Spring Boot中注解@ConfigurationProperties
在Spring Boot中注解@ConfigurationProperties有三种使用场景,而通常情况下我们使用的最多的只是其中的一种场景.本篇文章带大家了解一下三种场景的使用情况. 场景一 使用@ ...
随机推荐
- CF1017F题解
这种板子题怎么能没有min25筛的题解呢??? 题意:给定一个完全和性函数,求其前缀和.其实普通和性函数也能做就是了 \[\sum_{i=1}^n f(i) \] 类似积性函数,我们把这玩意儿在质数幂 ...
- Seata XA 模式示例分析
@ 目录 1 下载示例 2 示例结构 3 业务服务 business-xa 3.1 模块结构 3.2 Controller 层 3.3 Service 层 3.4 stock Feign 客户端 3. ...
- k8s集群关机后,如何解决 kubernetes 重启起不来的问题
如何解决 kubernetes 重启后,启来不来的问题 登录自己的Kubernetes测试集群时发现集群好像没有启动成功 运行 kubectl get pods --all -A ,报错如下. 第一反 ...
- /proc/uptime参数的意义
有关/proc/uptime这个文件里两个参数所代表的意义: [root@app ~]#cat /proc/uptime 3387048.81 3310821.00 第一个参数是代表从系统启动到现在的 ...
- 74CMS 3.0任意文件写入漏洞
一. 启动环境 1.双击运行桌面phpstudy.exe软件 2.点击启动按钮,启动服务器环境 二.代码审计 1.双击启动桌面Seay源代码审计系统软件 2.因为74CMS3.0源代码编辑使用GBK编 ...
- IDEA 创建javaWeb以及Servlet
1.新建项目 2.Web工程设置:点击项目名称,按F4 (1)配置sources:在WEB-INF下新建两个文件夹classes和lib (2)配置path:刚刚创建的classes文件夹路径 (3) ...
- Java BlockingQueue是什么?
Java BlockingQueue是一个并发集合util包的一部分.BlockingQueue队列是一种支持操作,它等待元素变得可用时来检索,同样等待空间可用时来存储元素.
- 五、关于mycat踩过的坑
1.ER分表的从表无法批量插入,例如:insert into tab_a(c1,c2) values(v1,v2),(v11,v21)或者使用jdbctemplate进行batchUpdate操作会报 ...
- Memcache 与 Redis 的区别都有哪些?
1.存储方式 Memecache 把数据全部存在内存之中,断电后会挂掉,数据不能 超过内存大小. Redis 有部份存在硬盘上,这样能保证数据的持久性. 2.数据支持类型 Memcache 对数据类型 ...
- 小米手机BL解锁连接不上手机
解锁工具下载页面:http://www.miui.com/unlock/download.html 线刷工具下载页面:http://www.miui.com/shuaji-393.html 额外注意说 ...