@Configuration 这个注解的作用,告诉 springboot 这是一个配置类。配置类以及类里的方法都可以作为Bean。里面的方法用@Bean标记。

@Configuration 替换了繁琐的 bean.xml 配置文件,早期的 bean.xml 配置举例如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean name="user01" class="com.itheima.bean.User">
<property name="name" value="zhangsan"/>
<property name="age" value="18"/>
<property name="pet" value="Pet"/>
</bean> <bean name="Pet" class="com.itheima.bean.Pet">
<property name="name" value="tom"/>
</bean>
</beans>

@Configuration 包含 proxyBeanMethods 字段,其作用:是否返回单例模式,默认值是 true。

@Configuration(proxyBeanMethods=”false”) 则不检测直接返回新实例。使用时注意要先指定代理 Bean,然后多次调用 Bean 的方法,看返回值是否相等

// @Configuration(proxyBeanMethods = false)
Full模式:@Configuration默认使用Full模式,使用前检测是否存在实例,保证单例模式。适用于Bean之间存在依赖的情况
Lite模式:@Configuration(proxyBeanMethods = false)代表轻量模式,不检测直接返回结果。适用于Bean之间不存在依赖的情况

实例1:

需求:写两个JavaBean,用@Configuration,将Bean装入容器。并通过 @Configuration(proxyBeanMethods=”false”) 验证返回结果是否来自同一个实例。

结构目录:

写两个 Bean,user 和 pet。

package com.itheima.bean;

public class Pet {
String name; public Pet() {
} public Pet(String name) {
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Pet{" +
"name='" + name + '\'' +
'}';
}
} package com.itheima.bean; public class User {
String name;
int age;
Pet pet; public User() {
} public User(String name,int age) {
this.name = name;
this.age = age;
} public User(String name, int age, Pet pet) {
this.name = name;
this.age = age;
this.pet = pet;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Pet getPet() {
return pet;
} public void setPet(Pet pet) {
this.pet = pet;
} @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", pet=" + pet +
'}';
}
}

  Bean的配置类:MyConfig.java,通过@Configuration和@Bean指定装配Bean

@Configuration(proxyBeanMethods = false)
public class MyConfig {
@Bean
public User user01(){ User zhangsan = new User("zhangsan", 18);
// zhangsan.setPet(pet01());
return zhangsan;
}
@Bean("tom")
public Pet pet01(){
return new Pet("tom");
}
}

  测试代码:将 MyConfig.java 作为 Bean,将 @Configuration(proxyBeanMethod=false),多次调用 Bean 的方法,比较返回对象是否相等。

@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run =
SpringApplication.run(MainApplication.class, args);
// String[] names = run.getBeanDefinitionNames();
// for (String name : names) {
// System.out.println(name);
// } //这个ProxyBeanMethod居然是先代理MyConfig这个bean,
// 再用bean调用其方法,测试bean的方法返回是否相等,我的天! MyConfig bean = run.getBean(MyConfig.class);
System.out.println(bean);
User user1 = bean.user01();
User user2 = bean.user01();
System.out.println(user1==user2); // 哥直接用run获取对应的 user01 bean,难怪反复测试都返回true
// User user01 = run.getBean("user01", User.class);
// User user02 = run.getBean("user01", User.class);
// System.out.println(user02==user01);
}
}

  结果:false。因为 MyConfig 标记的注解是 @Configuration(proxyBeanMethods = false) 。

