@ configuration与@ component有什么区别

  介绍

本篇文章为大家展示了@ configuration与@ component有什么区别,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强> @ configuration注解的类:

@ configuration   public  class  MyBeanConfig  {   ,@ bean   ,public  Country 国家(){   return 才能;new 国家();   ,}   ,@ bean   ,public  UserInfo 用户信息(){   return 才能;new 用户信息(国家());   ,}   }

<强> @ component注解的类:

/* *   ,* @Description 测试用的配置类   ,* @Author 弟中弟   ,* @CreateTime  2019/6/18 十四36   ,*/@ component   public  class  MyBeanConfig  {   ,@ bean   ,public  Country 国家(){   return 才能;new 国家();   ,}   ,@ bean   ,public  UserInfo 用户信息(){   return 才能;new 用户信息(国家());   ,}   }

<>强测试:

@RunWith (SpringRunner.class)   @SpringBootTest   public  class  DemoTest  {      @ autowired才能   private 才能;Country ;      @ autowired才能   private 才能UserInfo 用户信息;      @Test才能   public 才能;void  myTest (), {   ,,,boolean  result =, userInfo.getCountry (),==,;   ,,,System.out.println (result  ?,“同一个country",:,“不同的country");   ,,}      }

如果是@ configuration打印出来的则是同一个国家,@ component则是不同的国家,这是为什么呢?

@Target ({ElementType.TYPE})   @Retention (RetentionPolicy.RUNTIME)   @Documented   @ component   public  @interface  Configuration  {   @AliasFor才能(   ,,,annotation =Component.class   ,,)   String 才能;价值(),default ““;   }

你点开@ configuration会发现其实他也是被@ component修饰的,因此上下文:component-scan/或者@ComponentScan都能处理@ configuration注解的类。

<强> @ configuration标记的类必须符合下面的要求:

配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib动态代理)。

配置类不能是最后的类(没法动态代理)。

配置注解通常为了通过@ bean注解生成春容器管理的类,

配置类必须是非本地的(即不能在方法中声明,不能是私有)。

任何嵌套配置类都必须声明为静态的。

@ bean方法可能不会反过来创建进一步的配置类(也就是返回的bean如果带有

@ configuration,也不会被特殊处理,只会作为普通的bean)。

但是春容器在启动时有个专门处理@ configuration的类,会对@ configuration修饰的类cglib动态代理进行增强,这也是@ configuration为什么需要符合上面的要求中的部分原因,那具体会增强什么呢?

这里是个人整理的思路如果有错请指点

用户信息()中调用了国家(),因为是方法那必然国家()生成新的新国家(),所以动态代理增加就会对其进行判断如果用户信息中调用的方法还@ bean修有饰,那就会直接调用春容器中的国家实例,不再调用国家(),那必然是一个对象了,因为春容器中的bean默认是单例。不理解比如xml配置的bean

& lt; bean  id=癱ountry",类=癱om.hhh.demo.Country",范围=皊ingleton"/祝辞

这里范围默认是单例。

以上是个人理解,详情源码的分析请看https://www.jb51.net/article/153430.htm

但是如果我就想用@ component,那没有@ component的类没有动态代理咋办呢?

@ component   public  class  MyBeanConfig  {   ,@ autowired   ,private  Country ;   ,@ bean   ,public  Country 国家(){   return 才能;new 国家();   ,}   ,@ bean   ,public  UserInfo 用户信息(){   return 才能;new 用户信息(国家);   ,}   }

上述内容就是@ configuration与@ component有什么区别,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

@ configuration与@ component有什么区别