Spring依赖注入(4)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ymaini/article/details/82259425

介绍

文本主要介绍前文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代码

https://github.com/yangbigmeng/notepad

参考

Spring In Action(第四版). 第三章

猜你喜欢

转载自blog.csdn.net/ymaini/article/details/82259425