首页 > 其他分享 >Spring @Configuration 和 @Component 区别

Spring @Configuration 和 @Component 区别

时间:2024-03-01 10:25:10浏览次数:23  
标签:Country Spring Component Bean country 注解 Configuration

Spring @Configuration 和 @Component 区别

一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。

 

@Configuration 注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    String value() default "";
}


从定义来看, @Configuration 注解本质上还是 @Component,因此 <context:component-scan/> 或者 @ComponentScan 都能处理@Configuration 注解的类。

@Configuration 标记的类必须符合下面的要求:

    配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。
    配置类不能是 final 类(没法动态代理)。
    配置注解通常为了通过 @Bean 注解生成 Spring 容器管理的类,
    配置类必须是非本地的(即不能在方法中声明,不能是 private)。
    任何嵌套配置类都必须声明为static。
    @Bean 方法可能不会反过来创建进一步的配置类(也就是返回的 bean 如果带有 @Configuration,也不会被特殊处理,只会作为普通的 bean)。

 

 

@Component 注意

@Component 注解并没有通过 cglib 来代理@Bean 方法的调用,因此像下面这样配置时,就是两个不同的 country。

@Component
public class MyBeanConfig {

    @Bean
    public Country country(){
        return new Country();
    }

    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country());
    }

}

有些特殊情况下,我们不希望 MyBeanConfig 被代理(代理后会变成WebMvcConfig$$EnhancerBySpringCGLIB$$8bef3235293)时,就得用 @Component,这种情况下,上面的写法就需要改成下面这样:

@Component
public class MyBeanConfig {

    @Autowired
    private Country country;

    @Bean
    public Country country(){
        return new Country();
    }

    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country);
    }

}

 

加载过程

Spring 容器在启动时,会加载默认的一些 PostPRocessor,其中就有 ConfigurationClassPostProcessor,这个后置处理程序专门处理带有 @Configuration 注解的类,这个程序会在 bean 定义加载完成后,在 bean 初始化前进行处理。主要处理的过程就是使用 cglib 动态代理增强类,而且是对其中带有 @Bean 注解的方法进行处理。
,查找到所有带有 @Configuration 注解的 bean 定义,然后在第二个 for 循环中,通过下面的方法对类进行增强:

使用增强后的类替换了原有的 beanClass:所以到此时,所有带有 @Configuration 注解的 bean 都已经变成了增强的类。也就是当方法有 @Bean 注解的时候,就会执行这个回调方法。

@Bean 注解方法执行策略

先给一个简单的示例代码:@Configuration
public class MyBeanConfig {

    @Bean
    public Country country(){
        return new Country();
    }

    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country());
    }

}相信大多数人第一次看到上面 userInfo() 中调用 country() 时,会认为这里的 Country 和上面 @Bean 方法返回的 Country 可能不是同一个对象,因此可能会通过下面的方式来替代这种方式:

@Autowired
private Country country;

实际上不需要这么做(后面会给出需要这样做的场景),直接调用 country() 方法返回的是同一个实例。


标签:Country,Spring,Component,Bean,country,注解,Configuration
From: https://www.cnblogs.com/JavaYuYin/p/18046368

相关文章

  • springboot应用中根据特定条件使用CommandLineRunner
    PS使用SpringBoot3.1.2进行测试1.使用@ConditionalOnProperty仅当特定属性存在或具有特定值时,注释@ConditionalOnProperty才会创建bean。在此示例中,仅当或文件中的CommandLineRunner属性db.init.enabled设置为true时才会执行application.propertiesapplication.ymlpac......
  • Spring Boot学习日记17
    尝试整合JDBC spring:datasource:username:rootpassword:123456url:jdbc:mysql://localhost:3306/mybatis?useSSL=true&userUniceode=true&characterEncoding=utf8driver-class-name:com.mysql.cj.jdbc.Driverpackagecom.example.spri......
  • Spring Boot学习日记9
    在springboot项目中的resources目录下新建一个文件application.yml编写一个实体类Dog;packagecom.example.springboot02configure.pojo;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Component;@Component//添加......
  • Spring Boot学习日记6
    @SpringBootConfiguration:SpringBoot的配置@Configuration:spring配置类@Component:说明这也是一个spring的组件@EnableAutoConfiguration:自动配置@AutoConfigurationPackage:自动配置包@Import({Registrar.class}):导入了选择器@Import({AutoConfigurationImportSelect......
  • Spring Boot学习日记7
    学会了配置springboot导入各种组件SpringBoot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值将这些自动配置的类导入容器,自动配置类就会生效,帮我们进行自动配置以前我们需要自动配置的东西,现在不需要了整合javaEE,解决方案和自动配置的东西都在Spring-boot-......
  • 三分钟数据持久化:Spring Boot, JPA 与 SQLite 的完美融合
    三分钟,迎接一个更加高效和简便的开发体验。在快节奏的软件开发领域,每一个简化工作流程的机会都不容错过。想要一个无需繁琐配置、能够迅速启动的数据持久化方案吗?这篇文章将是你的首选攻略。在这里,我们将向你展示如何将SpringBoot的便捷性、JPA的强大查询能力和SQLite的......
  • springboot将用户认证信息提取到上下文,获取用户实体
    @ServicepublicclassInfoServiceImplimplementsInfoService{@OverridepublicMap<String,String>getinfo(){//将用户认证信息从上下文中(SecurityContext)提取出来UsernamePasswordAuthenticationTokenauthenticationToken=......
  • SpringBoot
    SpringBoot特性快速创建独立Spring应用SSM:导包、写配置、启动运行直接嵌入Tomcat、JettyorUndertow(无需部署war包)【Servlet容器】linuxjavatomcatmysql:war放到tomcat的webapps下jar:java环境;java-jar重点:提供可选的starter,简化应用整合场景启动器(starter)......
  • springboot中实现一个接口
    实现一个接口,需要在service里写一个接口,写一个实现,在controller里写一个类chatgpt4.0:在Spring框架中,实现一个接口通常遵循一种分层的架构模式,这种模式涉及到至少三个主要部分:接口定义、服务层实现、以及控制器层。这个流程确保了应用程序的高内聚、低耦合特性,同时也符合Spring......
  • spring-boot整合jsp + mybatis ems小案例分析
    1.项目开发流程 需求分析:分析用户主要需求提取出项目核心功能根据核心功能构建页面原型 库表设计(概要设计):1.分析整个系统有哪些表2.分析出表之间关联关系3.确定字段 详细设计(流程图,伪代码):用来验证库表准确性 功能实现(编码):环境搭建具体功能实现 功能测试......