Spring Boot-@Configuration注解
@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注解相关推荐
- 40 个 Spring Boot 常用注解
以下文章来源方志朋的博客,回复"666"获面试宝典 作者 | 谭朝红 链接 | ramostear.com 一.Spring Web MVC 与 Spring Bean 注解 Sp ...
- 解决spring boot1.5以上版本@ConfigurationProperties提示“Spring Boot Configuration Annotation Processor not..
Springboot1.5以上版本,在使用 @ConfigurationProperties注解的时候会提示"Spring Boot Configuration Annotation Pro ...
- SpringBoot项目中获取yml文件的属性时实体属性类出现Spring Boot Configuration Annotation Processor not found in classpath
1.SpringBoot项目的项目结构如下: 2.属性实体类 上面出现了Spring Boot Configuration Annotation Processor not found in clas ...
- 项目可以运行但是在当前controller类顶部出现Spring Boot Configuration Annotation Proces
学习pringBoot项目时,在写controller时发现,项目可以运行但是在当前controller类顶部出现Spring Boot Configuration Annotation Proces ...
- Spring Boot——[Spring Boot Configuration Annotation Processor not found in classpath]解决方案
问题描述 使用Spring Boot开发的过程中,写读取Properties配置文件的配置类时提示Spring Boot configuration annotation processor not ...
- Spring Boot 核心注解与配置文件
一.入口类与@SpringBootApplication 注解 Spring Boot项目都会有一个*Application 类,这个类作为Spring Boot 项目的入口类,在这个入口类中有mai ...
- Spring Boot @Conditional 注解
Spring Boot @Conditional注解 @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件的才给容器注册Bean. @Conditional ...
- idea提示未配置 Spring Boot 配置注解处理器解决方法
未配置 Spring Boot 配置注解处理器 解决方法: 在pom.xml里添加依赖 <dependency><groupId>org.springframework.boo ...
- Spring的@Configuration注解使用
Spring的@Configuration注解用于定义配置类,可替换XML配置文件,被 注解的类内部包含有一个或者多个被@Bean注解的方法,这些方法将会被ApplicationContext上下文类 ...
- spring boot 相关注解
spring boot是基于spring 开发的,因此,spring boot工程中可以使用spring 的注解.除了spring注解外,spring boot会使用到的注解有: @SpringBoo ...
最新文章
- 2020移动apn接入点哪个快_为什么都是4G网你的就没别人快?跟我这样设置,网速直线提升...
- linux从源码编译软件,linux软件包管理——源码包编译安装
- 杀毒软件为什么不能启动、运行
- b+树时间复杂度_深入理解数据库系统之存储存引擎(二叉搜索树)
- java读取pdf文件流,系列篇
- Alpha(5/10)
- tensordot 的源码解读
- angular 拦截器
- PHP面试题:mysql_fetch_row() 和mysql_fetch_array之间有什么区别?
- golang结构体tag的使用
- oracle foreign 查询,ORACLE foreign key
- 【Linux命令】nm 查看动态库和静态库中的符号
- javascript正则表达式复习
- 递归,复制对象,找质数,判断数组
- Ubuntu18.04修改主机名和用户名
- 火车票放票时间 潜规则
- 黑色背景的DW代码配色方案 Colors.xml
- vmpalyer虚拟机的使用教程,小白也能看懂
- 基于JavaWeb实现的问卷调查系统
- R2S设置openWrt软路由
热门文章
- Python服务器开发一:python基础
- 让IE6支持图片半透明
- soapui返回值类型都有哪些_货架的类型都有哪些呢
- python列表常用方法_第24p,必须掌握,列表的常用方法
- php面向对象的概括图解,深入分析php之面向对象
- 翻译职称计算机能力,2018年职称计算机word2003考点辅导:用好Office2003中的翻译功能...
- python中paste函数的作用_PIL使用小结(crop和paste函数)
- mysql待办事项表名_SSD8-Ex4待办事项列表答案参考
- python 曲线回归_线性回归——Python代码实现
- android控制电脑,android-remote-control-computer