SpringBoot配置类中的@Configuration注解和@bean注解

简介: SpringBoot配置类中的@Configuration注解和@bean注解

1.@Configuration注解

用法:作用在类上面
作用:告诉SpringBoot这是一个配置类,相当于Spring中的xml配置文件。

@Configuration //告诉SpringBoot这是一个配置类 == 配置文件
public class Config {
    
}

2.@bean注解

用法:配置类里面使用@Bean标注在方法上给IoC容器注册组件,默认也是单实例的
作用:给容器中添加组件,相当于Spring中xml配置文件中的<bean>标签。
理解:以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例

@Configuration //告诉SpringBoot这是一个配置类 == 配置文件
public class Config {
     

    @Bean   //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
    public Person person1(){
     
        return new Person("Mr.Yu",21,"male");
    }

    @Bean("customize")  //id值也可以指定
    public Person person2(){
     
        return new Person("小明",20,"male");
    }
}

在主程序类中打印输出我们IoC容器中的对象,看看我们的person1和customize有没有添加到容器中

@SpringBootApplication
public class MainApplication {
      
    public static void main(String[] args) {
      
        //1.返回我们IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

        //2.查看容器里面的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
      
            System.out.println(name);
        }
    }
}

输出结果:
在这里插入图片描述
可以看到输出结果中有我们存放进IoC容器的两个对象

3.单实例

@Bean注解存入到IoC容器中的实例也是单实例的

public static void main(String[] args) {
       
        //1.返回我们IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

        //2.查看容器里面的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
       
            System.out.println(name);
        }

        //单实例
        Person person1 = run.getBean("person1",Person.class);
        Person person2 = run.getBean("person1",Person.class);
        System.out.println("person1 == person2 :"+ (person1 == person2));
}

输出结果:
在这里插入图片描述

4.配置类也是容器的组件

@SpringBootApplication
public class MainApplication {
        
    public static void main(String[] args) {
        
        //1.返回我们IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

        //2.查看容器里面的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
        
            System.out.println(name);
        }
        
        //配置类本身也是组件
        Config bean = run.getBean(Config.class);
        //com.ysw.boot.config.Config$$EnhancerBySpringCGLIB$$4aa44992@381d7219
        System.out.println(bean);


    }
}

输出结果:

com.ysw.boot.config.Config$$EnhancerBySpringCGLIB$$4aa44992@381d7219 

5.直接调用配置类里面的person1()方法

如果我们直接调用配置类里面的person1()方法会发生什么情况,它是从IoC容器中拿还是直接new一个对象呢