SpringBoot2:@Configuration 注解的更多相关文章

  1. SpringBoot2.0之@Configuration注解

    SpringBoot2.0之@Configuration注解 本文转载自:https://www.javaman.cn/sb2/springboot-configuration 前面我们介绍了Spri ...

  2. springboot情操陶冶-@Configuration注解解析

    承接前文springboot情操陶冶-SpringApplication(二),本文将在前文的基础上分析下@Configuration注解是如何一步一步被解析的 @Configuration 如果要了 ...

  3. [转]Spring注解-@Configuration注解、@Bean注解以及配置自动扫描、bean作用域

    1.@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文) package com.test.s ...

  4. Spring boot之SpringApplicationBuilder,@@Configuration注解,@Component注解

    SpringApplicationBuilder: 该方法的作用是可以把项目打包成war包 需要配置启动类,pom.xml文件等,具体见:http://blog.csdn.net/linzhiqian ...

  5. Spring注解-@Configuration注解、@Bean注解以及配置自动扫描、bean作用域

    1.@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文) package com.test.s ...

  6. spring和springmvc中,Configuration注解Bean重复加载

    问题:bean重复加载1.如下代码所示,开启Configuration注解,实现Bean代码注入,发现bean重复加载 @Configuration public class EhCacheConfi ...

  7. Spring5源码深度解析(一)之理解Configuration注解

    代码地址:https://github.com/showkawa/spring-annotation/tree/master/src/main/java/com/brian 1.Spring体系结构 ...

  8. SpringBoot学习之@Configuration注解和@Bean注解

    @Configuration 1.@Configuration注解底层是含有@Component ,所以@Configuration 具有和 @Component 的作用. 2.@Configurat ...

  9. 【记录】@Configuration注解作用 mybatis @Param作用

    参考地址: 1:https://www.cnblogs.com/duanxz/p/7493276.html 2:https://www.wandouip.com/t5i91156/ 3:https:/ ...

  10. 配置类为什么要添加@Configuration注解呢?

    配置类为什么要添加@Configuration注解呢? 本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 推荐阅读: Spring官网阅读 | 总结篇 Spring ...

随机推荐

  1. Winform多线程访问UI控件问题

    Winform多线程无法访问UI控件,考虑使用委托方法解决.

  2. 熟悉Hadoop及其操作 3

    启动hdfs 查看与创建hadoop用户目录. 在用户目录下创建与查看input目录.   将hadoop的配置文件上传到hdfs上的input目录下.运行MapReduce示例作业,输出结果放在ou ...

  3. down_interruptible()获取信号量

    信号量(Semaphore)是操作系统中最典型的用于同步和互斥的手段,信号量的值可以是0.1或者n.信号量与操作系统中的经典概念PV操作对应. P(S):①将信号量S的值减1,即S=S-1:②如果S≥ ...

  4. 使用generator进行代码自动生成

    在使用generator 进行逆向工程时,一下为步骤 添加mybatis generator的maven插件依赖 添加mybatis generator的配置文件:generatorConfig.xm ...

  5. C语言程序设计基础 实验3 函数

    C语言程序设计基础 实验3 函数   一.实验目的 1. 理解函数的本质:模块化,实现代码复用 2. 掌握函数定义.声明.调用的语法 3. 理解并掌握函数的形参.实参,以及函数调用和返回的过程 4. ...

  6. Nginx重启操作

    1.杀掉Nginx进程 killall nginx 2.启动Nginx /usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/ng ...

  7. LINUX下的VSCODE-C/C++配置

    LINUX下的VSCODE-C/C++配置 1.生成默认的任务文件 2.lunch.json,调整"configurations"里的成员,如下 ①添加 "preLaun ...

  8. windows音频设备图像隔离audiodg.exe占用内存高(停止与重启audiodg服务)

    首先想到的办法是结束该进程,于是在任务管理器里结束进程后,内存是释放了,但是发现发现电脑没有声音去到电脑的system32目录下双击audiodg.exe后任然没有声音解决方法如下(重启audiodg ...

  9. win 11 VMware workstations b不可恢复的错误(vcpu-2)

    首先检查一下电脑有没有开启CPU虚拟化,我的已经开启了,按照百度的方法去控制面板卸载程序里面,找到VMware 右击更改 弹出的安装程序点修复,,结果修复出错了,显示写入文件D:\vm\glib-2. ...

  10. MySQL根据经纬度和距离查询最近的数据

    [lat]:输入的纬度 [lon]:输入的经度 [distance]:查询距离内的数据,单位m SELECT * FROM ( SELECT id lon, lat, vin, ROUND( 6378 ...