zoukankan      html  css  js  c++  java
  • Spring中的bean装配

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

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

    装配(wiring):创建应用对象之间协作的行为。是通过DI完成的。

    开发人员需要告诉Spring要创建哪些bean、如何将其装配一起。 

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

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

    三种装配方式可以搭配使用。优先使用自动装配、Java显式装配、XML显式装配。

    自动化装配

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

    @Component注解表明该类作为一个组件类,Spring会为这个类创建bean。

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

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

    @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的显式装配。

  • 相关阅读:
    此生对我影响最大的三位老师
    介绍自己
    介绍自己
    第三周作业
    第二周作业
    PTA编程总结3
    PTA编程总结2
    PTA编程总结1
    2019年春季学期第七周作业.
    2019年春季学期第六周作业.
  • 原文地址:https://www.cnblogs.com/minguo/p/10889967.html
Copyright © 2011-2022 走看看