DI的全称是Dependency Injection,中文称之为依赖注入。它与控制反转(IoC)的含义相同,只不过这两个称呼是从两个角度描述的同一个概念
IoC:在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是控制反转
DI:从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调
用者注入了它依赖的实例,这就是Spring的依赖注入
Spring容器会负责控制程序之间的关系,而不是由程序代码直接控制。Spring为我们提供了两种核心容器,分别为BeanFactory和ApplicationContext
创建BeanFactory实例时,需要提供Spring所管理容器的详细配置信息,这些信息通常采用XML文件形式来管理,其加载配置信息的语法如下:
1.BeanFactory创建
BeanFactory beanFactory =
new XmlBeanFactory(new FileSystemResource("F: /applicationContext.xml"));
这种加载方式在实际开发中并不多用,作为了解即可
2.通过ApplicationContext的子类来创建
.ApplicationContext是BeanFactory的子接口,是另一种常用的Spring核心容器。它由org.springframework.context.ApplicationContext接口定义,不仅包含了BeanFactory的所有功能,还添加了对国际化、资源访问、事件传播等方面的支持。创建ApplicationContext接口实例,通常采用两种方法,具体如下:
1. 通过ClassPathXmlApplicationContext创建
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext(String configLocation);
ClassPathXmlApplicationContext会从类路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作
2. 通过FileSystemXmlApplicationContext创建
ApplicationContext applicationContext =
new FileSystemXmlApplicationContext(String configLocation);
FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作
创建Spring容器后,就可以获取Spring容器中的Bean。Spring获取Bean的实例通常采用以下两种方法:
1.Object getBean(String name);根据容器中Bean的id或name来获取指定的Bean,获取之后需要进行强制类型转换
2.<T> T getBean(Class<T> requiredType);根据类的类型来获取Bean的实例。由于此方法为泛型方法,因此在获取Bean之后不需要进行强制类型转换
Springpeiz配置文件
<?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-4.3.xsd">
<bean id="userDao" class="com.itcx.dao.impl.UserDaoImpl" />
<bean id="userService" class="com.itcx.dao.impl.UserDaoImpl">
<property name="userDao" ref="userDao" />
</bean>
</beans>
Spring框架的优点
Spring具有简单、可测试和松耦合等特点。Spring不仅可以用于服务器端开发,也可以应用于任何Java应用的开发中
1,非侵入式设计
2.方便解耦,简化开发
3.支持AOP
4.支持声明事务处理
5.方便程序测试
6.方便集成各种优秀框架
7.降低javaEE API的使用难度