Spring框架基础(3)----DI依赖注入

DI 依赖注入的xml配置
依赖注入分类
(1)按照注入的方式分类
① set方法注注入:它是通过类成员的set⽅法实现数据的注入(使⽤最多的)。
name:指定注入时调⽤的set⽅法名称。(注:不包含set这三个字⺟,druid连接池指定属性名称)
value:指定注入的数据。它⽀持基本类型和String类型。
ref:指定注⼊的数据。它⽀持其他bean类型。写的是其他bean的唯⼀标识。
注意:该类必须有无参构造方法,避免写了有参构造后不会自动生成无参构造的情况,如果没有无参构造,在IDEA中class属性中的全类名下会有红色波浪线。

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    private int num;
    private String s;

    public UserServiceImpl() {
    }

    public void setNum(int num) {
        this.num = num;
    }

    public void setS(String s) {
        this.s = s;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void save() {
        System.out.println("userService impl running");
    }
}
    <bean id="userDao" class="com.nanmao.dao.impl.UserDaoImpl"/>
    <bean id="userService" class="com.nanmao.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"/>
        <property name="num" value="666"/>
        <property name="s" value="version"/>
    </bean>

② 构造函数注入:顾名思义,就是利⽤带参构造函数实现对类成员的数据赋值。
在使⽤构造函数注⼊时,涉及的标签是 constructor-arg ,该标签有如下属性:
name:用于给构造函数中指定名称的参数赋值。
index:用于给构造函数中指定索引位置的参数赋值。
value:用于指定基本类型或者String类型的数据。
ref:用于指定其他Bean类型的数据。写的是其他bean的唯⼀标识。
注意:类中提供的构造函数参数个数必须和配置的参数个数⼀致,且数据类型匹配。同时需要注意的是,当没有⽆参构造时,则必须提供构造函数参数的注⼊,否则Spring框架会报错。

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    private int num;
    private String s;

    public UserServiceImpl() {
    }
    
    private UserServiceImpl(UserDao userDao , int num , String s){
        this.userDao = userDao;
        this.num = num;
        this.s = s;
    }
    
    @Override
    public void save() {
        System.out.println("userService impl running");
    }
}
    <bean id="userDao" class="com.nanmao.dao.impl.UserDaoImpl"/>
    <bean id="userService" class="com.nanmao.service.impl.UserServiceImpl">
        <!--构造方法注入-->
        <!--index属性从0开始,可以标记参数的顺序-->
        <constructor-arg name="userDao" ref="userDao"/>
        <constructor-arg name="num" value="3333"/>
        <constructor-arg name="s" value="string"/>
    </bean>

(2)按照注入的数据类型分类
① 基本类型和String
注入的数据类型是基本类型或者是字符串类型的数据。
② 其他Bean类型
注⼊的数据类型是对象类型,称为其他Bean的原因是,这个对象是要求出现在IoC容器中的。那么针对当前Bean来说,就是其他Bean了。
③ 复杂类型(集合类型)
注⼊的数据类型是Aarry,List,Set,Map,Properties中的⼀种类型。
下面对于复杂类型,使用set方式注入进行演示。

public class BookDaoImpl implements BookDao {
private int[] arr;
private ArrayList<String> list;
private Properties properties;
private HashSet<String> hs;
private HashMap<String,String> hm;

    public void setArr(int[] arr) {
        this.arr = arr;
    }

    public void setList(ArrayList<String> list) {
        this.list = list;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public void setHs(HashSet<String> hs) {
        this.hs = hs;
    }

    public void setHm(HashMap<String, String> hm) {
        this.hm = hm;
    }

    @Override
    public void save() {
        System.out.println("BookDao running.....");
        System.out.println("ArrayList:" + list);
        for (int i : arr) {
            System.out.println("arr: " + i);
        }
        System.out.println("HashMap: " + hm);
        System.out.println("HashSet: " + hs);
    }
}
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <property name="arr">
            <array>
                <value>111</value>
                <value>222</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>hello</value>
                <value>word</value>
            </list>
        </property>
        <property name="hs">
            <set>
                <value>hello</value>
                <value>word</value>
            </set>
        </property>
        <property name="properties">
            <props>
                <prop key="userName">zhangsan</prop>
                <prop key="password">123456</prop>
            </props>
        </property>
        <property name="hm">
            <map>
                <entry key="StudentName1" value="李四"/>
                <entry key="StudentName2" value="王五"/>
            </map>
        </property>
    </bean>

控制台输出:

BookDao running.....
ArrayList:[hello, word]
arr: 111
arr: 222
HashMap: {StudentName1=李四, StudentName2=王五}
HashSet: [hello, word]

SpringEL表达式
在依赖注入的时候,我们对于其他bean的引入也可以使用value属性,不过属性值要使用SpringEL表达式来表示,即加 “#{ }”。

    <bean id="userService" class="com.nanmao.service.impl.UserServiceImpl">
<!--        <property name="userDao" ref="userDao"/>-->
<!--        <property name="bookDao" ref="bookDao"/>-->
        <!--spEL表达式-->
        <property name="userDao" value="#{userDao}"/>
        <property name="bookDao" value="#{bookDao}"/>
    </bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值