目录
刚开始知道这两个注解的时候,自己貌似是混着用的,并没有太过区分其差异,好在也没有出现什么大问题,运气还算不错。反正有@Bean的配置类中,用的是@configuration注解,记得当看到这两个注解的时候,也看到有人在@Service层用成了@component,自己还算守规矩,一般该用什么注解,就使用什么注解。
那么这两个注解有什么差别呢?且听我缓缓道来。
@Configuration注解
@Configuration注解表明这个类是一个配置类。@Configuration中所有带@Bean注解的方法都会被动态代理(cglib),因此调用该方法返回的都是同一个实例。
@Configuration 注解的源代码中,使用了 @Component 注解。
@Configuration 标记的类必须符合下面的要求:
- 配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。
- 配置类不能是 final 类(没法动态代理)。
- 配置注解通常为了通过 @Bean 注解生成 Spring 容器管理的类,
- 配置类必须是非本地的(即不能在方法中声明,不能是 private)。
- 任何嵌套配置类都必须声明为static。
- @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)