@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")
@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
(2) 占位符
Spring 中占位符的形式是使用${}的方式。在代码文件中我们可以使用@Value注解将配置文件的值注入到变量中。为了使用占位符,我们必须配置一个PropertySourcesPlaceholderConfigurer 的类,已生成相关的bean,或者通过XML配置让Spring为我们自动生成:
@Configuration @PropertySource("classpath:mongo.properties") public class JavaConfig { @Bean(name = "propertySourcesPlaceholderConfigurer") public PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer(){ return new PropertySourcesPlaceholderConfigurer(); } }
View Code或者:
<!--提供读取配置文件可以使用Spring占位符${}--> <context:property-placeholder location="classpath:mongo.properties" file-encoding="utf-8" />
View Code用法如下:
@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 LanguageSpring 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]}