介绍
文本主要介绍前文Spring依赖注入(2)的遗留问题
- 类之外属性的注入
- 利用properties文件实现具体值注入
类属性注入
对于bean注入, 除了基本的类的构造之外, 更多的情况是还有类属性需要注入, 如成员变量。这些属性可以是具体的值, 也可以是其他的bean。针对JavaConf和XML 2种情况加以说明。
JavaConf配置
JavaConf本身是类的定义, 与平时类的定义没有区别, 所以在平时构造类使用的方法, 均可以使用。简单示例如下:
...
@Configuration
public class InjectConfig {
...
// JavaConf中定义的一个bean, 通过该类本身的setSeparate设置其成员变量的值
@Bean(name = "encodeUtilsConfig")
public EncodeUtils getEncodeUtils() {
EncodeUtils utils = new EncodeUtils();
String seperate = " ";
utils.setSeparate(seperate);
return utils;
}
...
}
XML配置
相比于JavaConf的属性注入, XML配置相对繁琐一些, 不过也不叫易于理解。XML配置设置属性时, 用到property元素, 另外需保证注入的private属性在bean中有对应的setter方法。 简单示例如下:
<!--定义bean的XML配置-->
<beans .....>
<!--汉字转拼音-->
<bean id="encodeUtils" class="com.notepad.springnote.inject.EncodeUtils">
<!-- vale是加载一个值, ref可以加载一个类或其他bean -->
<!--2个成员变量(String类型)-->
<property name="separate" value="|"/>
<property name="retain" value="false"/>
<!--测试成员变量(List<String>类型)-->
<property name="test">
<list>
<value>here is the test</value>
</list>
</property>
</bean>
</beans>
另外, 我们这里记录的均是一些简单的常用方法, 还有其他很多使用方法, 如XML的命令空间, 构造器注入, 复杂类型的属性注入等,大家可参考末尾的参考文献来更近深入的了解。
利用properties文件注入具体值
对应一些字面值或者一些固定的配置, 我们希望统一到一个配置文件中, 而不是直接配置到JavaConf代码或是XML配置中, 这样可以方便管理并且不需要每次去修改bean的注入。为此可通过properties实现。同样针对针对JavaConf和XML 2种情况加以介绍。
JavaConf配置
对于JavaConf配置, 添加@PropertySource引入properties文件, 默认会加载类路径下resources下的properties文件, 因此如果处于默认加载位置则不需要显示引入。通过@Value和占位符$可完成properties文件中定义变量的加载。示例如下:
resources路径下的properties文件: springnote.properties
#依赖注入配置
inject.separate.default=\u0020
inject.separate=\u0020|\u0020
inject.retain=true
JavaConf使用
@Configuration
@ComponentScan(basePackages = "com.notepad.springnote")
@ImportResource("classpath:inject-bean.xml")
@PropertySource("classpath:springnote.properties")
public class InjectConfig {
@Bean(name = "encodeUtilsConfig")
public EncodeUtils getEncodeUtils() {
EncodeUtils utils = new EncodeUtils();
utils.setSeparate(utilSeparte);
return utils;
}
// 使用properties中的定义的配置
@Value("${inject.separate.default}")
private String utilSeparte;
}
XML配置
XML配置使用properties文件中的配置与JavaConf类似, 只需要在XML配置中配置一个Spring context命名空间中的 context:property-placeholder即可使用占位符, 示例如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--加载properties文件-->
<context:property-placeholder location="classpath:springnote.properties"/>
<!--汉字转拼音: 属性注入-->
<bean id="encodeUtils" class="com.notepad.springnote.inject.EncodeUtils">
<property name="separate" value="${inject.separate}"/>
<property name="retain" value="${inject.retain}"/>
</bean>
</beans>
说明
除了注入基本的字符串, 数值之外, Spring引入了Spring表达式语言(SpEL),可以完成对数值的算术计算,逻辑运算, 正则表达式操作等, 里面涉及的方法和内容较多, 文本不再进行介绍, 具体可参考末尾提供的参考文献。
Github代码
参考
Spring In Action(第四版). 第三章