5.DI的配置使用

简介: 篇幅有限,所以就分开写了,本节说下setter注入方式setter注入方式setter注入方式只有一种——根据setter名字进行注入(1)写一个测试类HelloImpl4,包含两个setter方法,“setMess...
篇幅有限,所以就分开写了,本节说下setter注入方式
setter注入方式
setter注入方式只有一种——根据setter名字进行注入
(1)写一个测试类HelloImpl4,包含两个setter方法,“setMessage”和“setIndex”
public class HelloImpl4 implements HelloApi {
    private String message;
    private int index;    
    //需要空的构造器
    public HelloImpl4() {
    }
    public void setMessage(String message) {
        this.message = message;
    }    
    public void setIndex(int index) {
        this.index = index;
    }   
    @Override
    public void sayHello() {
        System.out.println(index + ":" + message);
    }    
}
(2)配置Bean定义,具体配置如下:
<!-- 通过setter方式进行依赖注入 -->
<bean id="bean" class="com.spring.di.HelloImpl4">
    <property name="message" value="Hello World!"/>
    <property name="index" value="1"/>
</bean>
知道如何配置了,但Spring如何知道setter方法?如何将值注入进去的呢?其实方法名是要遵守约定的,setter注入的方法名要遵循“JavaBean getter/setter 方法命名约定”
JavaBean:本质就是一个POJO类,但具有以下限制:
该类必须要有公共的无参构造器,如public HelloImpl4() {};
属性为private访问级别,不建议public,如private String message;
属性必要时通过一组setter(修改器)和getter(访问器)方法来访问;
setter方法,以“set” 开头,后跟首字母大写的属性名,如“setMesssage”,简单属性一般只有一个方法参数,方法返回值通常为“void”;
getter方法,一般属性以“get”开头,对于boolean类型一般以“is”开头,后跟首字母大写的属性名,如 “getMesssage”,“isOk”;
还有一些其他特殊情况,比如属性有连续两个大写字母开头,如“URL”,则setter/getter方为:“setURL” 和“getURL”,其他一些特殊情况请参看“Java Bean”命名规范。
注入常量
注入常量是依赖注入中最简单的。配置方式如下所示:
<property name="message" value="Hello World!"/>
或
<property name="index"><value>1</value></property>
以上两种方式都可以,从配置来看第一种更简洁。注意此处“value”中指定的全是字符串,由Spring容器将此字符串转换成属性所需要的类型,如果转换出错,将抛出相应的异常。
Spring容器目前能对各种基本类型把配置的String参数转换为需要的类型。
注:Spring类型转换系统对于boolean类型进行了容错处理,除了可以使用“true/false”标准的Java值进行注入,还能使用“yes/no”、“on/off”、“1/0”来代表“真/假”,所以大家在学习或工作中遇到这种类似问题不要觉得是人家配置错了,而是Spring容错做的非常好。
注入Bean ID
用于注入Bean的ID,ID是一个常量不是引用,且类似于注入常量,但提供错误验证功能,首先来看下官方文档上给出的两个例子: 
第一个:
<bean id="theTargetBean" class="..."/>
<bean id="theClientBean" class="...">
    <property name="targetName">
        <idref bean="theTargetBean" />
    </property>
</bean>
第二个:
<bean id="theTargetBean" class="..." />
<bean id="client" class="...">
    <property name="targetName" value="theTargetBean" />
</bean>
官方的说明:The above bean definition snippet is exactly equivalent (at runtime) to the following snippet(大概意思:这两个片段配置是等价的在运行的时候).从第二个例子可以看出来targetName注入的是“theTargetBean”字符串。那么idref的作用是什么?同样看下官方给出的说明:The idref element is simply an error-proof way to pass the id (string value - not a reference) of another bean in the container to a or element.(通过或者注入bean的时候通过idref来检查注入的bean是否在容器中的一种检查错误的方式)。
<bean id="theTargetBean" class="..."/>
<bean id="theClientBean" class="...">
    <property name="targetName">
        <ref bean="theTargetBean" />
    </property>
