初识 @Configuration

@Configuration这个注解是一个类注解,加在类上,标识该类是一个 配置类,让这个类的功能等同于一个bean xml配置文件。

@Configuration
public class SpringConfig {

}

上面代码类似于下面的xml:


一般 @Configuration 都是和 @Bean 注解结合使用的,上文代码块中使用 @Configuration 定义了一个配置类,相当于定义了一个空的 xml 配置文件,此时我们要在SpringBean 类中注册bean,那么我们就要用到@Bean注解了。

这个注解是一个方法注解,用在方法上,表示通过方法来定义一个bean,默认将方法名称作为bean名称,将方法返回值作为bean对象,注册到spring容器中。类似于bean xml配置文件中的bean元素,用来在spring容器中注册一个bean。

@Confuguration
public class SpringConfig {
    // 导入自定义的bean:bean名称为方法默认值:user1
    @Bean
    public User user1() {
        return new User();
    }

    // bean名称通过value指定:user2Bean
    @Bean("user2Bean")
    public User user2() {
        return new User();
    }

    // 导入第三方bean
    @Bean
    public DataSource dataSource() {
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
        ds.setUsername("root");
        ds.setPassword("123");
        return ds;
    }
}

@Configuration注解的使用步骤:

  • 定义一个类,在类上添加 @Configuration注解;
  • 通过 AnnotationConfigApplicationContext容器来加载 @Configuration注解修饰的配置类,会将配置类中所有的bean注册到spring容器中。
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

如果去掉 @Configuration,会怎样?

举个例子:

定义一个User类和Order类

public class User {

    public User() {
        System.out.println("无参创建User");
    }
}

public class Order {

    private User user;

    public Order(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "Order{" +
                "user=" + user +
                '}';
    }
}

定义一个配置类

//@Configuration
public class SpringConfig {
    // bean名称为方法默认值:user1
    @Bean
    public User user() {
        return new User();
    }

    @Bean
    public Order order() {
        System.out.println("调用order()方法");

        return new Order(this.user());
    }

    @Bean()
    public Order order2() {
        System.out.println("调用order2()方法");
        return new Order(this.user());
    }
}

测试类

public class SpringTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        for (String beanName : ctx.getBeanDefinitionNames()) {
            System.out.printf("beanName: %s \t bean对象: %s\n", beanName, ctx.getBean(beanName));
        }
    }
}

① 加上 @Configuration 注解时输出的结果:

无参创建User
调用order()方法
调用order2()方法
(这里省略Spring容器创建时默认加载的bean)
beanName: springConfig   bean对象: cn.afei.config.SpringConfig$$EnhancerBySpringCGLIB$$f76b28e8@4ae3c1cd
beanName: user   bean对象: cn.afei.domain.User@29f69090
beanName: order      bean对象: Order{user=cn.afei.domain.User@29f69090}
beanName: order2     bean对象: Order{user=cn.afei.domain.User@29f69090}

加上 @Configuration,类中定义了3个Bean,Order中注入User对象时,会复用创建好的User对象,User的构造器只被调用了一次,保证了User对象单例。
被@Configuration修饰的bean最后输出的时候带有 EnhancerBySpringCGLIB的字样,说明这个bean是被CGLIB处理过的,变成了一个代理对象。

② 去掉 @Configuration 注解时输出的结果:

无参创建User
调用order()方法
无参创建User
调用order2()方法
无参创建User
beanName: springConfig   bean对象: cn.afei.config.SpringConfig@543c6f6d
beanName: user   bean对象: cn.afei.domain.User@13eb8acf
beanName: order      bean对象: Order{user=cn.afei.domain.User@51c8530f}
beanName: order2     bean对象: Order{user=cn.afei.domain.User@7403c468}

去掉了 @Configuration,类中定义了3个Bean,每个Bean都会去创建一个User对象,User的构造器被调用了三次。
没有@Configuration注解的bean没有Cglib的字样。

被@Configuration修饰的类,spring容器中会通过cglib给这个类创建一个代理,代理会拦截所有被 @Bean 修饰的方法,默认情况(bean为单例)下确保这些方法只被调用一次,从而确保这些bean是同一个bean,即单例的