在new一个配置类出来的情况下,调用person1方法,它返回的是new出来的对象但是如果我们从容器中取得的配置类,无论再去掉用多少次person1方法,它始终返回的都是同一个单实例对象,也就是从IoC容器中拿的对象。
@SpringBootApplication public class MainApplication {
           public static void main(String[] args) {
           //1.返回我们IOC容器 ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); //2.查看容器里面的组件 String[] names = run.getBeanDefinitionNames(); for (String name : names) {
           System.out.println(name); } //配置类本身也是组件 Config bean = run.getBean(Config.class); //获取到的本身就是代理对象 //com.ysw.boot.config.Config$$EnhancerBySpringCGLIB$$4aa44992@381d7219 System.out.println(bean); //如果我们直接调用person1方法,它是从IoC容器中拿还是直接new一个对象呢, //在new一个配置类出来的情况下,调用person1方法,它返回的是new出来的对象 Config config = new Config(); Person person3 = config.person1(); Person person4 = config.person1(); System.out.println("person3 == person4 :"+ (person3 == person4)); //但是如果我们从容器中取得的配置类,无论再去掉用多少次person1方法,它始终返回的都是同一个单实例对象,也就是从IoC容器中拿的对象。 //如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有; //保持组件单实例 Person person5 = bean.person1(); Person person6 = bean.person1(); System.out.println("person5 == person6 :"+ (person5 == person6)); } } 

输出结果:

在这里插入图片描述

6.proxyBeanMethods——代理bean的方法

从容器中获取到的配置类对象输出结果:

com.ysw.boot.config.Config$$EnhancerBySpringCGLIB$$4aa44992@381d7219 

在上述的输出结果中我们可以看到从容器中获取到的配置类对象本身就是一个被SpringCGLIB增强了的代理对象

@Configuration()默认设置的是proxyBeanMethods = true。如果@Configuration(proxyBeanMethods = true),就是代理对象调用方法。SpringBoot总会检查这个组件是否在容器中已有,调用配置类中的方法时会返回容器中已有的组件(即IoC容器中已存在的对象)。如果@Configuration(proxyBeanMethods = false),就不是代理对象调用方法,SpringBoot不会检查这个组件是否在容器中已有,调用配置类中的方法时会返回新对象。

@Configuration(proxyBeanMethods = false)举例:
把上述5中的@Configuration()改为@Configuration(proxyBeanMethods = false)
输出结果为:
在这里插入图片描述
总结:

Full模式(proxyBeanMethods = true):保证每个@Bean方法被调用多少次返回的组件都是单实例的Lite模式(proxyBeanMethods = false):每个@Bean方法被调用多少次返回的组件都是新创建的组件依赖必须使用Full模式默认。其他默认是否Lite模式配置类组件之间无依赖关系用Lite模式加速容器启动过程,调用配置类中的方法时,SpringBoot每次都不会判断对象在容器中是否已经存在,减少了判断过程配置类组件之间有依赖关系,调用配置类中的方法时,SpringBoot每次都会判断对象在容器中是否已经存在,方法会被调用得到之前单实例组件,用Full模式
目录
相关文章
|
17天前
|
缓存 Java 数据库
SpringBoot缓存注解使用
Spring Boot 提供了一套方便的缓存注解,用于简化缓存管理。通过 `@Cacheable`、`@CachePut`、`@CacheEvict` 和 `@Caching` 等注解,开发者可以轻松地实现方法级别的缓存操作,从而提升应用的性能和响应速度。合理使用这些注解可以大大减少数据库的访问频率,优化系统性能。
163 89
|
4天前
|
监控 Java Spring
SpringBoot:SpringBoot通过注解监测Controller接口
本文详细介绍了如何通过Spring Boot注解监测Controller接口,包括自定义注解、AOP切面的创建和使用以及具体的示例代码。通过这种方式,可以方便地在Controller方法执行前后添加日志记录、性能监控和异常处理逻辑,而无需修改方法本身的代码。这种方法不仅提高了代码的可维护性,还增强了系统的监控能力。希望本文能帮助您更好地理解和应用Spring Boot中的注解监测技术。
33 16
|
3月前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
79 0
|
1月前
|
JavaScript Java 程序员
SpringBoot自动配置及自定义Starter
Java程序员依赖Spring框架简化开发,但复杂的配置文件增加了负担。SpringBoot以“约定大于配置”理念简化了这一过程,通过引入各种Starter并加载默认配置,几乎做到开箱即用。
115 10
SpringBoot自动配置及自定义Starter
|
2月前
|
Java Maven Spring
SpringBoot配置跨模块扫描问题解决方案
在分布式项目中,使用Maven进行多模块开发时,某些模块(如xxx-common)没有启动类。如何将这些模块中的类注册为Spring管理的Bean对象?本文通过案例分析,介绍了两种解决方案:常规方案是通过`@SpringBootApplication(scanBasePackages)`指定扫描路径;推荐方案是保持各模块包结构一致(如com.xxx),利用SpringBoot默认扫描规则自动识别其他模块中的组件,简化配置。
SpringBoot配置跨模块扫描问题解决方案
|
2月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
147 14
|
3月前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
147 1
SpringBoot入门(7)- 配置热部署devtools工具
|
3月前
|
消息中间件 Java 数据库
解密Spring Boot:深入理解条件装配与条件注解
Spring Boot中的条件装配与条件注解提供了强大的工具,使得应用程序可以根据不同的条件动态装配Bean,从而实现灵活的配置和管理。通过合理使用这些条件注解,开发者可以根据实际需求动态调整应用的行为,提升代码的可维护性和可扩展性。希望本文能够帮助你深入理解Spring Boot中的条件装配与条件注解,在实际开发中更好地应用这些功能。
61 2
|
3月前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
61 2
|
3月前
|
存储 前端开发 JavaScript
springboot中路径默认配置与重定向/转发所存在的域对象
Spring Boot 提供了简便的路径默认配置和强大的重定向/转发机制,通过合理使用这些功能,可以实现灵活的请求处理和数据传递。理解并掌握不同域对象的生命周期和使用场景,是构建高效、健壮 Web 应用的关键。通过上述详细介绍和示例,相信读者能够更好地应用这些知识,优化自己的 Spring Boot 应用。
77 3