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>
|