springboot开发日记(3)——@Configuration注解

@Configuration注解——告诉springboot该文件是一个配置类,等同于配置文件。

public static void main(String[] args) {
        //返回ioc容器
        ConfigurableApplicationContext run= SpringApplication.run(MainApplication.class,args);
        //查看容器里面的组件并输出组件名字
        String[] names=run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }

    }

通过以上的main函数获得ioc容器并输出容器中组件的名字。


在MyConfig.java文件中使用@Configuration和@Bean注解进行组件的添加

public class MyConfig {
    @Bean//给容器中添加组件,以方法名作为组件的id。返回类型就是组件类型。返回的值就是组件在容器中的实例
    public User user01(){
        return new User("zhangsan",18);
    }
    @Bean("Tom")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

此时运行main函数即可在组件列表里找到名为user01和Tom的组件

注意:如果没有像第二个实例中在bean注解后面进行命名,那个组件的名字默认为方法名,以第二个实例为例就是tomcatPet。

注意:在被@Configuration注解的类中所有带有@Bean注解的方法都会被cglib动态代理

 

 


上面两个bean实例都是单例模式,在main函数中加入以下语句:

        //从容器中获取组件
        Pet tom01=run.getBean("Tom", Pet.class);
        Pet tom02=run.getBean("Tom", Pet.class);
        System.out.println("组件1和组件2是否一致:"+(tom01==tom02));

最后结果为true,说明Tom这个实例是单例模式。可以看出,在配置类中使用bean注解在容器中注册的实例默认都是单实例的。

注意:配置类也是容器中的一个组件,也可以用getBean方法获取到,在main函数中添加以下代码:

        MyConfig bean=run.getBean(MyConfig.class);
        System.out.println(bean);

 会发现输出了一行带有MyConfig的字符串,证明MyConfig也作为一个组件存在于ioc容器当中。


@Configuration中有一个属性名为proxyBeanMethods

这个属性为——决定代理bean的方法:

proxyBeanMethods = true时,代表每次调用bean注解下的注册方法都是之前注册到容器中的单实例,同时springboot总会检查该组件是否在容器中存在。如果存在,即每次调用同一个注册方法得到的实例都是同一个。如果不存在,则会新建一个。总而言之,此属性为true会保持组件的单实例。

proxyBeanMethods = false时,代表每次调用bean注解下的注册方法都是重新创建的,相当于每调用一次就会执行一次构建代码,是与上一次获取的实例不同的。但是运行速度会快于全配置模式。

该属性会引出一个springboot对于@Configuration的两个底层配置——full(全配置)lite(轻量级配置)

该属性用来解决组件依赖问题。

例如:在上面User对象中如果添加一个Pet属性,那么在容器中的User组件实例化时就会调用同样在容器中的Pet组件。代码如下:

    public User user01(){
        User zhangsan= new User("zhangsan",18);
        zhangsan.setPet(tomcatPet());
        return zhangsan;
    }
    @Bean("Tom")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }

只有当@Configuration(proxyBeanMethods = true时,user01中的Pet就与tomcatPet是一样的,称为user01组件依赖了tomcatPet组件。

一般只有上述这种情况发生时才会令@Configuration(proxyBeanMethods = true,其余时候都应令@Configuration(proxyBeanMethods = false。

 

posted @   YTARO  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示