spring中的@bean和@component

首先两者都是用于向ioc容器中注入对象

但是@component系列(@service,@controller等)的注解是用在类上面的,例如在Teacher类上使用该注解,那么通过ioc容器的getBean方法获取时,的名字就是首字母小写,如果是MTeacher这样的,那么默认的名字就是类名MTeacher

@Configuration标注的类是一个配置类,@Bean在该类下可以通过方法注入一个对象,默认名称就是方法名

ioc容器,使用不同的类或者xml文件构建出来的ioc容器只能获取到在该类或xml文件中注入的对象,类似spring是一个大容器,通过xml或者配置类配置是包含在其中的一个个不同的小容器,然后对象就存在这些小容器中

使用多个类获取ioc容器

   // 使用多个类获取ioc容器
        ApplicationContext context =
                new AnnotationConfigApplicationContext(MyConfig.class, Teacher.class);

Spring 的新 Java 配置支持中的主要工件是@Configuration注解 的类和@Bean注解 的方法。

@Bean注解 用于指示方法实例化,配置和初始化要由 Spring IoC 容器 Management 的新对象。对于熟悉 Spring 的 XML 配置的人来说,@Bean注解 与元素具有相同的作用。您可以对任何 Spring @Component使用@Bean注解 的方法。但是,它们最常与@Configuration bean 一起使用。

用@Configuration注解 类表示该类的主要目的是作为 Bean 定义的来源。此外,@Configuration类通过调用同一类中的其他@Bean方法来定义 Bean 间的依赖关系。最简单的@Configuration类的内容如下:

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

上面的AppConfig类等效于下面的 Spring XML:

<beans>
    <bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>

完整的@Configuration 与“精简” @Bean 模式?

当在未使用@Configuration注解 的类中声明@Bean方法时,它们被称为以“精简”模式进行处理。在@Component或什至在普通的旧类中声明的 Bean 方法被认为是“精简版”,其中包含类的主要目的不同,而@Bean方法在那里具有某种优势。例如,服务组件可以通过每个适用的组件类上的附加@Bean方法向容器公开 Management 视图。在这种情况下,@Bean方法是一种通用的工厂方法机制。

与完整@Configuration不同,lite @Bean方法无法声明 Bean 之间的依赖关系。取而代之的是,它们在其包含组件的内部状态上运行,并且可以选择地在它们可以声明的参数上运行。因此,此类@Bean方法不应调用其他@Bean方法。实际上,每个此类方法仅是用于特定 bean 引用的工厂方法,而没有任何特殊的运行时语义。这里的积极副作用是,不必在运行时应用 CGLIB 子类,因此在类设计方面没有任何限制(即,包含类可能为final等)。

在常见情况下,将在@Configuration类中声明@Bean方法,以确保始终使用“完全”模式,因此跨方法引用将重定向到容器的生命周期 Management。这样可以防止通过常规 Java 调用意外地调用同一@Bean方法,从而有助于减少在“精简”模式下运行时难以追查的细微错误。

以下各节将对@Bean和@Configuration注解 进行深入讨论。但是,首先,我们介绍了通过基于 Java 的配置使用创建 spring 容器的各种方法。

@Configuration是类级别的 注解,指示对象是 Bean 定义的源。 @Configuration类通过公共@Bean带注解的方法声明 Bean。对@Configuration类的@Bean方法的调用也可以用于定义 Bean 间的依赖关系。有关一般介绍,请参见基本概念:@Bean 和@Configuration。
注入 Bean 间的依赖关系

当 bean 相互依赖时,表示这种依赖关系就像让一个 bean 方法调用另一个一样简单,如以下示例所示:

@Configuration
public class AppConfig {

    @Bean
    public BeanOne beanOne() {
        return new BeanOne(beanTwo());
    }

    @Bean
    public BeanTwo beanTwo() {
        return new BeanTwo();
    }
}

在前面的示例中,beanOne通过构造函数注入接收对beanTwo的引用。

Note

仅当在@Configuration类中声明@Bean方法时,此声明 bean 间依赖性的方法才有效。您不能通过使用普通@Component类来声明 Bean 间的依赖关系。

spring中文文档

上一篇:jmeter压测


下一篇:Spring的常用注解