本篇文章为大家展示了@ 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有什么区别,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。