Spring依赖注入详解(3)

@primary 常见的情况是一个接口仅有一个实现类,所以使用@Autowire的后,Spring可以走到对应的实现类。如果一个接口有多个实现类呢?@Component 和 @primary 同时使用,标注哪个实现类优先被使用。

 @Qualifier 使用@primary 仍然无法保证哪个bean被选择,因为可以在多个实现类上使用@primary。所以可以在实现类用@Qualifter("bean")名指定bean的名字。并在@Autowire 注入接口的时候是使用Qualifier 指定实现类的bean名。当然,也可以用@Resource(name=" ")指定类的名称。

4、读取 properties 文件

(1) @PropertySource 会引用一个类路径上的properties的文件,并利用Environment类获取properties的变量值。例如:@PropertySource("classpath:mongo.properties")

Spring依赖注入详解

@Configuration @PropertySource("classpath:mongo.properties") public class JavaConfig { @Bean(name = "mongoUtil") public MongoUtil getMongoUtil(Environment env){ return new MongoUtil(env.getProperty("mongo.host"), env.getProperty("mongo.port"), env.getProperty("mongo.database"), env.getProperty("mongo.username"), env.getProperty("mongo.password")); } }

View Code

Spring依赖注入详解

(2) 占位符

     Spring 中占位符的形式是使用${}的方式。在代码文件中我们可以使用@Value注解将配置文件的值注入到变量中。为了使用占位符,我们必须配置一个PropertySourcesPlaceholderConfigurer 的类,已生成相关的bean,或者通过XML配置让Spring为我们自动生成:

Spring依赖注入详解

@Configuration @PropertySource("classpath:mongo.properties") public class JavaConfig { @Bean(name = "propertySourcesPlaceholderConfigurer") public PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer(){ return new PropertySourcesPlaceholderConfigurer(); } }

View Code

或者:

Spring依赖注入详解

<!--提供读取配置文件可以使用Spring占位符${}--> <context:property-placeholder location="classpath:mongo.properties" file-encoding="utf-8" />

View Code

用法如下:

Spring依赖注入详解

@RunWith(SpringJUnit4ClassRunner.class) //@ContextConfiguration(classes = JavaConfig.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") public class Test06 { @Value("${mongo.host}") private String host; @Test public void test06(){ System.out.println(host); } }

View Code

四、Expression Language

Spring Expression Language,简称SpEL,是一种非常灵活的表达式语言,拥有很多特性,包括:

使用bean的ID来引用bean;
调用方法和访问对象的属性;
对值进行算术、关系和逻辑运算;
正则表达式匹配;
集合操作。

SpEL 采用#{}的形式:

1、代表字面值:#{3.14} #{'Hello'} #{false}
2、引用bean、属性、方法 #{bean} #{bean.artist} #{bean.toUpperCase()} #{bean?.toUpperCase()}(表示如果bean为null 就返回null,不调用方法)
3、引用某个类 #{T{java.lang.Math}.PI}
4、三元表达式 #{bean.score > 1000 ? "win":"los"} 判空 #{bean.score ?: "win"}
5、正则表达式 #{bean.email matches '表达式'}
6、计算集合 #{bean.song[4].title}
     查询运算符(.?)  #{bean.songs.?[artist eq 'hello']}
     匹配第一个 (.^)  #{bean.songs.^[artist eq 'hello']}
     匹配最后一个 (.$) : 

#{bean.songs.$[artist eq 'hello']}                         

     投影运算符 (.!)  #{bean.songs.![title]}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7be1c88647299645c0362ad1275ccebb.html