Spring中的bean装配

建立对象之间的关联关系的传统作法(经过构造器或者查找)会致使对象之间高度耦合,难以复用和测试。在Spring中,对象无需本身建立、查找与之关联的其余对象,容器负责把须要相互协做的对象引用赋予各个对象。安全

Spring容器负责建立应用程序中的bean并经过DI来协调这些对象之间的关系。框架

装配(wiring):建立应用对象之间协做的行为。是经过DI完成的。ide

开发人员须要告诉Spring要建立哪些bean、如何将其装配一块儿。 测试

Spring中有三种主要的装配机制:spa

  • 在XML中进行显式装配
  • 在Java中进行显式装配
  • 隐式的bean发现机制和自动装配

三种装配方式能够搭配使用。优先使用自动装配、Java显式装配、XML显式装配。code

自动化装配

  • 组件扫描(component scanning)。自动寻找带@Component注解的类,并为其建立bean。
  • 自动装配(autowiring)

@Component注解代表该类做为一个组件类,Spring会为这个类建立bean。component

@ComponentScan启动组件扫描,默认扫描与配置类相同的包及子包,查找带@Component注解的类,并为其建立bean。对象

Spring中的组件扫描默认不开启,须要经过Java配置类或XML配置文件配置开启。blog

@Configuration
@ComponentScan
public class CDPlayerConfig {
}

XML配置开启组件扫描接口

<context:component-scan base-package="yourpackage"/>

为bean命名

Spring上下文中全部的bean都会给定一个ID。

若是没有设置,Spring根据类名指定一个ID,如SgtPeppers的ID为sgtPeppers。

能够经过@Component("lonelyHeartsClub")指定bean的ID为lonelyHeartsClub。

Spring也支持@Named("lonelyHeartsClub")为bean命名。

设置组件扫描的基础包

@ComponentScan默认以配置类所在的包为基础包来扫描组件。若是要将配置类放在单独的包中,与其余的应用代码区分开来,则必需要设置基础包。

在@ComponentScan的value属性设置包名,如:

@ComponentScan("soundsystem")

或者明确使用basePackages属性设置,可设置多个基础包:

@ComponentScan(basePackages={"soundSystem", "video"})

使用basePackageClasses属性设置,这样类型安全,basePackageClasses设置的是基础包中所包含的接口和类

@ComponentScan(basePackageClasses={CDPlayer.class})

自动装配

使用@Autowired声明自动装配。@Autowired能够用在构造器和方法上,Spring尝试知足方法参数上的全部声明。

若是Spring上下文中只有一个bean匹配依赖的话,这个bean会被装配进来。

若是没有bean匹配,建立上下文时会抛出异常

Java显式配置

在将第三方库的组件装配到应用中时,须要使用显式装配,没法使用自动装配。

@Configuration注解代表这个类是个配置类,该类包含建立bean的细节。

@Bean注解代表这个方法将会返回一个对象,要注册为bean。

默认状况下,bean的ID和方法名同样,也能够经过name属性指定。

在JavaConfig中装配依赖,能够直接调用建立bean的方法,或者在方法中声明参数。

@Configuration
public class CDPlayerConfig {
    @Bean(name = "lonelyHeartsClubBand")
    public CompactDisk sgtPeppers() {
        return new SgtPeppers();
    }

    @Bean
    public CDPlayer cdPlayer() {
        return new CDPlayer(sgtPeppers());
    }

    public CDPlayer cdPlayer(CompactDisc compactDisc) {
        return new CDPlayer(compactDisc);
    }
}

Spring中bean装配方式的混合配置

Spring的这些配置方式不是互斥的,是能够混用的。

Spring框架的核心是Spring容器。容器负责组件的生命周期,建立这些组件并知足它们的依赖,组件才能去完成任务。

Spring装配bean的三种方式:自动化装配、基于Java的显式装配、基于XML的显式装配。

使用三种方式的优先级是:尽量使用自动化装配,减小维护成本。而后是基于Java的显式装配,比XML装配功能强大、类型安全并已于重构。最后是基于XML的显式装配。

相关文章
相关标签/搜索