IoC思想的实现:依赖注入(一)


IoC介绍:

IoC是什么?

IoC控制反转(Inversion of control):是一种理论思想。其实就是把对象的创建、赋值和管理交给容器来实现。

为什么要使用IoC?

1、为了使用较少的代码来实现相应的功能

2、解耦合。

IoC的技术实现——依赖注入:在程序中,我们只需要使用对象的名称就可以了,至于对象的创建、赋值都不需要我们管。spring中实现DI(依赖注入)的方式主要有两种:

1、使用XML的方式来实现

2、使用注解的方式

首先:使用XML的方式进行依赖注入

步骤:

1、加spring依赖

2、创建类文件

public class Student {
    private String name;
    private int age;

    public void setName(String name) {
        System.out.println("name: "+name);
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        System.out.println("age:"+age);
        this.age = age;
    }


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

3、创建spring的xml配置文件。


    <bean id="myStudent" class="com.kunkun.spring.ba01.Student">
        <property name="name" value="lisi">property>
        <property name="age" value="20">property>
    bean>
    <bean id="myDate" class="java.util.Date">
        <property name="time" value="923230123">property>
    bean>

4、使用ApplicationContext接口getBean方法来获取配置在bean标签中的对象。

@Test
    public void test(){
        String config = "ba01/applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);
        Student student = (Student) ac.getBean("myStudent");

        System.out.println(student.toString());
        Date date = (Date) ac.getBean("myDate");
        System.out.println(date);
    }

上面介绍的是使用set方法来创建对象(在类中必须要有相应的set方法)。我们同样也可以使用构造放发来给属性赋值:

只需要在上面的第三步中改成:

<bean id="myStudent" class="com.kunkun.spring.ba03.Student">
        <constructor-arg name="name" value="李四lisi">constructor-arg>
        <constructor-arg name="age" value="12">constructor-arg>
        <constructor-arg name="school" ref="school">constructor-arg>
    bean>
    <bean id="school" class="com.kunkun.spring.ba03.School">
        <property name="name" value="北京大学">property>
        <property name="address" value="海淀区">property>
    bean>

上面的代码:其中标签属性ref表示引用类型的属性赋值。ref的值为另一个bean的id。

引用类型的自动注入

两个注入规则:byType和byName。

spring这个框架可以根据默写规则给引用类型自动赋值。
使用的规则最常用的是byName和byType
1、byName:按名称注入。java类中引用类型的属性名,和bean中id的名称一样且数据类型是一致的,这样的话,spring可以给属性自动赋值。
语法:
简单类型属性赋值


2、byType:按类型注入。java中数据类行和配置文件中声明的bean中的class属性是同源关系,自动赋值。
同源的意思就是:
(1)、同一种类型
(2)、Java中是父类,bean是子类。
(3)、java中是接口,bean是接口的实现。
语法:
简单类型属性赋值

1、byName:在bean标签中加入一个autowire的标签属性来确定注入规则。其中school中的id必须和类中的属性是相同的名字。

 2、byType:spring容器会在容器中找到同源的对象(子类、实现类和同类)。如果对象重复,就会报错。

 多个配置文件

优势:每个配置文件都不大,效率高,避免多人竞争一个配置文件带来的冲突。

 上面的配置表示引入以Spring_开头的所有文件,和被注释掉的代码一个意思。

关键字:classpath:表示类路径,在IDEA中类路径表示为tar/classes。