文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot2底层注解@Configuration怎么配置类

2023-06-30 16:30

关注

这篇文章主要讲解了“SpringBoot2底层注解@Configuration怎么配置类”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot2底层注解@Configuration怎么配置类”吧!

SpringBoot2底层注解@Configuration配置类

一、配置类

@Configuration这个注解作用就是告诉 springboot 这是一个配置类。

这个配置已经不陌生了,在之前 spring 相关的使用全注解方式时,就使用到了配置类。

在配置类里,可以使用@Bean标记在方法上,给容器注册组件,默认也是单实例的。

@Configuration //告诉SpringBoot这是一个配置类 == 配置文件public class MyConfig {    @Bean("user1") //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例    public User user01(){        return new User("pingguo", 20);    }    @Bean("pet1")    public Pet tomcatPet(){        return new Pet("tomcat");    }}

主运行类还是之前示例中的,打印出所有组件的名称。

SpringBoot2底层注解@Configuration怎么配置类

可以看到,有上面注册的 2 个组件:user1、pet1。

二、配置类本身也是组件

在主运行类的 main 方法里,加一个获取配置类的输出:

@SpringBootApplication(scanBasePackages = "com.pingguo")public class MainApplication {    public static void main(String[] args) {        // 返回IOC容器        final ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);        // 查看容器里的组件        final String[] beanDefinitionNames = run.getBeanDefinitionNames();        for (String name: beanDefinitionNames) {            System.out.println(name);        }        // 从容器中获取组件        MyConfig bean = run.getBean(MyConfig.class);        System.out.println("配置类也是组件:" + bean);    }}

运行 main 方法,

SpringBoot2底层注解@Configuration怎么配置类

可以看到最后一个输出,说明配置类本身也是个组件。

三、proxyBeanMethods 属性

从springboot2.0之后,@Configuration 中多了一个属性 proxyBeanMethods,用来代理 bean 的。

默认值是true,也就是说该配置类会被代理(CGLIB),在同一个配置文件中调用其它被@Bean注解标注的方法获取对象时,springboot 总会检查容器中是否存在这个组件。

如果容器中存在,直接取。不存在的话,才会去创建,保证单实例。

现在看下false的情况。

@Configuration(proxyBeanMethods = false) //改成 falsepublic class MyConfig {    @Bean("user1") //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例    public User user01(){        return new User("pingguo", 20);    }    @Bean("pet1")    public Pet tomcatPet(){        return new Pet("tomcat");    }}

在主运行程序里多从调用方法获取对象,判断一下对象是否相等。

@SpringBootApplication(scanBasePackages = "com.pingguo")public class MainApplication {    public static void main(String[] args) {        // 返回IOC容器        final ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);        // 查看容器里的组件        final String[] beanDefinitionNames = run.getBeanDefinitionNames();        for (String name: beanDefinitionNames) {            System.out.println(name);        }        // 从容器中获取组件        MyConfig bean = run.getBean(MyConfig.class);        System.out.println("配置类也是组件:" + bean);        User user1 = bean.user01();        User user2 = bean.user01();        System.out.println(user1 == user2);    }}

看最后的输出,会是 false。

SpringBoot2底层注解@Configuration怎么配置类

这里引出 2 个名词:Full 全模式,Lite 轻量级模式。

在该模式下 SpringBoot 每次启动会跳过检查容器中是否存在该组件。

那么这个是用来解决什么场景的问题呢?答案:组件依赖。

有组件依赖的场景

看下2个实体类:User、Pet。

public class User {    private String name;    private Integer age;    private Pet pet;... ...

固定代码部分:有参构造、无参构造、get和set方法、toString方法,就省去了。

public class Pet {    private String name;... ...

修改下配置类里的方法:

@Configuration(proxyBeanMethods = true)public class MyConfig {    @Bean("user1")     public User user01(){        User pingguo = new User("pingguo",20);        pingguo.setPet(tomcatPet());        return pingguo;    }    @Bean("pet1")    public Pet tomcatPet(){        return new Pet("tomcat");    }}

到main方法测试一下:

// 依赖关系    User user01 = run.getBean("user1", User.class);    Pet pet1 = run.getBean("pet1", Pet.class);    System.out.println("依赖:" + (user01.getPet() == pet1));

这里就是判断当proxyBeanMethods = true的情况下,User对象的 pet,是不是容器中的 pet。

如果是,那么结果就是true。

SpringBoot2底层注解@Configuration怎么配置类

此时再将proxyBeanMethods = false,重新运行一下,结果会是 false:

SpringBoot2底层注解@Configuration怎么配置类

那么这 2 个模式分别在什么时候用呢?

当在你的同一个Configuration配置类中,注入到容器中的 bean 实例之间有依赖关系时,建议使用 Full 全模式。

当在你的同一个Configuration配置类中,注入到容器中的 bean 实例之间没有依赖关系时,建议使用 Lite 轻量级模式,以提高 springboot 的启动速度和性能。

感谢各位的阅读,以上就是“SpringBoot2底层注解@Configuration怎么配置类”的内容了,经过本文的学习后,相信大家对SpringBoot2底层注解@Configuration怎么配置类这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