IOC(控制反转):全称为:Inverse of Control。从字面上理解就是控制反转了,在自身对象中的一个内置对象的控制反转,反转后不再由自己本身的对象进行控制这个内置对象的创建,而是由第三方系统去控制这个内置对象的创建。
DI(依赖注入):全称为Dependency Injection,意思自身对象中的内置对象是通过注入的方式进行创建。
那么IOC和DI这两者又是什么关系呢?
IOC就是一种软件设计思想,DI是这种软件设计思想的一个实现。而Spring中的核心机制就是DI。
IoC
1. 先写一个userDao接口,再写一个实现类实现这个方法。
2. 通过applicationContext.xml文件创建一个id为userDao的Bean。
3. 在测试类中调用say()方法。
public class TestIoC {
public static void main(String[] args) {
//初始化Spring容器,加载配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取userDao实例
UserDao userDao=(UserDao) applicationContext.getBean("userDao");
//调用say()方法
userDao.say();
}
}
其中ClassPathXmlApplicationContext会寻找指定的xml文件,并装载完成xml文件的实例化工作。
创建Spring容器后,通过Object getBean(String name)来获取指定的Bean,需要强制转换。
DI
1. 将id为userDao的Bean实例注入到userService实例。
<bean id="userDao" class="com.woongcha.ioc.UserDaoImpl" />
<!--添加一个id为userService的实例 -->
<bean id="userService" class="com.woongcha.ioc.UserServiceImpl">
<!-- 将id为userDao的Bean实例注入到userService实例中 -->
<property name="userDao" ref="userDao" />
</bean>
</beans>
2. 编写测试类。
public class TestDI {
public static void main(String[] args) {
//初始化Spring容器,加载配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取UserService实例
UserService userService=
(UserService) applicationContext.getBean("userService");
//调用实例中的say()方法
userService.say();
}
}
Spring框架的优点:
1. 降低了组件之间的耦合性。
2. 使应用程序代码对框架的依赖最小化。
3. 提供了对AOP(Aspect Oriented Programming,面向切面编程)的支持。
4. 方便测试Spring程序。
5. 通过配置就可以完成对事务的管理,无需手动编程。
6. 方便集成各种优秀的框架。
7. 提供了封装,使API应用难度降低。