</bean>
然而如果是ref标签那么就是注入”theTargetBean”实例。 两者的区别就是ref注入的是bean的实例, idref注入的是string。
注入集合、数组和字典
Spring不仅能注入简单类型数据,还能注入集合(Collection、无序集合Set、有序集合List)类型、数组(Array)类型、字典(Map)类型数据、Properties类型数据,接下来就让我们一个个看看如何注入这些数据类型的数据。
一、注入集合类型:包括Collection类型、Set类型、List类型数据:
(1)List类型:需要使用<list>标签来配置注入,“value-type”属性(可选),表示列表中条目的数据类型,默认为String类型,也可以使用泛型,Spring能根据泛型数据自动检测到List的数据类型
(2)Set类型:需要使用<set>标签来配置注入,其配置参数及含义和<lsit>标签完全一样
(3)Collection类型:因为Collection类型是Set和List类型的基类型,所以使用<set>或<list>标签都可以进行注入,配置方式完全和以上配置方式一样,只是将测试类属性改成“Collection”类型
二、注入数组类型:需要使用<array>标签来配置注入,其中标签属性“value-type”和“merge”和<list>标签含义完全一样,具体配置如下
<bean id="arrayBean" class="com.spring.di.bean.ArrayTestBean">
    <property name="array">
        <!--一维数组注入-->
        <array value-type="java.lang.String" merge="default">
            <value>1</value>
            <value>2</value>
            <value>3</value>
        </array>
    </property>
    
    <property name="array2">
        <!--二维数组注入-->
        <array>
            <array>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </array>
            <array>
                <value>4</value>
                <value>5</value>
                <value>6</value>
            </array>
        </array>
        
    </property>
</bean>
三、注入字典(Map)类型:字典类型是包含键值对数据的数据结构,需要使用<map>标签来配置注入,其属性“key-type”和“value-type”分别指定“键”和“值”的数据类型,其含义和<list>标签的“value-type”含义一样,并使用<key>子标签来指定键数据,<value>子标签来指定键对应的值数据
四、Properties注入:Spring能注入java.util.Properties类型数据,需要使用<props>标签来配置注入,键和值类型必须是String,子标签<prop key=”键”>值</prop>来指定键值对,具体配置如下:
<bean id="propertiesBean" class="com.spring.di.bean.PropertiesTestBean">
    <property name="values">
        <!--value-type属性并不起作用,Prpperties键和值全是String类型-->
        <props value-type="int" merge="default">
            <prop key="1">12sw</prop>
            <prop key="2">2</prop>
        </props>
    </property>
</bean>

<bean id="propertiesBean2" class="com.spring.di.bean.PropertiesTestBean">
    <property name="values">
        <!--分隔符可以是“换行”、“;”、“,”,推荐使用第一种方式-->
        <value>
           1=11
           2=22,
           3=33;
           4=44
        </value>   
    </property>
</bean>
引用其它Bean
上面已经介绍了注入常量、集合等基本数据类型和集合数据类型,接下来将介绍注入依赖Bean及注入内部Bean。
引用其他Bean的步骤与注入常量的步骤一样,可以通过构造器注入及setter注入引用其他Bean,只是引用其他Bean的注入配置稍微变化了一下:可以将“<constructor-arg index="0" value="Hello World!"/>”和“<property name="message" value="Hello World!"/>”中的value属性替换成bean属性,其中bean属性指定配置文件中的其他Bean的id或别名。另一种是把<value>标签替换为<ref bean=”beanName”>,bean属性也是指定配置文件中的其他Bean的id或别名。
一、构造器注入方式:
(1)通过” <constructor-arg>”标签的ref属性来引用其他Bean,这是最简化的配置
(2)通过” <constructor-arg>”标签的子<ref>标签来引用其他Bean,使用bean属性来指定引用的Bean
二、setter注入方式:
(1)通过” <property>”标签的ref属性来引用其他Bean,这是最简化的配置
(2)通过” <property>”标签的子<ref>标签来引用其他Bean,使用bean属性来指定引用的Bean
三、其他引用方式:除了最基本配置方式以外,Spring还提供了更高级的配置方式<ref parent=””/>:
用于引用父容器中的Bean,不会引用当前容器中的Bean,当然父容器中的Bean和当前容器的Bean是可以重名的,获取顺序是先查找当前容器中的Bean,如果找不到再从父容器找。下面写两个配置文件
parentBeanInject.xml
<!--注意此处可能子容器也定义一个该Bean-->
<bean id="helloApi" class="com.spring.di.HelloImpl4">
    <property name="index" value="1"/>
    <property name="message" value="Hello Parent!"/>
