篇幅有限,所以就分开写了,本节说下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); } }
知道如何配置了,但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”命名规范。 或 1
以上两种方式都可以,从配置来看第一种更简洁。注意此处“value”中指定的全是字符串,由Spring容器将此字符串转换成属性所需要的类型,如果转换出错,将抛出相应的异常。 Spring容器目前能对各种基本类型把配置的String参数转换为需要的类型。 注:Spring类型转换系统对于boolean类型进行了容错处理,除了可以使用“true/false”标准的Java值进行注入,还能使用“yes/no”、“on/off”、“1/0”来代表“真/假”,所以大家在学习或工作中遇到这种类似问题不要觉得是人家配置错了,而是Spring容错做的非常好。 用于注入Bean的ID,ID是一个常量不是引用,且类似于注入常量,但提供错误验证功能,首先来看下官方文档上给出的两个例子: 官方的说明: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是否在容器中的一种检查错误的方式)。 然而如果是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>标签含义完全一样,具体配置如下 1 2 3 1 2 3 4 5 6
三、注入字典(Map)类型:字典类型是包含键值对数据的数据结构,需要使用<map>标签来配置注入,其属性“key-type”和“value-type”分别指定“键”和“值”的数据类型,其含义和<list>标签的“value-type”含义一样,并使用<key>子标签来指定键数据,<value>子标签来指定键对应的值数据 四、Properties注入:Spring能注入java.util.Properties类型数据,需要使用<props>标签来配置注入,键和值类型必须是String,子标签<prop key=”键”>值</prop>来指定键值对,具体配置如下: 12sw 2 1=11 2=22, 3=33; 4=44
上面已经介绍了注入常量、集合等基本数据类型和集合数据类型,接下来将介绍注入依赖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 (1)通过” <property>”标签的ref属性来引用其他Bean,这是最简化的配置 (2)通过” <property>”标签的子<ref>标签来引用其他Bean,使用bean属性来指定引用的Bean 三、其他引用方式:除了最基本配置方式以外,Spring还提供了更高级的配置方式<ref parent=””/>: 用于引用父容器中的Bean,不会引用当前容器中的Bean,当然父容器中的Bean和当前容器的Bean是可以重名的,获取顺序是先查找当前容器中的Bean,如果找不到再从父容器找。下面写两个配置文件 childBeanInject.xml
内部Bean就是在<property>或<constructor-arg>内通过<bean>标签定义的Bean,该Bean不管是否指定id或name,该Bean都会有唯一的匿名标识符,而且不能指定别名,该内部Bean对其他外部Bean不可见 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]进行导航,其中“[]”里的是基本类型,无法放置引用类型 参考: