spring set注入专题

在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>

这里我们可以看到其实和数组大差不差 唯一区别就是在于标签替换成了和

  • 28
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值