SpringBoot的@Configuration注解

2023-05-09 13:21:29 | 来源:博客园

本文主要讲述SpringBoot的@Configuration注解。

一.POJO类的声明

例如有两个pojo类,分别是User和Pet

User类的声明如下:


(资料图片仅供参考)

public class User {    private String name;    private Integer age;    public User(){    }    public User(String name, Integer age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    @Override    public String toString() {        return "User{" +                "name="" + name + "\"" +                ", age=" + age +                "}";    }}

Pet类的声明如下:

public class Pet {    private String name;    private String clasz;    public Pet() {    }    public Pet(String name, String clasz) {        this.name = name;        this.clasz = clasz;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getClasz() {        return clasz;    }    public void setClasz(String clasz) {        this.clasz = clasz;    }    @Override    public String toString() {        return "Pet{" +                "name="" + name + "\"" +                ", clasz="" + clasz + "\"" +                "}";    }}

二.在Spring的xml中配置组件

1.pojo无依赖关系,bean.xml的声明如下:

                                                

2.pojo有依赖关系,user类依赖pet类

User类声明如下:

public class User {    private String name;    private Integer age;    private Pet pet;    public User(){    }    public User(String name, Integer age) {        this.name = name;        this.age = age;    }    public Pet getPet() {        return pet;    }    public void setPet(Pet pet) {        this.pet = pet;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    @Override    public String toString() {        return "User{" +                "name="" + name + "\"" +                ", age=" + age +                ", pet=" + pet +                "}";    }}

bean.xml的声明如下:

                                                        

三.SpringBoot的@Configuration配置组件

@Configuration注解作用在类上,声明该类是配置组件类;

@Bean注解作用在配置组件类的方法上,声明该方法是ioc容器的组件。

POJOConfig组件配置类声明如下:

/** * @Configuration 标识配置组件的类 * @Bean 标识配置对象的方法 */@Configurationpublic class POJOConfig {        @Bean    public User user01(){        return new User("张三",19);    }    @Bean    public User user02(){        return new User("张三",19);    }    @Bean    public Pet pet01(){        return new Pet("tom","cat");    }}

在MainApp启动类中验证注册的组件是否唯一。

@SpringBootApplicationpublic class MainApp {    public static void main(String[] args) {        // 1.获取ioc容器【应用程序的上下文】        ConfigurableApplicationContext run = SpringApplication.run(MainApp.class, args);        // 2.获取上下文所有的bean的name        String[] names = run.getBeanDefinitionNames();        for (String name : names) {            System.out.println(name);        }        // 3.获取指定类型的bean的对象        // 只注册了一个User类的对象,ioc容器获取的也只有一个对象        // 注册了同一个类的多个对象        User user01 = run.getBean("user01", User.class);        User user02 = run.getBean("user01", User.class);        System.out.println(user01 == user02);  // true        // 4.获取配置组件类的对象        POJOConfig bean = run.getBean(POJOConfig.class);        System.out.println(bean);        User user1 = bean.user01();        User user2 = bean.user01();        System.out.println(user1 == user2);    }}

证明user01和user02对象,都是从ioc容器中取出的 id=user01的对象。

@Configuration中有一个参数proxyBeanMethod,默认为 true,

这个注解主要有以下两个作用:

  1. 声明一个类为 Spring 配置类。@Configuration注解告诉 Spring 这是一个配置类,需要在应用程序上下文中注册 bean。通常情况下,配置类中包含了多个 @Bean方法,这些方法都会返回一个对象,供其他 bean 使用。

  2. 控制 Spring 是否会为 @Bean方法创建代理对象。当 proxyBeanMethods设置为 true 时,Spring 会为每个 @Bean方法创建一个代理对象,这个代理对象会缓存方法的调用结果,从而提高应用程序的性能。当 proxyBeanMethods设置为 false 时,Spring 不会为 @Bean方法创建代理对象,而是每次调用 @Bean方法时都会创建一个新的对象。

需要注意的是,如果使用了 @Configuration(proxyBeanMethods = true),那么 @Bean方法必须是非 final 的,因为 Spring 使用 CGLIB 生成子类来实现代理。如果 @Bean方法是 final 的,那么就无法生成子类,从而导致代理失败。因此,如果你的 @Bean方法必须是 final 的,就需要将 proxyBeanMethods设置为 false。

上一篇 下一篇

相关新闻

SpringBoot的@Configuration注解

深交所拟决定终止*ST文化股票上市交易

一文看懂物联网通信市场最新风向-世界观天下

大理州开展2023年冬春农民大培训工作 天天新视野

世界今热点:鸡蛋、鸭蛋、鹅蛋、鹌鹑蛋,营养差别这么大,值得一看!

自己怎么提高网速_分享电脑网络提速的设置 全球快消息

对标一流看变化(记者手记)

每日视讯:异动快报:*ST日海(002313)5月9日10点19分触及跌停板

基金导读: ETF产品收益率高企成“领头基”

大明阴阳师全集(大明阴阳师)

投资日历:周二资本市场大事提醒-世界快看点

小提琴如何拿(小提琴如何拿工稳) 环球聚焦

最新资讯:宁企轨道车门产品市场占有率全球第一

一个多极的货币世界,或许比想象中更快到来?-全球热点

天天简讯:学校代码及专业代码查询网_招生代码是什么意思

最新新闻

SpringBoot的@Configuration注解

深交所拟决定终止*ST文化股票上市交易

一文看懂物联网通信市场最新风向-世界观天下

大理州开展2023年冬春农民大培训工作 天天新视野

世界今热点:鸡蛋、鸭蛋、鹅蛋、鹌鹑蛋,营养差别这么大,值得一看!

自己怎么提高网速_分享电脑网络提速的设置 全球快消息

对标一流看变化(记者手记)

每日视讯:异动快报:*ST日海(002313)5月9日10点19分触及跌停板

基金导读: ETF产品收益率高企成“领头基”

大明阴阳师全集(大明阴阳师)

投资日历:周二资本市场大事提醒-世界快看点

小提琴如何拿(小提琴如何拿工稳) 环球聚焦

最新资讯:宁企轨道车门产品市场占有率全球第一

一个多极的货币世界,或许比想象中更快到来?-全球热点

天天简讯:学校代码及专业代码查询网_招生代码是什么意思

希尔斯布莱德丘陵怎么去外域_希尔斯布莱德丘陵怎么去-每日讯息

【环球速看料】新股中签率速查|世纪恒通网上发行最终中签率为0.0220619427%

不同烘焙产品的贮存方法

全世界都逼着我自恋晋江文学城_全世界都逼着我自恋

东瑞股份:正在广东惠州市筹备建设一个20万头的生猪养殖基地 全球看热讯

天天滚动:毛伟明主持省政府常务会议 部署建设现代化产业体系等工作

蜡笔小新剧场版有哪些_蜡笔小新剧场版大放送

天天热议:*ST方科: 公司专业从事PCB产品的设计研发、生产和制造全流程,并为客户提供QTA和NPI服务

百事通!天宇股份:高血压治疗药缬沙坦片药品注册获核准,累计研发投入约1,059.32万元

治疗晕车的小妙招_治疗晕车小方法_环球视讯

山东:2022年度省新材料领军企业50强名单 全球微速讯

环球微动态丨超级黄金周!中秋国庆连放8天假:节后要上7天班

柠檬巴士檬茶加盟多支持带你致富 世界球精选

世界播报:河北:构建数字化、智能化的政府运行新形态

监管部门十方面举措加强房地产经纪行业管理|焦点播报