Spring学习4之依赖注入(DI)

前言

上节学习了IOC创建对象的方式,我们在不知不觉中使用了最简单的构造注入,什么是构造注入,什么又是依赖注入呢?

一、首先我们要了解DI是什么?

创建对象的过程中Spring可以依据配置对象的属性进行设置,这个过程称之为依赖注入,也即DI。
顾名思义,你就会明白构造注入就是通过构造方法给属性进行赋值。

二、DI的几种注入方式

需要用到的实体类:

package com.shan.pojo;

import lombok.Data;
import lombok.ToString;

@Data @ToString
public class Address {
    private String address;
}
package com.shan.pojo;

import lombok.Data;
import lombok.ToString;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
@Data @ToString
public class Student {
    private String name;
    private Address address;
    private String[] books;
    private List<String> hobbies;
    private Map<String,String> card;
    private Set<String> games;
    private String wife;
    private Properties info;
}
package com.shan.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data @ToString @NoArgsConstructor @AllArgsConstructor
public class User {
    private String name;
    private String age;

}

1.普通注入

    <!--普通注入-->
        <property name="name" value="小黑神"/>

2.Bean注入

    <!--Bean注入-->
        <property name="address" ref="address"/>

3.数组注入

    <!--数组注入-->
        <property name="books">
            <array>
                <value>红楼梦</value>
                <value>西游记</value>
                <value>水浒传</value>
                <value>三国演义</value>
            </array>
        </property>

4.List注入

    <!--List集合注入-->
        <property name="hobbies">
            <list>
                <value>女朋友</value>
                <value>敲代码</value>
                <value>刷抖音</value>
                <value>看小说</value>
                <value>玩游戏</value>
            </list>
        </property>

5.Map注入

    <!--Map注入-->
        <property name="card">
            <map>
                <entry key="身份证" value="42102220001002xxxx"/>
                <entry key="学生证" value="18103020134"/>
                <entry key="银行卡" value="666666666666666666"/>
            </map>
        </property>

6.Set注入

    <!--Set集合注入-->
        <property name="games">
            <set>
                <value>lol</value>
                <value>coc</value>
                <value>bob</value>
                <value>cs</value>
                <value>永劫无间</value>
            </set>
        </property>

7.null注入

    <!--null注入-->
        <property name="wife">
            <value>null</value>
        </property>

8.Properties注入

        <!--Properties集合注入-->
        <property name="info">
            <props>
                <prop key="学号">18103020134</prop>
                <prop key="性别"></prop>
                <prop key="username">root</prop>
                <prop key="password">xxx</prop>
            </props>
        </property>

拓展注入

<!--拓展注入方式
    p命名空间和c命名空间不能是直接使用,需要导入xml约束!
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:c="http://www.springframework.org/schema/c"
    -->

    <!--p命名空间注入,可以直接注入属性的值:property-->
    <bean id="user" class="com.shan.pojo.User" p:name="小黑神" p:age="18"/>
    <!--c命名空间注入,可以通过构造器注入:construct-args-->
    <bean id="user2" class="com.shan.pojo.User" c:name="小黑神zxs" c:age="18" scope="singleton"/>
    <!--作用域
    scope="singleton" 单例模式 Spring默认
    scope="prototype" 原型模式 每次从容器中get的时候都会产生一个新对象!
    -->

测试

import com.shan.pojo.Student;
import com.shan.pojo.User;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {

    @Test
    public void testStudent(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student);
    }
    @Test
    public void testUser(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("userbean.xml");
        User user = context.getBean("user", User.class);
        User user2 = context.getBean("user2", User.class);
        System.out.println(user);
        System.out.println(user2);
    }
    //User(name=小黑神, age=18)
    //User(name=小黑神zxs, age=18)

}

作者有话说

博客创作不易,希望看到这里的读者动动你的小手点个赞,如果喜欢的小伙伴可以一键三连,作者大大在这里给大家谢谢了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值