尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

@Component和@Configuration的差别

@Component和@Configuration的差别 目录Configuration注解component注解Configuration 和 component代码测试刚开始知道这两个注解的时候自己貌似是混着用的并没有太过区分其差异好在也没有出现什么大问题运气还算不错。反正有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是同一个实例。
返回列表