chapter02_装配Bean_1_装配Bean

  • 依赖注入

    对象的依赖关系由系统中负责协调各个对象的__第三方组件(Spring)__在创建时进行设定。一个对象只通过接口来表明依赖关系,对象会在运行期被赋予它们所依赖的对象,而不需要主动获得

  • 装配

    (1) 定义

    创建应用对象之间的协作关系

    (2) 装配机制

    1 自动

    2 Java Config 配置类

    3 Xml

    (3) 优先级

    自动 > Java Config > Xml 配置, 现实条件不允许时再使用后面的方式

  • 自动配置 = 自动扫描 + 自动装配

    (1) 自动扫描

    @Component 注解会告知 Spring 为当前类创建 bean

    示例

      import org.springframework.stereotype.Component;
    
      @Component
      public class SgtPeppers implements CompactDisc {
    
          private String title = "Sgt. Pepper's Lonely Hearts Club Band";
          private String artist = "The Beatles";
    
          public void play() {
    
              System.out.println("Playing " + title + " by " + artist);
          }
      }
    

    @ComponentScan会进行自动扫描(默认扫描当前包下的bean,也可以进行配置)

    示例

      import org.springframework.context.annotation.ComponentScan;
      import org.springframework.context.annotation.Configuration;
    
      @Configuration
      @ComponentScan
      public class CDPlayerConfig { 
      }
    

    自动扫描也可以在Xml中通过配置实现

    示例

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:context="http://www.springframework.org/schema/context"
             xmlns:c="http://www.springframework.org/schema/c"
             xmlns:p="http://www.springframework.org/schema/p"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
          <context:component-scan base-package="soundsystem" />
    
      </beans>
    

    @Configuration 代表该类是一个配置类

    (2) 自动装配

    @Autowired可以进行自动装配,并且__可以用在类的任何方法上__,只要该方法存在不同对象的依赖关系

    示例

      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Component;
    
      @Component
      public class CDPlayer implements MediaPlayer {
    
          private CompactDisc cd;
    
          @Autowired
          public CDPlayer(CompactDisc cd) {
    
              this.cd = cd;
          }
    
          public void play() {
              cd.play();
          }
      }
    
  • Java Config 配置

    (1) Java Config类__一般放在单独的包中,不包含任何业务逻辑__

    (2) 使用 @Configuration 代表该类是一个配置类

    示例

      @Configuration
      public class CDPlayerConfig {
    
          ....
      }
    

    (3) 在JavaConfig中声明Bean,需要编写一个方法,创建接口对应的实例,然后给这个方法添加@Bean注解

      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
    
      @Configuration
      public class CDPlayerConfig {
    
          @Bean
          public CompactDisc compactDisc() {
    
              return new SgtPeppers();
          }
    
          @Bean
          public CDPlayer cdPlayer(CompactDisc compactDisc) {
    
              return new CDPlayer(compactDisc);
          }
      }
    

    (4) 默认情况下,Spring中的Bean都是单例的。也就是说下面的例子中,Spring会拦截对 sgtPeppers()的调用并确保返回的是Spring所创建的bean

    示例

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

    (5) 带有@Bean注解的方法可以采用任何必要的Java功能来产生示例,未必是构造器依赖注入

    示例

      @Bean
      public CDPlayer cdPlayer(CompactDisc compactDisc) {
    
          CDPlayer cdPlayer = new CDPlayer();
          cdPlayer.setCompactDisc(compactDisc);
    
          return cdPlayer;
      }
    
  • Xml装配Bean

    (1) 配置规范 + 根元素

    示例

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:p="http://www.springframework.org/schema/p"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
         ...
      </beans>
    

    (2) 声明bean:

    示例

      <bean class="soundsystem.SgtPeppers" id="compactDisc"/>
    

    (3) 构造器注入:

    1 引用其他对象: ref属性

    示例

      <bean id="cdPlayer" class="soundsystem.CDPlayer">
          <constuctor-arg ref="compactDisc"/>
      </bean>
    

    2 字面量: value属性(按照构造器的参数顺序对应)

    示例

      <bean class="soundsystem.BlankDisc" id="blackDisc">
          <constructor-arg value="Chara"/>
          <constructor-arg value="Glico"/>
      </bean>
    

    3 集合:

      <list>元素, <set>元素
    

    (4) 设置属性(类似于 setXXX方法): ,内含 name属性,代表 setXXX部分的XXX,但是首字母小写

    1 引用其他对象: ref属性

    示例

      <bean id="cdPlayer" class="soundsystem.CDPlayer">
          <property name="compactDisc" ref="compactDisc"/>
      </bean>
    

    2 字面量: value属性(按照构造器的参数顺序对应)

    示例

      <bean class="soundsystem.BlankDisc" id="blackDisc">
          <property name="artist" value="Chara"/>
      </bean>
    

    3 集合:

      <list>元素, <set>元素
    

    (5) 原则:强相关使用构造器,弱相关使用setXXX()方法

  • 混合装配

    (1) Java Config 中引用 xml: @ImportResource

    示例 (classpath是 src/main/resources)

      @ImportResource("classpath:cd-config.xml")
    

    (2) Java Config 中引用其他 Java Config: @Import

    示例

      @Configuration
      @Import(CDConfig.class, CDPlayerConfig.class)
      public class SystemConfig {
      }
    

    所以,可以创建一个 Java Config汇总配置类,这样导入时只需要导入这个类

    (3) xml 中引用 Java Config: 使用 元素

    示例

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:c="http://www.springframework.org/schema/c"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
          <bean id="compactDisc" class="soundsystem.BlankDisc"
              c:_0="Sgt. Pepper's Lonely Hearts Club Band"
              c:_1="The Beatles">
              <constructor-arg>
                  <list>
                      <value>Sgt. Pepper's Lonely Hearts Club Band</value>
                      <value>With a Little Help from My Friends</value>
                      <value>Lucy in the Sky with Diamonds</value>
                      <value>Getting Better</value>
                      <value>Fixing a Hole</value>
                  </list>
              </constructor-arg>
          </bean>
      </beans>
    

    (4) xml 中引用其他 xml配置:

    示例
    
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:c="http://www.springframework.org/schema/c"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
            <import resource="otherSource.xml"/>
    
        </beans>
    
  • 测试时,需要在 src/test/java 下创建 测试文件。

    调用Java Config配置类使用 @ContextConfiguration(classes = xxx.class)

    调用xml配置时使用 @ContextConfiguration(locations = “classpath:META-INF/spring/soundsystem.xml”)

    或者是 手动地添加应用上下文如 AnnotationConfigApplicationContext、ClassPathXmlApplicationContext等,详见"Spring容器.md"

  • 无论使用哪种配置,一般都要创建一个根配置,将所有的JavaConfig(自动方式也有一个JavaConfig类)和XML组合起来,然后这个根配置启动 @ComponentScan

猜你喜欢

转载自blog.csdn.net/captxb/article/details/87862601