DI
Dependency Injection,翻译,依赖注入。DI是一种常用的IOC实现方式。在第01篇文章中我们知道为了实现的代码之间的解耦和,需要使用接口 + 工厂类 + 反射 + 配置文件
的方式,其中这种方式的IOC就是依赖注入。
反转了谁 & 谁依赖谁
如果理解了Spring的IOC,你会发现解耦和的目的之一就是让所有的类能独立存在(不一定能独立运行)并且交由IOC容器(包括配置文件和解析配置文件的代码)管理。也就是说以前是各类之间相互耦合,类之间是平级关系。现在是IOC容器控制各个类,它的级别高于其他类。所以反转了谁指的是反转了类的控制权,把控制权交给了IOC容器。
如果类A中使用到了类B,我们就说类A依赖于类B。依赖注入指的是注入所依赖的对象,在刚才的例子中就是,把B的实例注入到A中。在第01篇文章中没有依赖注入的体现,不过依赖注入也可以通过反射来完成。
Spring注入属性
接口:UserDao
,类:UserDaoImpl
、Test
,配置文件:applicationContext.xml
public interface UserDao {
public void save();
}
public class UserDaoImpl implements UserDao{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void save() {
System.out.println("My name is " + name);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="UserDao" class="com.spring.firstday.UserDaoImpl">
<property name="name" value="程序员..."></property>
</bean>
</beans>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDaoImpl ud = (UserDaoImpl)ac.getBean("UserDao");
ud.save();
}
/*Console:
* My name is 程序员...
* */
}
工厂
按照第一篇文章所述。所有的实例对象的获取不应该直接new,而是通过某个工厂获取。Spring中的工厂有两个:BeanFactory
和ApplicationContext
。继承关系图如下:
区别是BeanFactory
在获取Bean的时候才会创建类的实例,ApplicationContext
是在配置文件被加载的时候就创建类的实例。有两个实现类:ClassPathXmlApplicationContext
,FileSystemXmlApplicationContext
。前者的路径是相对于项目目录的src,后者是文件系统的绝对路径。