1.IOC和DI概述

IOC(Inversion of Control):其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式。
DI(Dependency Injection) — IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入. 相对于 IOC 而言,这种表述更直接。

2.基于 文件的方式配置Bean

1

2

3

<bean id=\"helloworld\" class=\"com.java.spring.HelloWorld\">

  <property name=\"name\" value=\"koala\"></property>

</bean>

id:Bean的名称,在IOC容器中必须是惟一的。

3.获取Bean

Spring提供的最常用的IOC容器实现是ApplicationContext,ApplicationContext的主要实现类ClassPath ApplicationContext从类路径下加载配置文件。

创建Spring的IOC对象:

1

ApplicationContext ctx=new ClassPath ApplicationContext(\"applicationContext. \");

从IOC容器中获取Bean:调用ApplicationContext的getBean()方法。

1

HelloWorld helloWorld=(HelloWorld) ctx.getBean(\"helloworld\");

4.Spring依赖注入的方式

4.1 属性注入

属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象。使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值,是最常用的注入方式。

例如:

1

2

3

<bean id=\"helloworld\" class=\"com.java.spring.HelloWorld\">

  <property name=\"name\" value=\"koala\"></property>

</bean>

4.2 构造方法注入

通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中没有 name 属性。

Car.java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

package com.java.spring;

 

public class Car {

    private String brand;

    private String corp;

    private double price;

    private int maxSpeed;

    public Car(String brand, String corp, double price) {

        super();

        this.brand = brand;

        this.corp = corp;

        this.price = price;

    }

    public Car(String brand, String corp, int maxSpeed) {

        super();

        this.brand = brand;

        this.corp = corp;

        this.maxSpeed = maxSpeed;

    }

    @Override

    public String toString() {

        return \"Car [brand=\" + brand + \", corp=\" + corp + \", price=\" + price + \", maxSpeed=\" + maxSpeed + \"]\";

    }

}

4.2.1 按索引匹配入参

在 中设置:

1

2

3

4

5

<bean id=\"car\" class=\"com.java.spring.Car\">

  <constructor-arg value=\"Audi\" index=\"0\"></constructor-arg>

  <constructor-arg value=\"上海\" index=\"1\"></constructor-arg>

  <constructor-arg value=\"500000.0000\" index=\"2\"></constructor-arg>

</bean>

主方法中获取Bean实例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

package com.java.spring;

 

import org.spring work.context.ApplicationContext;

import org.spring work.context.support.ClassPath ApplicationContext;

 

public class Main {

 

    public static void main(String[] args){

        //1.创建spring的IOC对象

        ApplicationContext ctx=new ClassPath ApplicationContext(\"applicationContext. \");

        //2.从IOC容器中获取bean实例

        Car car=(Car) ctx.getBean(\"car\");

        System.out.println(car);

    }

}

运行后输出:

1

Car [brand=Audi, corp=上海, price=500000.0, maxSpeed=0]

4.2.2 按类型匹配入参

在 中设置:

1

2

3

4

5

<bean id=\"car2\" class=\"com.java.spring.Car\">

  <constructor-arg value=\"Audi\" type=\"String\"></constructor-arg>

  <constructor-arg value=\"长春一汽\" type=\"String\"></constructor-arg>

  <constructor-arg value=\"240\" type=\"int\"></constructor-arg>

</bean>

也可以使用<value></value>子节点进行赋值:

1

2

3

4

5

6

7

<bean id=\"car2\" class=\"com.java.spring.Car\">

  <constructor-arg value=\"Audi\" type=\"String\"></constructor-arg>

  <constructor-arg value=\"长春一汽\" type=\"String\"></constructor-arg>

  <constructor-arg type=\"int\">

    <value>240</value>

  </constructor-arg>

</bean>

主方法中获取Bean实例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

package com.java.spring;

 

import org.spring work.context.ApplicationContext;

import org.spring work.context.support.ClassPath ApplicationContext;

 

public class Main {

 

    public static void main(String[] args){

        //1.创建spring的IOC对象

        ApplicationContext ctx=new ClassPath ApplicationContext(\"applicationContext. \");

        //2.从IOC容器中获取bean实例

        Car car=(Car) ctx.getBean(\"car2\");

        System.out.println(car);

    }

}

运行后输出:

1

Car [brand=Audi, corp=长春一汽, price=0.0, maxSpeed=240]

5.引用其他Bean

5.1 ref引用

组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能.。要使 Bean 能够相互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用。在 Bean 的配置文件中, 可以通过 <ref> 元素或 ref  属性为 Bean 的属性或构造器参数指定对 Bean 的引用。

新建一个Person类Person.java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

package com.java.spring;

 

public class Person {

    private String name;

    private int age;

    private Car car;

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    public Car getCar() {

        return car;

    }

    public void setCar(Car car) {

        this.car = car;

    }

    @Override

    public String toString() {

        return \"Person [name=\" + name + \", age=\" + age + \", car=\" + car + \"]\";

    }

}

在 中进行配置:(value的值只能为字面值,即基本数据类型及其封装类,String等类型,Car非字面值,需通过ref引用其他bean)

1

2

3

4

5

<bean id=\"person\" class=\"com.java.spring.Person\">

  <property name=\"name\" value=\"Tom\"></property>

  <property name=\"age\" value=\"23\"></property>

  <property name=\"car\" ref=\"car\"></property>

</bean>

收藏 打印