• Spring 高级依赖注入方式


    1、处理自动装配的歧义性

    1.1 标记首选的bean

    ​ 使用@Primary 来说明一个bean是首选的。

    @Component
    @Primary
    public class GuoRongCD implements CompactDisc {}
    

    或是

    @Bean
    @Primary
    public MediaPlayer getAnotherCDplay(CompactDisc aa){
      CDPlayer k = new CDPlayer();
      k.setCompactDisc(aa);
      return k;
    }
    

    或是

    <bean id="glCD" class="com.di.book.GuoRongCD" primary="true"/>
    

    ​ 但是,一个类型的bean只能有一个首选标志,如果多个,就失去意义了。

    1.2 限定自动装配的bean

    ​ 如果被注入的bean类型不是唯一的,需要设置限定符,来确定哪个bean是被需要的。@Qualifier注解是使用限定符的主要方式。

    @Autowired
    @Qualifier("guoRongCD")
    public void setCompactDisc(CompactDisc compactDisc) {
      this.compactDisc = compactDisc;
    }
    

    ​ @Qualifier 设置的参数就是想要注入的bean的ID。所有使用@Component 注解声明的bean,默认的ID是首字母变小写的类名。

    ​ 更精确的说,@Qualifier("guoRongCD") 所要引用的bean是具有String类型的“guoRongCD”作为限定符。如果没有指定限定符,bea一般会有一个默认的限定符,这个限定符和bean 的ID相同。

    • 给bean指定限定符
      @Component
      @Qualifier("kkd")
      public class GuoRongCD implements CompactDisc {}
    

    或是

      @Bean
      @Qualifier("kkd")
      public CompactDisc getCompactDisc(){
      return new GuoRongCD();
      }
    

    2、作用域

    。。。。。。

    3、运行时值注入

    ​ 为了避免硬编码,可以是程序在运行时候再给属性复制。有如下两种方式:

    • 属性占位符
    • Spring 表达式语言

    3.1 注入外部值

    @Configuration
    @PropertySource("classpath:test.properties")//引入配置文件
    public class ExpressiveConfig {
    	@Autowired
    	Environment env;//自动检索属性
    	@Bean
    	public BlankDisk disc(){
    		return new BlankDisk(
              //寻找键值,进行注入
    				env.getProperty("disc.title"),
    				env.getProperty("disc.artist"));
    	}
    }
    

    test.properties

    disc.title = vae
    disc.artist = vae Son
    

    3.2 深入研究

    关于getProperty()的重载形式:

    //只有key
    String getProperty(String key)
    //含有默认值,如果找不到改善属性值,就会适应默认值
    String getProperty(String key, String defaultValue)
    //可以类型转换,比如字符串转整型,
    //getProperty("port", Integer.class)
    <T> T getProperty(String key, Class<T> targetType);
    //带有默认值
    <T> T getProperty(String key, Class<T> targetType, T defaultValue);
    

    ​ 当使用getProperty()时候,如果是空值,结果适null,不会包异常。如果希望该结果不存在的时候抛异常,就可以使用 getRequiredProperty() 方法,所有使用方法和前者一致,若是值不存在,会抛出异常。

    3.3 属性占位符

    • XML中,可以使用“${}”来占位。
      <bean id="dataSource"
      			class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          <property name="url" value="${mysql.url}"/>
          <property name="username" value="${mysql.username}"/>
          <property name="driverClassName" value="${mysql.driverClassName}"/>
          <property name="password" value="${mysql.password}"/>	
      	</bean>
    
    • 在JavaConfig中,使用@Value来占位
      @Bean
      public BlankDisk disc(@Value("${disc.title}")String title,
                            @Value("${disc.artist}")String artist)	{
        return new BlankDisk(title,artist);
      }
    

    但是,为了使用占位符,需要含有PropertySourcesPlaceholderConfigurer 类型的bean:

      @Bean
      public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
        return new PropertySourcesPlaceholderConfigurer();
      }
    

    在XML中,需要使用命名空间

      <context:property-placeholder/>
    

    这个命名空间会给你自动创建这个bean。

  • 相关阅读:
    翻译MDN里js的一些方法属性
    ajax相关
    我的面试错题
    写代码通用思路
    工厂模式
    cookie & session
    X-UA-Compatible设置IE浏览器兼容模式
    [转]IE6/IE7/IE8/IE9中tbody的innerHTML不能赋值的完美解决方案
    EasyUseCase 一款脑图转化 Excel 测试用例工具 (1.2 版本升级)
    XMind2TestCase:一个高效测试用例设计的解决方案!
  • 原文地址:https://www.cnblogs.com/moongeek/p/7651475.html
Copyright © 2020-2023  润新知