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