在set注入的大前提一定是javaBean有属性的set方法 不然一切白谈
4.1外部注入
问题来了 什么样的注入可以称之为外部注入?
public class ConstomerService {
private OrderDao orderDao;
//set注入
public void setOrderDao(OrderDao orderDao) {
this.orderDao = orderDao;
}
public void save(){
orderDao.order();
}
对于这样一个java类 如果要用set注入给属性赋值的话可以采用外部注入配置xml文件
<bean id="orderDao" class="com.myStudy.Dao.OrderDao"></bean>
<bean id="constomerService" class="com.myStudy.Service.ConstomerService">
<!-- 第一个name是set方法去掉set首字母小写拼接的
第二个ref就是根据id引用外部bean-->
<property name="orderDao" ref="orderDao"></property>
</bean>
在这之中 先把自定义类通过初始化到IoC容器里
然后通过属性标签配置属性给属性(OrderDao)
- name是set方法去掉set首字母小写
- ref就是所依赖的类 (bean标签里的id)
4.2内部注入
<!-- 内部注入 -->
<!-- 什么是内部注入? 与外部注入不同 内部注入重在在bean内部完成注入-->
<bean id="csService" class="com.myStudy.Service.ConstomerService">
<property name="orderDao" >
<bean class="com.myStudy.Dao.OrderDao"></bean>
</property>
</bean>
<!-- 理解为在属性标签<property>中嵌套一个bean标签 有点像匿名内部类 随用随创建的意思
-->
了解下就可以感觉不怎么常用 还有就是 无论是内部注入还是外部注入 都是单例对象
这意味着每次请求该bean时,Spring容器都会返回同一个实例。
4.3 注入简单类型
4.3.1何为简单类型
看到这个词我第一反应就是在java中的基本数据类型和引用数据类型
我所以为基本数据类型就是简单类型 而引用数据类型就是非简单类型
可在spring里 这一套还行得通么???
我们通过Spring的源码来分析一下:BeanUtils类
public class BeanUtils{
public static boolean isSimpleValueType(Class<?> type) {
return (Void.class != type && void.class != type &&
(ClassUtils.isPrimitiveOrWrapper(type) ||
Enum.class.isAssignableFrom(type) ||
CharSequence.class.isAssignableFrom(type) ||
Number.class.isAssignableFrom(type) ||
Date.class.isAssignableFrom(type) ||
Temporal.class.isAssignableFrom(type) ||
URI.class == type ||
URL.class == type ||
Locale.class == type ||
Class.class == type));
}
//........
}
观察源码我们发现 spring所认为的简单类包括
- 基本数据类型 char int double …
- 基本数据类型的包装类 Integer String Double…
- 枚举类型
- Number子类 如 Integer、Long、Double、Float、Byte、Short等
- CharSequence 子类 如String StringBuffer StringBuilder
- Date 类
- URI类
- URL类
- Locale类
- Call类
- 还包括以上简单类型对应的数组类型
4.3.2如何注入
关于set注入碰到简单类型就是value 如果是非简单类型 那就是ref
可以联想一下
- 简单类型 顾名思义就是简单到可以直接赋值 所以直接value
- 非简单类型 不能直接赋值 需要引入别的依赖 所以就ref
4.3.3 具体实现
<!-- 注入基本数据类型 -->
<bean id="userTest" class="com.Bean.User"></bean>
<bean id="user" class="com.Bean.User">
<property name="name" value="zhangsan"></property>
<property name="passwd" value="123456"></property>
<property name="age" value="17"></property>
<property name="user" ref="userTest"></property>
</bean>
package com.Bean;
public class
User {
private String name;
private String passwd;
private int age;
private User user;
public void setName(String name)
this.name = name;
public void setPasswd(String passwd)
this.passwd = passwd;
public void setAge(int age) {
this.age = age;
}
public void setUser(User user) {
this.user = user;
}
}
通过对比我们就可以看到对于简单类型 value后直接跟上要赋的值就ok了
而非简单类型就需要ref引用别的bean的id才可以
需要注意的是:
- 如果把Date当做简单类型的话,日期字符串格式不能随便写。格式必须符合Date的toString()方法格式。显然这就比较鸡肋了。如果我们提供一个这样的日期字符串:2010-10-11,在这里是无法赋值给Date类型的属性的。
- spring6之后,当注入的是URL,那么这个url字符串是会进行有效性检测的。如果是一个存在的url,那就没问题。如果不存在则报错。
4.4 注入数组
在上节我们知道 如果是简单类型的数组 那也是一个简单类型的数组 如果非简单类型的话 那就是一个非简单类型的数组 那么这两者具体怎么实现呢?
先给一个javabean
public class Man {
private String[] Hobbys;
private Woman[] Womans;
public void setHobbys(String[] hobbys) {
Hobbys = hobbys;
}
public void setWomans(Woman[] womans) {
Womans = womans;
}
@Override
public String toString() {
return "Man{" +
"Hobbys=" + Arrays.toString(Hobbys) +
", Womans=" + Arrays.toString(Womans) +
'}';
}
}
在这个类中
Hobbys是一个String类型的数组 所以是一个简单类型
Woman是一个我们自定义的类 所以Woman对应的数组自然而然是一个非简单类型
观察xml文件来看看二者的区别
<bean id="w1" class="com.Bean.Woman">
<property name="name" value="小明"></property>
</bean>
<bean id="w2" class="com.Bean.Woman">
<property name="name" value="小花"></property>
</bean>
<bean id="w3" class="com.Bean.Woman">
<property name="name" value="小红"></property>
</bean>
从这里开始看^-^
<bean id="man" class="com.Bean.Man">
<!-- 注入简单类型的数组 直接value-->
<property name="hobbys">
<array>
<value>抽烟</value>
<value>喝酒</value>
<value>烫头</value>
</array>
</property>
<!-- 注入其他类型的数组 需要用ref 然后ref里面 属性bean赋值在xml里的具体某个bean的id-->
<property name="womans">
<array>
<ref bean="w1"></ref>
<ref bean="w2"></ref>
<ref bean="w3"></ref>
</array>
</property>
</bean>
我们看到对于一个数组的注入 有一个关键的标签
我们可以简单总结下格式
如果是基本类型直接就 值
如果是非简单类型 用ref标签引用
其实总结来说 就多了一个array的标签 像后续的List Map Set什么的 也都是和数组类似 加了一个List标签…Map标签…Set标签…易如反掌
4.5注入List&Set集合
上一节已经对数组进行了一个总结 那么List想必也没什么问题
但是问题来了 对于简单类型的注入和非简单类型的注入又是否一样呢?
给一个javabean类
public class Person {
private List<String> names;
private List<User> user2List;
private Set<String> hobbys;
private Set<User> user2Set;
public void setUser2List(List<User> user2List) {
this.user2List = user2List;
}
public void setUser2Set(Set<User> user2Set) {
this.user2Set = user2Set;
}
public void setNames(List<String> names) {
this.names = names;
}
public void setHobbys(Set<String> hobbys) {
this.hobbys = hobbys;
}
查看xml文件
<bean id="user2List" class="com.Bean.User"></bean>
<bean id="user2Set" class="com.Bean.User"></bean>
<bean id="person" class="com.Bean.Person">
<!-- 注入list集合-->
<property name="names">
<list>
<value>小明</value>
<value>小花</value>
<value>小兰</value>
</list>
</property>
<!-- 注入非简单类型的list集合-->
<property name="user2List">
<list>
<ref bean="user2List"></ref>
</list>
</property>
<!-- 注入set集合-->
<property name="hobbys">
<set>
<value>唱歌</value>
<value>跳舞</value>
<value>RAP</value>
</set>
</property>
<!-- 注入非简单类型的set集合-->
<property name="user2Set">
<set>
<ref bean="user2Set"></ref>
</set>
</property>
</bean>
这里我们可以看到其实和数组大差不差 唯一区别就是在于标签替换成了和