</bean>
childBeanInject.xml
<!-- 注意父容器中也定义了id 为 helloApi的Bean -->
<bean id="helloApi" class="com.spring.di.HelloImpl4">
    <property name="index" value="2"/>
    <property name="message" value="Hello Local!"/>
</bean>
<!-- 通过parent注入 -->
<bean id="bean1" class="com.spring.di.bean.HelloApiDecorator">
    <property name="helloApi"><ref parent="helloApi"/></property>
</bean>
内部Bean定义
内部Bean就是在<property>或<constructor-arg>内通过<bean>标签定义的Bean,该Bean不管是否指定id或name,该Bean都会有唯一的匿名标识符,而且不能指定别名,该内部Bean对其他外部Bean不可见
处理null值
Spring通过<value>标签或value属性注入常量值,所有注入的数据都是字符串。所以Spring通过<null/>标签注入null值。

对象图导航注入支持
所谓对象图导航是指类似a.b.c这种点缀访问形式的访问或修改值。Spring支持对象图导航方式依赖注入。对象图导航依赖注入有一个限制就是比如a.b.c对象导航图注入中a和b必须为非null值才能注入c,否则将抛出空指针异常。
Spring不仅支持对象的导航,还支持数组、列表、字典、Properties数据类型的导航,对Set数据类型无法支持,因为无法导航。
数组和列表数据类型可以用array[0]、list[1]导航,注意”[]”里的必须是数字,因为是按照索引进行导航,对于数组类型注意不要数组越界错误。
字典Map数据类型可以使用map[1]、map[str]进行导航,其中“[]”里的是基本类型,无法放置引用类型

参考:


相关文章
|
算法 Java 关系型数据库
Springboot yml配置参数加密 ,jasypt自定义解密器(拓展篇)
Springboot yml配置参数加密 ,jasypt自定义解密器(拓展篇)
1026 0
Springboot yml配置参数加密 ,jasypt自定义解密器(拓展篇)
|
4月前
|
Java 数据库连接 容器
SpringBoot之IOC&DI的详细解析
SpringBoot之IOC&DI的详细解析
40 0
SpringBoot之IOC&DI的详细解析
|
4月前
|
XML 设计模式 Java
springboot创建并配置环境3 - 配置扩展属性(下)
springboot创建并配置环境3 - 配置扩展属性(下)
springboot创建并配置环境3 - 配置扩展属性(下)
|
4月前
|
Java
SpringBoot利用外部配置,来设置jar包运行配置
SpringBoot利用外部配置,来设置jar包运行配置
68 0
|
12月前
|
Java 容器
SpringBoot中的yml文件中读取自定义配置信息
SpringBoot中的yml文件中读取自定义配置信息
147 0
|
Java
SpringBoot 自动配置--常用配置
SpringBoot 自动配置--常用配置
103 0
springboot自定义外部扩展文件
在springboot启动的时候调用run方法,可以看到run方法里面的内容,其中有一个getRunListeners方法
|
XML Java 数据格式
Spring-注入参数详解-[简化配置方式]
Spring-注入参数详解-[简化配置方式]
76 0
|
开发框架 Java
5 个 springboot配置文件注入参数说明
5 个 springboot配置文件注入参数说明
482 0
|
Java 容器
SpringBoot手动装配,自定义Enable模块
前面我们介绍了简单详细的SpringBoot自动配置原理解析,今天这篇文章主要是介绍下如何是实现手动配置,自定义Enable模块,
245 0