前面的博客大概的讲了1下IOC容器的理解,那末IOC的实现实际上依托于依赖注入的。简单的说就是IOC是1种思想,而依赖注入为这类思想提供了实现。个人是这么理解的。本篇博客介绍两种经常使用的注入方式,和他们的配置(基于XML)。
IOC容器说明
从最近的学习来看,特别是基于XML的配置情势下。IOC容器就是1个生产线,它根据配置中类之间的持有关系,1个部件1个部件的组装成1个完全的产品去履行1个完全的任务。从使用者的方向上看,他只能看到1个入口,而以后的处理他是不知道的。固然,这在没有容器的概念的时候也是1样的。不1样的地方在于,容器是1个装配者只有它知道各个部份之间的关系,它负责将各个部份组合成1个完全的产品。大概是这么个意思:
依赖注入
前面说过控制反转,反转的是创建被调用者的功能被反转了,交给了IOC容器去处理。依赖注入是甚么呢?它就是IOC将被调用者提供给调用者的途径。在运行的时候无需调用者自己创建被动用者,而是IOC容器像打针1样将被调用者注入到调用者中去。那末最经常使用的注入方式有两种:setter方法注入和构造函数注入。
setter方法
即通过set方法注入Bean的属性值或依赖对象。这类方式注入需要提供1个默许的不带参数构造函数。如果没有构造函数,JVM默许提供1个默许的无参构造函数。当自己写了构造函数时,由于JVM不再提供默许的构造函数,因此需要自己写1个不带参数的构造函数。否则抛出异常。
Car类
public class Car {
private String company;
private String brand;
private int maxSpeed;
private float price;
public void setBrand(String brand){
this.brand = brand;
}
public void setMaxSpeed(int maxSpeed){
this.maxSpeed = maxSpeed;
}
public void setPrice(double price){
this.price = price;
}
public void setCompany(String company){
this.company = company;
}
}
配置
<bean id = "car" class="com.tgb.spring.car">
<property name ="brand"><value>迷你</value></property>
<property name ="company"><value>宝马</value></property>
<property name ="price"><value>220000</value></property>
<property name ="maxSpeed"><value>200</value></property>
</bean>
这类方式配置灵活简单,以上也能看出来。这里还需要提1点,通过set方法注入时Spring只会检查bean中是不是存在对应的set方法而不会检查是不是存在对应的变量。只是,良好的习惯起见,通常都定义变量。
构造函数
通过构造函数的方式设置属性的值和依赖对象是除set方法以为比较经常使用的方式了。这里需要提供有参数的构造函数。
car类
public class Car {
private String company;
private String brand;
private int maxSpeed;
private float price;
public Car(String company, String brand, float price) {
super();
this.company = company;
this.brand = brand;
this.price = price;
}
public Car(String company, String brand, int maxSpeed) {
super();
this.company = company;
this.brand = brand;
this.maxSpeed = maxSpeed;
}
public Car(String company, String brand, int maxSpeed, float price) {
super();
this.company = company;
this.brand = brand;
this.maxSpeed = maxSpeed;
this.price = price;
}
}
配置
<bean id="car" class="com.atguigu.spring.helloworld.Car">
<constructor-arg value="KUGA" index="1"></constructor-arg>
<constructor-arg value="ChangAnFord" index="0"></constructor-arg>
<constructor-arg value="250000" type="float"></constructor-arg>
</bean>
这里首先大家注意到bean中有3个带参数的构造函数,另外1个需要注意的地方是配置中引入了index和type两个标签。这里通过你配置的参数个数、参数顺序、参数类型来精肯定位你要使用的是哪个构造函数。这个自己体会1下。
其他
spring提供的配置功能是比较丰富的,处理基本的这些配置以外还有像,内部bean配置、自动装配等1些有趣的配置。