@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注解的更多相关文章

  1. Spring Boot常用注解总结

    Spring Boot常用注解总结 @RestController和@RequestMapping注解 @RestController注解,它继承自@Controller注解.4.0之前的版本,Spr ...

  2. spring boot Configuration Annotation Proessor not found in classpath

    出现spring boot Configuration Annotation Proessor not found in classpath的提示是在用了@ConfigurationPropertie ...

  3. Spring Boot 常用注解汇总

    一.启动注解 @SpringBootApplication @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documen ...

  4. 3个Spring Boot核心注解,你知道几个?

    Spring Boot 核心注解讲解 Spring Boot 最大的特点是无需 XML 配置文件,能自动扫描包路径装载并注入对象,并能做到根据 classpath 下的 jar 包自动配置. 所以 S ...

  5. Spring Boot Configuration Annotation Proessor not found in classpath解决办法

    From: https://www.cnblogs.com/whtgjy/p/9438317.html 出现spring boot Configuration Annotation Proessor ...

  6. 解决spring boot1.5以上版本@ConfigurationProperties提示“Spring Boot Configuration Annotation Processor not.."

    Springboot1.5以上版本,在使用 @ConfigurationProperties注解的时候会提示“Spring Boot Configuration Annotation Processo ...

  7. Spring boot 基于注解方式配置datasource

    Spring boot 基于注解方式配置datasource 编辑 ​ Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...

  8. 【SpringBoot】15. Spring Boot核心注解

    Spring Boot核心注解 1 @SpringBootApplication 代表是Spring Boot启动的类 2 @SpringBootConfiguration 通过bean对象来获取配置 ...

  9. spring boot纯注解开发模板

    简介 spring boot纯注解开发模板 创建项目 pom.xml导入所需依赖 点击查看源码 <dependencies> <dependency> <groupId& ...

  10. Spring Boot中注解@ConfigurationProperties

    在Spring Boot中注解@ConfigurationProperties有三种使用场景,而通常情况下我们使用的最多的只是其中的一种场景.本篇文章带大家了解一下三种场景的使用情况. 场景一 使用@ ...

随机推荐

  1. CF1017F题解

    这种板子题怎么能没有min25筛的题解呢??? 题意:给定一个完全和性函数,求其前缀和.其实普通和性函数也能做就是了 \[\sum_{i=1}^n f(i) \] 类似积性函数,我们把这玩意儿在质数幂 ...

  2. Seata XA 模式示例分析

    @ 目录 1 下载示例 2 示例结构 3 业务服务 business-xa 3.1 模块结构 3.2 Controller 层 3.3 Service 层 3.4 stock Feign 客户端 3. ...

  3. k8s集群关机后,如何解决 kubernetes 重启起不来的问题

    如何解决 kubernetes 重启后,启来不来的问题 登录自己的Kubernetes测试集群时发现集群好像没有启动成功 运行 kubectl get pods --all -A ,报错如下. 第一反 ...

  4. /proc/uptime参数的意义

    有关/proc/uptime这个文件里两个参数所代表的意义: [root@app ~]#cat /proc/uptime 3387048.81 3310821.00 第一个参数是代表从系统启动到现在的 ...

  5. 74CMS 3.0任意文件写入漏洞

    一. 启动环境 1.双击运行桌面phpstudy.exe软件 2.点击启动按钮,启动服务器环境 二.代码审计 1.双击启动桌面Seay源代码审计系统软件 2.因为74CMS3.0源代码编辑使用GBK编 ...

  6. IDEA 创建javaWeb以及Servlet

    1.新建项目 2.Web工程设置:点击项目名称,按F4 (1)配置sources:在WEB-INF下新建两个文件夹classes和lib (2)配置path:刚刚创建的classes文件夹路径 (3) ...

  7. Java BlockingQueue是什么?

    Java BlockingQueue是一个并发集合util包的一部分.BlockingQueue队列是一种支持操作,它等待元素变得可用时来检索,同样等待空间可用时来存储元素.

  8. 五、关于mycat踩过的坑

    1.ER分表的从表无法批量插入,例如:insert into tab_a(c1,c2) values(v1,v2),(v11,v21)或者使用jdbctemplate进行batchUpdate操作会报 ...

  9. Memcache 与 Redis 的区别都有哪些?

    1.存储方式 Memecache 把数据全部存在内存之中,断电后会挂掉,数据不能 超过内存大小. Redis 有部份存在硬盘上,这样能保证数据的持久性. 2.数据支持类型 Memcache 对数据类型 ...

  10. 小米手机BL解锁连接不上手机

    解锁工具下载页面:http://www.miui.com/unlock/download.html 线刷工具下载页面:http://www.miui.com/shuaji-393.html 额外注意说 ...