Original: https://www.cnblogs.com/afei688/p/16775448.html
Author: 阿飞的客栈
Title: 初识 @Configuration

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644009/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 对脱壳脚本的一些改进-识别出目标DEX

    一、前言 通常对于加壳的程序,第一步的操作通常是脱壳,而现在脱壳一般都选择利用 frida 来进行 hook 进行脱壳,不谈其他脱壳方式,利用 frida 脱壳原理大致分为两种: …

    技术杂谈 2023年7月11日
    082
  • FPGA学习-2,一点理解

    1、Wire只能赋一次值,Reg可以多次改变2、#100这种是在仿真系统下有效。3、同一个文件下也可以写多个module. 本博客是个人工作中记录,遇到问题可以互相探讨,没有遇到的…

    技术杂谈 2023年6月1日
    085
  • 关于typedef的使用方法

    在计算机编程语言中用来为复杂的声明定义简单的别名。与宏定义有些差异。它本身是一种存储类的keyword,与auto、extern、mutable、static、register等k…

    技术杂谈 2023年5月31日
    093
  • MySQL学习-idea连接数据库导入jar包

    导包先有包 !!!一定要下载和自己MySQL版本一样的jar包!!! !!!一定要下载和自己MySQL版本一样的jar包!!! !!!一定要下载和自己MySQL版本一样的jar包!…

    技术杂谈 2023年6月21日
    0106
  • 汇编语言学习笔记(5)——[bx]和loop

    1、[bx]代表将bx寄存器中的值作为偏移地址。 2、loop与循环有关 3、inc bx的含义为bx中的内容+1 4、loop指令的格式为: loop 标号 CPU运行loop指…

    技术杂谈 2023年5月31日
    096
  • 基础篇——Pycharm的安装与使用初学者此篇够用

    简介 Pycharm是python编程过程中最为推荐的编辑调试软件之一,其使用简单,界面友好,也成了学习Python路上必须学会的软件之一,本篇教程简单介绍一下windows用户从…

    技术杂谈 2023年7月23日
    0110
  • 双缓冲绘图

    双缓冲绘图 大家小时候都玩过飞机大战吧,当我们在玩这种飞行射击类游戏时,背景图总是不断地向下移动的,从而给我们营造出一种飞机正在向前飞行的游戏体验。那么,图片的快速变化是如何实现的…

    技术杂谈 2023年7月23日
    087
  • 变长参数函数调用变长参数函数

    include template inline void my_print(const char* format, Args… rest) { printf(forma…

    技术杂谈 2023年6月1日
    075
  • HDU 4833 Best Financing (DP)

    Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su…

    技术杂谈 2023年5月30日
    081
  • day6

    24.两两交换链表的节点 注意,首先是判断后面够不够两个节点。依然是使用虚拟节点。有一个需要注意的地方:要更新pre节点。 19.删除链表的倒数第 N 个结点 删除其中的节点,可以…

    技术杂谈 2023年7月10日
    0106
  • [编译] 10、kconfig 入门指导教程

    前言 1. 安装 kconfig 2. 克隆一个 demo 3. 运行 kconfig 4. 源码解析 4.1 选择题目设计模板 4.2 填空题目设计模板 4.3 判断题目设计模板…

    技术杂谈 2023年6月1日
    0123
  • 触发器设置递归

    –RECURSIVE_TRIGGERS 的设置 递归ALTER DATABASE Platform_QuotaCompile6 SET RECURSIVE_TRIGGE…

    技术杂谈 2023年5月31日
    094
  • 立体声中l、r、ls、rs、c、sw分别代表什么

    L:左声道R:右声道LS:左环绕声道RS:右环绕声道C:中置声道SW:重低音声道 作者:柒月 出处:https://www.cnblogs.com/qiynet/ 开源:https…

    技术杂谈 2023年5月31日
    0107
  • wordpress模板修改及函数说明

    原文:http://java-er.com/blog/wp-mb-edit/ style.css : CSS(样式表)文件index.php : 主页模板archive.php :…

    技术杂谈 2023年6月1日
    0113
  • 用w32tm设置服务器时间同步

    服务器时间同步是一个容易被忽视的问题,但在企业级应用环境中,不同服务器之间的时间差很可能引发应用系统问题。Windows提供的w32tm程序可以用来设置时间同步服务器,其用法如下:…

    技术杂谈 2023年5月31日
    098
  • PyQt5 掩码字符

    ################################ PyQt5中文网 – PyQt5全套视频教程 # https://www.PyQt5.cn/ # 主讲: 村长 #…

    技术杂谈 2023年5月31日
    0125
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球