美文网首页
Spring实战随笔(二)装配Bean

Spring实战随笔(二)装配Bean

作者: 面包树_A | 来源:发表于2018-05-08 15:47 被阅读0次

    之前学习了Spring的核心概念,其中DI是spring最基本要素,因为在Spring中随时都在使用。DI创建了对象之间的协作关系,称之为装配,Spring中装配bean就是配置Spring容器的过程。

    有三种方式配置容器:
    1.隐式的bean发现机制和自动配置
    2.在JAVA中显式配置
    3.在XML中显式配置

    根据项目需要来选择相应的配置方案。

    - 自动化装配Bean

    Why:方便

    Spring从两个角度实现自动化装配:

    • 组件扫描: Spring自动发现ApplicationContext中创建的bean
      @Component: Spring寻找带该注解的类,并为其创建bean,这个注解不会开启组件扫描。
      @ComponentScan: 这个注解会扫描当前类包+子包下所有带@Component注解的类创建bean,并且它会开启组件扫描。效果等同于用XML的<context:component-scan>.
      Spring自动创建的bean id默认为class名,可以自己@Component("tricker")来命名。

    • 自动装配: Spring自动满足bean之间的依赖
      @Autowired: 该注解能放在类中任一方法上,会自动装配需要的所有bean,如果找不到匹配的会自动抛出异常,如果找到多个也会抛出异常需要明确指定是哪个。

    -显式配置Bean

    Why: 有时候自动化配置行不通,譬如使用了第三方库,不可能在第三方库类上加注解

    - 在JAVA中显式配置Bean

    JavaConfig方式,通过@Configuration @Bean显式配置。

    @Configuration
    public class PaymentJavaConfig {
    
        @Bean
        public ILogger getIlogger() {
            return new ConsoleLogger();
        }
    
        @Bean
        public PaymentActionMixed getPaymentActionMixed(ILogger logger)     {
            return new PaymentActionMixed(logger);
        }
    }
    
    - 在XML中显式配置Bean
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context">
    <!-- configuration details go here -->
      <bean class="soundsystem.SgtPeppers" />
          <!-- 构造器注入 -->
          <constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band" />
      </bean>  
      <bean id="cdPlayer" class="soundsystem.CDPlayer">
          <!-- 属性注入 -->
          <property name="compactDisc" ref="compactDisc" />
      </bean>
    </beans>
    

    还有些c命名空间(c:cd-ref)、p命名空间(p:compactDisc-ref)、util命名空间<util:list>
    缺点:无法校验,安全性太差,不会在编译期就检查该类是否存在(不过如果用Spring Tool Suite的话可以);而且比JAVA Config方式要麻烦很多,还需要声明XSD

    - JAVA Config和XML混合使用
    • JavaConfig中引用XML声明的bean
    @Configuration
    // 导入通过JAVAConfig声明的bean:CDPlayerConfig
    @Import(CDPlayerConfig.class)
    // 导入cd-config.xml中声明的bean
    @ImportResource("classpath:cd-config.xml")
    public class SoundSystemConfig {
    }
    
    • XML中引用JavaConfig声明的bean
    <?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">
    
      <!-- XML中声明bean -->
      <bean id="cdPlayer" class="soundsystem.CDPlayer" c:cd-ref="compactDisc" />
      <!-- 导入JAVAConfig中声明的bean -->
      <bean class="soundsystem.CDConfig" />
      <!-- 导入其他XML文件中声明的bean -->  
      <import resource="cdplayer-config.xml" />
    </beans>
    

    - Summary

    尽量用自动化配置bean,避免显示配置带来的代码和维护成本。如果一定要显示,JAVAConfig优于XML。这里学习了Spring的集中装配方式,但是Spring还有更高的装配的需求,接下来继续学习Spring高级装配。

    - W3CSchool参考链接

    相关文章

      网友评论

          本文标题:Spring实战随笔(二)装配Bean

          本文链接:https://www.haomeiwen.com/subject/pwhwrftx.html