@Configuration与@Component作为配置类的区别

栏目: Java · 发布时间: 5年前

内容简介:@Configuration注解的类:@Component注解的类:测试:

@Configuration注解的类:

/**
 * @Description 测试用的配置类
 * @Author 弟中弟
 * @CreateTime 2019/6/18 14:35
 */
@Configuration
public class MyBeanConfig {
  @Bean
  public Country country(){
    return new Country();
  }
  @Bean
  public UserInfo userInfo(){
    return new UserInfo(country());
  }
}

复制代码

@Component注解的类:

/**
 * @Description 测试用的配置类
 * @Author 弟中弟
 * @CreateTime 2019/6/18 14:36
 */
@Component
public class MyBeanConfig {
  @Bean
  public Country country(){
    return new Country();
  }
  @Bean
  public UserInfo userInfo(){
    return new UserInfo(country());
  }
}
复制代码

测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoTest {

    @Autowired
    private Country country;

    @Autowired
    private UserInfo userInfo;

    @Test
    public void myTest() {
        boolean result = userInfo.getCountry() == country;
        System.out.println(result ? "同一个country" : "不同的country");
    }

}
复制代码

如果是@Configuration打印出来的则是同一个country,@Component则是不同的country,这是为什么呢?

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}
复制代码

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

@Configuration标记的类必须符合下面的要求:

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

配置类不能是 final 类(没法动态代理)。

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

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

任何嵌套配置类都必须声明为static。

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

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

但是spring容器在启动时有个专门处理@Configuration的类,会对@Configuration修饰的类cglib动态代理进行增强,这也是@Configuration为什么需要符合上面的要求中的部分原因,那具体会增强什么呢? 这里是个人整理的思路 如果有错请指点

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

<bean id="country" class="com.hhh.demo.Country" scope="singleton"/>
复制代码

这里scope默认是单例。

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

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

/**
 * @Description 测试用的配置类
 * @Author 弟中弟
 * @CreateTime 2019/6/18 14:36
 */
@Component
public class MyBeanConfig {
  @Autowired
  private Country country;
  @Bean
  public Country country(){
    return new Country();
  }
  @Bean
  public UserInfo userInfo(){
    return new UserInfo(country);
  }
}
复制代码

这样就保证是同一个Country实例了

如果有错请大佬们指点 谢谢 0.0


以上所述就是小编给大家介绍的《@Configuration与@Component作为配置类的区别》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Building Websites with Joomla!

Building Websites with Joomla!

H Graf / Packt Publishing / 2006-01-20 / USD 44.99

This book is a fast paced tutorial to creating a website using Joomla!. If you've never used Joomla!, or even any web content management system before, then this book will walk you through each step i......一起来看看 《Building Websites with Joomla!》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试