spring 二ioc di

spring一 简介
spring三 bean的生命周期以及作用域
spring四 aop


spring的核心就是ioc和di,对于这两个概念我们这里还是再给出一遍或者可以看spring一 简介。

ioc(inverse of control) 控制反转,我们现在的创建对象实例都是通过new来创建,这样这个对象的创建权在于程序,但在spring中这个创建权给了spring,由spring来创建对象,这就是控制反转。

di(dependency injection)依赖注入,依赖注入就是在创建对象的时候注入对象的属性值。

对于ioc的理解,通过spring一的例子(创建对象的过程)应该有了一定的了解,那么我们我们就通过上次的module来看看ioc。


ioc 控制反转

我们在Test.java中通过new来创建一个对象,并通过set方法赋予name值。

public static void main(String[] args){
        FirstDemo firstDemo = new FirstDemo();
        firstDemo.setDemoName("普通demoName");
        firstDemo.printName();
}

这个方法应该都没问题,那么我们接下来用spring配置bean的方法取得对象。
在applicationContext.xml中配置bean


     

id就是我们spring创建的对象的名称,后面在获取对象的时候通过getBean("id")方法获取到我们的对象。class是我们的类,指定这个bean创建的是哪个对象。property是我们的属性值,这里可以赋予类中指定属性的值,name指定类中的哪个属性,value就是赋予的值(value可以用ref替换,ref将会在di介绍里出现)。比如我们这里,创建一个名为firstDemo的FirstDemo对象,该对象的demoName值为springName。bean就创建好了,接下来去获取。

public static void main(String[] args){
     //获取spring容器的对象
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    //取到对象
    FirstDemo firstDemo = (FirstDemo) applicationContext.getBean("firstDemo");
    //执行方法
    firstDemo.printName();
}

这里没什么好说的,看注释就行。
这样我们也可以得到对象并执行对象的方法,现在再回想一下ioc的定义(控制反转),对象的创建权是不是交给了spring了。

di 依赖注入

至于依赖注入,其实我们已经接触到了,比如上面我们在配置bean的时候,properties不就对一个属性注入了一个值吗。那么怎么来看这个依赖。
我们在springDemo下新建一个module,取名为di。


spring 二ioc di_第1张图片
di

创建如图的项目结构,demo包下新建三个java文件,firstDemo和secondDemo里面有两个属性,name和thirdDemo。

public class FirstDemo {

    private String name;

    private ThirdDemo td;

    public String getName() {
        return name;
    }

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

    public ThirdDemo getTd() {
        return td;
    }

    public void setTd(ThirdDemo td) {
        this.td = td;
    }

    public void printName(){
        System.out.println("名字是 " + name);
        td.printName();
    }
}

而thirdDemo只有name属性。最主要来看bean的配置。


   
   



    



    

这里我们给firstDemo两个属性值都注入了值,而secondDemo只注入了name值,这样也就意味着secondDemo并没有拿到thirdDemo的对象也就不能调用thirdDemo的方法。而我们的firstDemo注入了thirdDemo对象,通过ref来进行注入,属性的值是一个具体对象的我们就要通过ref来注入。现在我们就可以说firstDemo依赖与thirdDemo了,你现在能删thirdDemo这个bean吗,不能。因为有一个对象在创建时需要将thirdDemo对象实例注入给他的属性,我们现在就可以说firstDemo依赖于thirdDemo了。通过test.java就可以看出确实firstDemo拿到了thirdDemo对象而secondDemo并没有拿到。


spring 二ioc di_第2张图片
test

下面说三个不是很确定的点,都是我自己这么认为的,不知道对错。
1 spring如何通过配置创建我们想要得到的实例
通过java的反射机制来创建这些的bean实例
2 注入是通过bean的set方法注入的
当我们不写属性的set方法时我们是注入不进去属性值的
3 applicationContext这个容器到底是什么样的,可以让我们拿到bean
他应该像是一个hash表,有一个key和value,我们通过key值来取得value。

源码地址:springDemo

你可能感兴趣的:(spring 二ioc di)