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有三种使用场景,而通常情况下我们使用的最多的只是其中的一种场景.本篇文章带大家了解一下三种场景的使用情况. 场景一 使用@ ...
随机推荐
- 软件工程homework-002
博客信息 沈阳航空航天大学计算机学院2020软件工程作业 作业要求 https://edu.cnblogs.com/campus/sau/Computer1701-1705/homework/1058 ...
- LGP3426题解
真是不管什么时候来做这道题都会觉得很神仙呐... 观察一下,如果存在一个合法的印章,那么这个印章一定是这个串的前缀,也是这个串的后缀. 即合法的印章一定是原串的 \(\rm Border\). 于是设 ...
- 2.2 C++STL string容器详解
文章目录 引言 2.2.1 string的特性 2.2.2 string用法理论 2.2.2.1 string构造函数 2.2.2.2 string赋值操作 2.2.2.3 string取值操作 2. ...
- Asp.net Core Filter过滤器异常处理
本文旨在: 1 继承ExceptionFilterAttribute,重写Override OnException(ExceptionContext context)处理异常 2 在.netCore中 ...
- Linux配置FTP(vsftpd)服务和无法上传下载问题解决
vsftpd的配置说明 ftp的配置文件主要有三个,位于/etc/vsftpd/目录下,分别是: ftpusers 该文件用来指定那些用户不能访问ftp服务器. user_list 该文件用来指示的默 ...
- HC-05蓝牙模块使用教程
1.接线 蓝牙模块 与 USB转TTL模块的接线: 5V->5V GND->GND RX->TXD TX->RXD 2.调试 给蓝牙模块上电,手机端下载蓝牙串口助手SPP,手机 ...
- linux上使用nginx、uwsgi部署django项目
参考:CentOS7下部署Django项目详细操作步骤 注意事项: 在虚拟环境中操作,虚拟环境中安装nginx.uwsgi,虚拟环境外需安装uwsgi -- 临时关闭防火墙:systemctl sto ...
- @Qualifier 注解 ?
当有多个相同类型的 bean 却只有一个需要自动装配时,将@Qualifier 注解和 @Autowire 注解结合使用以消除这种混淆,指定需要装配的确切的 bean.
- JavaScript 变动事件
变动事件,当用户修改了DOM结构(添加或删除元素节点)后发生. 任何时候当元素被添加到DOM中或从DOM中移除时,DOM的结构就发生了变化,而这种变化就会触动变动事件. 1 <html> ...
- RabbitMQ踩坑记
之前我们给我们的系统加了一个使用SpringAOP+RabbitMQ+WebSocket进行实时消息通知功能(https://www.cnblogs.com/little-sheep/p/993488 ...