Spring 配置类不可以用@Component代替

发布于:2025-07-28 ⋅ 阅读:(9) ⋅ 点赞:(0)

1. 现象

@Configuration 和@Component 的元注解一样的, 那么功能一样吗, 能用@Component标注测试类吗?不行

@Configuration 会被标记为Full模式代理,被cglib进行代理
@Component按Lite模式处理

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {}

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {}

2. 测试

public class Dog {
}
@Getter
@Setter
public class Student {
    private Dog dog;
}

(1)Configuration


@Configuration
public class StudentConfig {

    @Bean
    public Dog dog() {
        Dog dog = new Dog();
        System.out.println("dog = " + dog);
        return dog;
    }

    @Bean
    public Student student() {
        Student student = new Student();
        student.setDog(dog());
        System.out.println("student.getDog() = " + student.getDog());
        return student;
    }
}

结果: student.setDog(dog());用的是容器中的dog.
dog = com.ityj.ssm.etity.Dog@4f6b687e
student.getDog() = com.ityj.ssm.etity.Dog@4f6b687e

(2)Component

@Component
public class StudentConfig {
}

结果: student.setDog(dog());用的是自己new出的dog
dog = com.ityj.ssm.etity.Dog@74dbb1ee
dog = com.ityj.ssm.etity.Dog@3efedc6f
student.getDog() = com.ityj.ssm.etity.Dog@3efedc6f

3. 源码

(1)标记@Configuration为Full模式

org.springframework.context.annotation.ConfigurationClassUtils#checkConfigurationClassCandidate
在这里插入图片描述

(2)进行增强

org.springframework.context.annotation.ConfigurationClassPostProcessor#postProcessBeanFactory
org.springframework.context.annotation.ConfigurationClassPostProcessor#enhanceConfigurationClasses

在这里插入图片描述

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到