DI

  • 依赖注入:Dependency Injection。它是 spring 框架核心 ioc 的具体实现。
  • 为什么需要DL?
    • 我们的程序在编写时,通过控制反转,把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。
    • ioc 解耦只是降低他们的依赖关系,但不会消除。例如:我们的业务层仍会调用持久层的方法。
    • 那这种业务层和持久层的依赖关系,在使用 spring 之后,就让 spring 来维护了。
    • 简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。

1、构造函数注入(必须为所有参数赋值):

  详情请参考我的上一篇博客:IOC创建对象的方式(基于构造函数的依赖注入)

2、set方法注入(不需要为所有成员赋值):

  只使用setter方法

pojo实体类:

/**
 * @author zhangzhixi
 */
public class Student {
    private String id;
    private String name;
    private List<String> hobbies;
    private Map<String,String> location;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<String> getHobbies() {
        return hobbies;
    }

    public void setHobbies(List<String> hobbies) {
        this.hobbies = hobbies;
    }

    public Map<String, String> getLocation() {
        return location;
    }

    public void setLocation(Map<String, String> location) {
        this.location = location;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", hobbies=" + hobbies +
                ", location=" + location +
                '}';
    }
}

bens.xml:

    <bean id="student" class="com.zhixi.pojo.Student">
        <property name="id" value="2018021506"/>
        <property name="name" value="张志喜"/>
    </bean>

测试类:

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bens.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student.getId()); // 2018021506
        System.out.println(student.getName()); // 张志喜
    }
}

2.1、注入List、Map、Properties

bens.xml:

 

<bean id="student" class="com.zhixi.pojo.Student">
        <property name="hobbies">
            <list>
                <value>抽烟</value>
                <value>喝酒</value>
                <value>烫头</value>
            </list>
        </property>
<property name="location"> <map> <entry key="464300" value="息县"/> <entry key="464000" value="信阳"/> <entry key="450000" value="郑州"/> </map> </property>

<property name="properties"> <props> <prop key="driver">com.mysql.jdbc.Driver</prop> <prop key="url">jdbc:mysql://localhost:3306/mybatis</prop> <prop key="username">root</prop> <prop key="password">zhixi158</prop> </props> </property> </bean>

 

测试类:

 

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bens.xml");
        Student student = (Student) context.getBean("student");

        List<String> hobbies = student.getHobbies();
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }

        Map<String, String> location = student.getLocation();
        System.out.println(location.get("464300"));

        Properties properties = student.getProperties();
        System.out.println(properties.getProperty("driver"));
    }
}

输出结果:

抽烟
喝酒
烫头
息县
com.mysql.jdbc.Driver

 或者直接在测试类中对student.toString

Student{id='null', name='null', hobbies=[抽烟, 喝酒, 烫头], location={464300=息县, 464000=信阳, 450000=郑州}, properties={password=zhixi158, url=jdbc:mysql://localhost:3306/mybatis, driver=com.mysql.jdbc.Driver, username=root}}