1. 什么是 Spring
- Spring 是 Java 应用最广的轻量级开源框架,它的成功来源于理念,而不是技术本身,它的理念包括IoC(Inversion of Control,控制反转) 和 AOP(Aspect Oriented Programming,面向切面编程)。
2. 对 IoC 的理解
- IoC - Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在 Java 开发中,IoC 意味着将原本在程序中手动创建对象的控制权,交给了 Spring 框架来管理。
- 正控:若要使用某个对象,需要自己负责创建对象,即我们经常写的
“new Object()”
。 - 反控:若要使用某个对象,Spring 容器会帮忙创建,我们只需从容器中获取需要使用的对象,无需关心对象的创建过程。
- 好莱坞法则:Don’t call me ,I’ll call you
- 正控:若要使用某个对象,需要自己负责创建对象,即我们经常写的
- 作用:降低程序之间的耦合(依赖关系)
- 我们通过一个模拟添加用户的简单案例来进一步了解
- 导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
- 创建 dao 层接口和实现类
public interface UserDao {
void saveUser();
}
public class UserDaoImpl implements UserDao {
@Override
//模拟保存用户
public void saveUser() {
System.out.println("保存用户到数据库");
}
}
- 编写
applicationContext.xml
配置文件
<?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">
<!-- 把对象的创建交由 Spring 来管理 -->
<bean id="userDao" class="com.hn.dao.impl.UserDaoImpl"></bean>
</beans>
- 编写测试类模拟 service 层获取 dao 层对象
public class SpringTest {
public static void main(String[] args) {
//获取核心容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
/*以往的方式
UserDao us = new UserDaoImpl();*/
//根据 id 获取依赖对象
UserDao us = (UserDao) ac.getBean("userDao");
System.out.println(us);
//执行依赖对象保存用户方法
us.saveUser();
}
}
-
运行测试类,可以正常拿到 xml 配置的 bean
-
总结
传统方式:通过new
关键字主动创建一个对象
IoC方式:Spring 帮你创建了对象并保存在一个“容器”中,需要时直接从容器里拿。
3. 对 DI 的理解
- DI - Dependency Injection,即“依赖注入”:由容器动态的将某个依赖关系注入到组件之中,是 Spring 框架核心 IoC 的具体实现.。
- 继续上面的例子,在接口实现类中添加属性;
public class UserDaoImpl implements UserDao {
private String name;
private Date time;
/* setter and getter */
@Override
public void saveUser() {
System.out.println("保存用户到数据库");
System.out.println("名称:" + getName() + ",保存时间:" + getTime());
}
}
- 修改
applicationContext.xml
配置文件
<!-- 把对象的创建交由 Spring 来管理 -->
<bean id="userDao" class="com.hn.dao.impl.UserDaoImpl">
<!-- 设值注入 -->
<property name="name" value="张三"></property>
<property name="time" ref="time"></property>
</bean>
<!-- 配置一个日期对象用于注入到 useDao 中 -->
<bean id="time" class="java.util.Date"></bean>
</beans>
- 运行测试类
- 总结:
在 Spring 中实现“控制反转”的是 IoC 容器,其实现方法是“依赖注入”。
IoC 和 DI 其实是同一个概念的不同角度描述,DI 相对 IoC 而言,“依赖注入”明确描述了“被注入对象 依赖 IoC 容器配置 依赖对象”。