在Spring容器中使用applicationContext.xml
中来给对应的类注入对应的属性,来完成初始化,最典型的就是配置数据库连接池了。
1 | <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" |
配置参数就不贴出。
使用@Configuration创建Bean
Configuration 是 Spring 3.X 后提供的注解,用于取代 XML 来配置 Spring,
@Configuration
可理解为用spring的时候xml里面的<beans>
标签;
@Bean
可理解为用spring的时候xml里面的<bean>
标签。
这样就很好理解了。
需要注意的时配置spring
扫描的包 <context:component-scan base-package="com.xxx.xxx" />
不然注解不起效果(springboot不需要设置)。
读取json文件的属性注入Bean
这次使用Json文件来配置bean;
首先写出实体类,和需要配置的数据;
编写实体类
1 | package com.devframe.util; |
需要注入的数据
创建文件命名data.json
,(注意属性名对应):
1 | { |
创建Beans
spring 容器初始化,自动扫描,去初始化Bean,加载进Environment,后面调用的直接自动装配(Autowired);
1 | package com.devframe.util; |
@Bean
注解方法的返回值,将注入到容器中,可以使用自动装配。
测试
直接使用spring-test 的JUnit4 单元测试;
直接装配Bean ,来输出它的属性,查看是否装配成功。
1 | package com.devframe.util; |
测试结果:
1 | Use '@Configuration' autowired beans : PersonCfg{name='wuwii', age=23, city='WuHan', contacts=[Contact{phone='18772383543', email='[email protected]'}, Contact{phone='12345678912', email='[email protected]'}], hobby=[骑行, 跑步]} |
读取properties 文件的属性注入Bean
上面的的方法中除了测试类的方法相同而已,为了方便其余都有改动;
首先实体类,通过构造方法传入值
1 | package com.devframe.util; |
配置文件
由于properties 文件不能写 只能写那些单一属性,数组和对象需要自己设置规则,去后台解析出来使用。
创建person.properties
文件:
1 | name=wuwii |
创建Bean
通过@Configuration完成spring 初始化,设置@PropertySource,读取配置文件:
1 | package com.devframe.util; |
测试
最后JUnit4 测试类没变,重新测试,打印出来结果:
1 | Use '@Configuration' autowired beans : PersonCfg{name='wuwii', age=23, city='WuHan', contacts=[Contact{phone='18772383543', email='[email protected]'}, Contact{phone='12345678912', email='[email protected]'}], hobby=[football, running]} |
成功。
补充
20171103 早上来看了下源码:
1 | /** |
在PropertyResolver
接口中发现:
1 | <T> T getProperty(String key, Class<T> targetType); |
这个方法可以直接读取文件内容转换成我们的需要类型,虽然说很好,调试了半天代码不知道properties文件怎么写对象来让它转换,这个以后再看,list列表很好转,将上面的方法加载hobby属性改成这个:
1 | env.getProperty(("age"), Integer.class) |
person文件中hobby属性为:
1 | hobby=running,football |
执行结果:
1 | Use '@Configuration' autowired beans : PersonCfg{name='wuwii', age=23, city='WuHan', contacts=[Contact{phone='18772383543', email='[email protected]'}, Contact{phone='12345678912', email='[email protected]'}], hobby=[running, football]} |
没问题
直接使用@Value占位符注入
方法一
使用@Component
方式注入,需要再applicationContext.xml中引入properties文件:
1 | <!-- 参数占位符 --> |
改下实体类,直接在属性上注入@Value
,占位符符号${ }
1 | package com.devframe.util; |
测试结果:
1 | Use '@Configuration' autowired beans : PersonCfg{name='wuwii', age=23, city='WuHan', contacts=null, hobby=[running,football]} |
发现数组列表也能直接注入。
方法二
在配置类中设置引入配置文件,还需引入占位符,等价于XML中的<context:property-placeholder/>
配置。
1 |
|
就可以在类中的属性上使用@Value占位符 注入了。
总结
- 还可以读取xml文件进行装配,当然也不使用配置文件,直接在Beans的
@Value
注解上写出需要注解的值,但是那样后期部署修改起来麻烦。 - 常用的应该时这么两个 比较好,properties 可能用的多点吧;因为平时使用这个外部需要修改的参数 的基本都是一些常量,不会存在这么多转换,这个只是我的测试的代码,所以有一些鬼转换。
- 还有我使用properties 中为什么没使用中文,因为乱码了。尴尬。这是需要注意的地方,因为电脑默认编码是gbk,但是读的时候,又没有设置编码。解决办法:在读取properties文件的工具类上,加上指定编码格式
utf-8
:1
2
3
4
5URL url = PropertyUtil.class.getResource("/config.properties");
FileInputStream in = new FileInputStream(url.getPath());
//这段代码不是 以前的 PROP.load(in);
PROP.load(new InputStreamReader(in, "utf-8"));
in.close();