SpringBoot配置@Configuration注解和@bean注解

目录
  • 1.@Configuration注解
  • 2.@bean注解
  • 3.单实例
  • 4.配置类也是容器的组件
  • 5.直接调用配置类里面的person1()方法
  • 6.proxyBeanMethods——代理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容器中的对象,看看我们的person1customize有没有添加到容器中

@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模式

到此这篇关于SpringBoot配置@Configuration注解和@bean注解的文章就介绍到这了,更多相关SpringBoot配置内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot如何通过@Value,@ConfigurationProperties获取配置

    目录 通过@Value,@ConfigurationProperties获取配置 spring boot 获取配置项值 通过@Value 获取值 通过@ConfigurationProperties 获取值 说下@ConfigurationProperties和@Value区别 配置文件注入值数据校验 通过@Value,@ConfigurationProperties获取配置 spring boot 获取配置项值 使用版本是1.5.4 举例一个线程池的配置: 在application.yml添加

  • Springboot @Configuration @bean注解作用解析

    这篇文章主要介绍了springboot @Configuration @bean注解作用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 @Configuration注解可以达到在Spring中使用xml配置文件的作用 @Bean就等同于xml配置文件中的<bean> 在spring项目中我们集成第三方的框架如shiro会在spring.xml配置文件中进行配置,例如: <!-- 配置shiro框架提供过滤器工厂 --> <

  • SpringBoot @ConfigurationProperties注解的简单使用

    源码 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ConfigurationProperties { @AliasFor("prefix") String value() default ""; @AliasFor("value") String prefix()

  • springboot如何使用@ConfigurationProperties封装配置文件

    使用@ConfigurationProperties封装配置文件 业务场景: 把配置文件的信息,读取并自动封装成实体类,可以使用@ConfigurationProperties,把同类的配置信息自动封装成实体类. 1.在pom.xml中添加依赖包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor<

  • SpringBoot @ConfigurationProperties使用详解

    简介 本文将会详细讲解@ConfigurationProperties在Spring Boot中的使用. 添加依赖关系 首先我们需要添加Spring Boot依赖: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <relativePath/> <!-- lookup

  • SpringBoot配置@Configuration注解和@bean注解

    目录 1.@Configuration注解 2.@bean注解 3.单实例 4.配置类也是容器的组件 5.直接调用配置类里面的person1()方法 6.proxyBeanMethods——代理bean的方法 1.@Configuration注解 用法:作用在类上面 作用:告诉SpringBoot这是一个配置类,相当于Spring中的xml配置文件. @Configuration //告诉SpringBoot这是一个配置类 == 配置文件 public class Config { } 2.@b

  • SpringBoot @Configuration与@Bean注解使用介绍

    目录 demo示例 特点和特性 之前我们都是通过xml的方式定义bean,里面会写很多bean元素,然后spring启动的时候,就会读取bean xml配置文件,然后解析这些配置,然后会将这些bean注册到spring容器中,供使用者使用. Spring3.0开始,@Configuration用于定义配置类,定义的配置类可以替换xml文件,一般和@Bean注解联合使用. @Configuration注解可以加在类上,让这个类的功能等同于一个bean xml配置文件. @Bean注解类似于bean

  • spring-boot通过@Scheduled配置定时任务及定时任务@Scheduled注解的方法

    串行的定时任务 @Component public class ScheduledTimer { private Logger logger = Logger.getLogger(this.getClass()); /** * 定时任务,1分钟执行1次,更新潜在客户超时客户共享状态 */ @Scheduled(cron="0 0/1 8-20 * * ?") public void executeUpdateCuTask() { Thread current = Thread.curr

  • SpringBoot对不同Bean注解的区别和使用场景说明

    目录 对不同Bean注解的区别和使用场景 什么是Bean? 注解@Bean @Component …等都有什么区别? SpringBoot注入对象冲突如何解决? SpringBoot的各种注解 @Configuration 总结 对不同Bean注解的区别和使用场景 什么是Bean? 谈Bean的潜台词是在说Spring中的Bean,我们都知道Spring中的BeanFactory,而Bean这个概念也是由此而来.在Spring中,只要一个类能被实例化,并被Spring容器管理,这个类就称为一个B

  • Spring @Bean注解配置及使用方法解析

    使用说明 这个注解主要用在方法上,声明当前方法体中包含了最终产生 bean 实例的逻辑,方法的返回值是一个 Bean.这个 bean 会被 Spring 加入到容器中进行管理,默认情况下 bean 的命名就是使用了 bean 注解的方法名.@Bean 一般和 @Component 或者 @Configuration 一起使用. @Bean 显式声明了类与 bean 之间的对应关系,并且允许用户按照实际需要创建和配置 bean 实例. 该注解相当于: <bean id="useService

  • SpringBoot通过注解注入Bean的几种方式解析

    目录 1.背景 xml扫描包的方式 2.通过注解注入的一般形式 2.1.Bean类 2.2.Configuration类 2.3.Test类 3.通过构造方法注入Bean 3.1.Bean类 3.2.AnotherBean类 3.3.Configuration类 4.通过set方法注入Bean 4.1.MyBean类 4.2.Configuration类和Test类 5.通过属性去注入Bean 6.通过List注入Bean 6.1.MyBeanList类 6.2.MyConfiguration类

  • @Bean注解和@Configuration、@Component注解组合使用的区别

    目录 一.@Bean的"full"模式和"lite"模式 二.两种模式的差异 1."full"模式下@Bean方法互相调用 2."lite"模式下@Bean方法互相调用 三.总结 一.@Bean的"full"模式和"lite"模式 在一般常见情况下,@Bean注解在@Configuration类中声明,称之为"full"模式:当@Bean注解和@Component注解

  • SpringBoot @GroupSequenceProvider注解实现bean多属性联合校验的示例代码

    目录 参考资料 一. 前期准备 二. 需求 三. 需求 参考资料 分组序列@GroupSequenceProvider.@GroupSequence控制数据校验顺序,解决多字段联合逻辑校验问题[享学Spring MVC] Hibernate Validator提供了非标准的@GroupSequenceProvider注解.针对当前对象实例的状态,动态来决定加载那些校验组进入默认校验组.需要借助Hibernate Validation提供给我们的DefaultGroupSequenceProvid

  • springboot中一些比较常用的注解总结

    springboot常用注解 1.@SpringBootApplication 这个注解是Spring Boot最核心的注解,用在 Spring Boot的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力.实际上这个注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的组合.由于这些注解一般都是一起使用,所以Spring Boot提供了一个统一的注解@SpringBootAppl

随机推荐