@Component和@Configuration的差别

目录

@Configuration注解

@component注解

Configuration 和 component代码测试


        刚开始知道这两个注解的时候,自己貌似是混着用的,并没有太过区分其差异,好在也没有出现什么大问题,运气还算不错。反正有@Bean的配置类中,用的是@configuration注解,记得当看到这两个注解的时候,也看到有人在@Service层用成了@component,自己还算守规矩,一般该用什么注解,就使用什么注解。

        那么这两个注解有什么差别呢?且听我缓缓道来。

@Configuration注解

        @Configuration注解表明这个类是一个配置类。@Configuration中所有带@Bean注解的方法都会被动态代理(cglib),因此调用该方法返回的都是同一个实例。

        @Configuration 注解的源代码中,使用了 @Component 注解。 

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

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

@component注解

        @Conponent修饰的类不会被代理,每实例化一次就会创建一个新的对象,并没有被cglib 动态代理。

Configuration 和 component代码测试

import lombok.Data;

/**
 * @author Evan Walker
 * @date 2023/04/03 14:55:09
 */
@Data
public class Room {
    private String name;
    private Integer id;
}
import lombok.Data;

/**
 * @author Evan Walker
 * @date 2023/04/03 14:54:27
 */
@Data
public class School {
    private Integer id;
    private String name;
    private Room room;
}

import com.common.demo.pojo.Room;
import com.common.demo.pojo.School;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

/**
 * @author Evan Walker
 * @version 1.0
 * @desc 昂焱数据 https://www.ayshuju.com
 * @date 2023/04/03 14:48:07
 */
//@Component
@Configuration
public class Config {

    @Bean
    public School school() {
        School school = new School();
        school.setId(1);
        school.setName("昂焱数据学校");
        school.setRoom(room());
        return school;
    }

    @Bean
    public Room room() {
        Room room = new Room();
        room.setId(1);
        room.setName("一年级");
        return room;
    }
}
import com.common.demo.pojo.Room;
import com.common.demo.pojo.School;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @desc 下面是测试代码
 * @author Evan Walker
 * @date 2023/04/03 14:50:48
 * @version 1.0
 */
@SpringBootTest(classes = {DemoApplication.class})
@RunWith(SpringRunner.class)
public class ConfigTest {

    @Autowired
    private Room room;

    @Autowired
    private School school;

    @Test
    public void test() {
        //System.out.println(room == school.getRoom() ? "@Component是同一个实例" : "@Component不是同一个实例" );
        System.out.println(room == school.getRoom() ? "@Configuration是同一个实例" : "@Configuration不是同一个实例");
    }
}

当我们分别进行@component注解,@Configuration注解进行测试时。

 

 即:@Component不是同一个实例;@Configuration是同一个实例。

更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值