spring基础
DI依赖注入是IoC控制反转思想的实现,可以通过set注入和构造器注入两种方法,将对象的创建和对象依赖关系的维护交给spring容器来处理
本章内容对set相关注入进行介绍和代码范例展示
set注入
方法名要符合spring规范:set+首字母大写+字符串。例如
setOrderBean(),在xml文件中声明定义Bean:<bean id = "orderBean" class = "setOrderBean方法所在的类路径"></bean>通过外部Bean或内部Bean来引入其他对象
外部Bean:
<bean id = "orderDaoBean" class = "orderDao的路径"></bean> <bean id = "orderBean" class = "setOrderBean方法所在的类路径"> <property name = "orderDao" ref = "orderDaoBean" ></property> </bean>内部Bean:
<bean id = "orderBean" class = "setOrderBean方法所在的类路径"> <property name = "orderDao"> <bean class = "orderDao的路径"></bean> </property> </bean>简单类型的注入
若对象的引用为简单类型,则用value替换ref
<bean id = "orderBean" class = "setOrderBean方法所在的类路径"> <property name = "userName" value = "李四" ></property> <property name = "age" value = "20"></property> </bean>是否为简单类型可以通过**
BeanUtils.isSimpleValueType()**方法来判断源码如下所示:可清晰看出哪些类被定义为简单类型
public static boolean isSimpleValueType(Class<?> clazz) {
return ClassUtils.isPrimitiveOrWrapper(clazz) ||
Enum.class.isAssignableFrom(clazz) ||
CharSequence.class.isAssignableFrom(clazz) ||
Number.class.isAssignableFrom(clazz) ||
Date.class.isAssignableFrom(clazz) ||
URI.class == clazz ||
URL.class == clazz ||
Locale.class == clazz ||
Class.class == clazz;
}
注意:若把Date当作简单类型,用value赋值时必须注意日期字符串的格式要求:Wed Oct 29 16:00:26 CST 2022d
因此,为了避免赋值的过程过于繁琐,可以用ref对Date类型进行赋值
级联注入
条件:
1.使用级联属性赋值,必须同时设置了getter和setter方法
2.配置的顺序不能颠倒
例如 :A类如下
private name;
private B b_instance;
...
public void setBBean(B b_instance){
this.b_instance = b_instance;
}
public B getBBean(){
return b_instance;
}
...
xml文件如下
<bean id="aBean" class="com.lxy.spring.bean.A">
<property name="name" value="nameOfA"></property>
<property name="b_instance" ref="bBean"></property>
<property name="b_instance.location" value="locationOfB" ></property>
</bean>
<bean id="bBean" class="com.lxy.spring.bean.B"></bean>
级联赋值通过getter方法获得b的实例化对象后,通过value给b的location属性赋值
数组注入
- 简单类型
使用<array>和<value>进行赋值
<bean id="orderBean" class="com.lxy.spring.bean.orderBean">
<property name="orderList">
<array>
<value>电脑</value>
<value>空调</value>
<value>手机</value>
</array>
</property>
</bean>
非简单类型进行ref赋值
使用
<array>和<ref bean=""/>进行赋值
<bean id="iphone6" class="com.lxy.spring.bean.IphoneType">
<property name="name" value="iphone6"></property>
</bean>
<bean id="iphone7" class="com.lxy.spring.bean.IphoneType">
<property name="name" value="iphone7"></property>
</bean>
<bean id="iphone8" class="com.lxy.spring.bean.IphoneType">
<property name="name" value="iphone8"></property>
</bean>
<bean id="orderBean" class="com.lxy.spring.bean.orderBean">
<property name="orderList">
<array>
<ref bean="iphone6" />
<ref bean="iphone7" />
<ref bean="iphone8" />
</array>
</property>
</bean>
List&Set&Map集合注入
<bean id="orderBean" class="com.lxy.spring.bean.orderBean">
<property name="orderList">
<!--List集合有序可重复-->
<list>
<value>电脑</value>
<value>空调</value>
<value>手机</value>
<value>电脑</value>
<value>空调</value>
<value>手机</value>
</list>
</property>
<property name="orderSet">
<!--set集合无序不可重复-->
<set>
<value>电脑</value>
<value>空调</value>
<value>手机</value>
<value>电脑</value>
<value>空调</value>
<value>手机</value>
</set>
</property>
<property name="orderMap">
<!--注入Map集合-->
<map>
<entry key="1" value="电脑1"/>
<entry key="2" value="电脑2"/>
<entry key="3" value="电脑3"/>
</map>
</property>
<!--若为非简单类型,则用<entry key-ref="" value-ref=""/>-->
<property name="orderMap_ref">
<map>
<entry key-ref="k1Bean" value-ref="val1Bean"/>
<entry key-ref="k2Bean" value-ref="val2Bean"/>
<entry key-ref="K3Bean" value-ref="val3Bean"/>
</map>
</property>
</bean>
Properties注入
<bean id="orderBean" class="com.lxy.spring.bean.orderBean">
<property name="orderList">
<props>
<prop key="driver">com.mysql.cj.jdbc.Driver</prop>
<prop key="url">jdbc:mysql://localhost:3306/spring</prop>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
null 和空字符串注入
手动注入null
<property name="name"> <null/> </property>默认注入null
<!--不给属性注入,则属性的默认值为null-->
<!--<property name="name" value="lxy"></property>-->
空字符串注入
<property name="name" value=""/> <!--或是--> <property name="name"> <value/> </property>
特殊字符注入(< , >, …)
方法一:使用实体符号代替特殊符号
实体符号 显示结果 描述   半个空白位   一个空白位 不断行的空白 < < 小于号或显示标记 > > 大于号或显示标记 & & 可用于显示其它特殊字符 " “ 引号 ® ® 已注册 © © 版权 ™ ™ 商标 方法二:使用
<![CDATA[ ]]><property name="name"> <!--注意只能使用value标签,不可以用value属性--> <value><![CDATA[2<3]]></value> </property>
版权声明:本文为wondersfan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。