Spring学习笔记(一)
学习Spring这段时间,一直有粗略的做着笔记,想根据做的笔记和代码以及阅读的一些博客,把对Spring的理解和一些概念再次记录下来,巩固一下也方便以后回看。
一、Spring简介
- 1、Spring是一个分层的Java SE/EE 应用的全栈轻量级框架。
-
2、两大内核:IOC(控制反转)和AOP(面向切面编程)
二、IOC 控制反转 原理剖析
- 1、先用一组程序创建对象图来了解传统程序和使用IOC/DI容器后的程序在创建对象时的不同操作过程:
- 2、程序代码实现(同个程序中修改)
2.1 传统模式下实现
2.2 可以很明显看出,业务层实现类需要通过new操作符生成持久层对象,用户类需要通过new操作符生成业务层对象,它们之间的耦合度非常高,会导致代码的独立性很差。
2.3 使用BeanFactory和Bean.properties实现
创建配置文件bean.properties (resources文件夹下)
accountDao=com.it.DAO.impl.AccountDaoImpl
accountService=com.it.service.impl.AccountServiceImpl
2.4 新建BeanFactory工厂类反射创建对象
// 定义一个Properties对象
private static final Properties prop;
private static final Map<String, Object> beans;
// 使用静态代码块为Properties对象赋值
static {
// 实例化对象
prop = new Properties();
// 获取properties文件的流对象
// 类加载器
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
try {
prop.load(in);
// 实例化容器
// 避免多例创建对象:
// 定义一个Map,用于存放要创建的对象,称为容器
beans = new HashMap<>();
// 取出配置文件中所有的key
Enumeration<Object> keys = prop.keys();
// 遍历枚举
while (keys.hasMoreElements()) {
// 取出每个key
String key = (String) keys.nextElement();
// 反射创建对象
Object value = Class.forName(prop.getProperty(key)).getDeclaredConstructor().newInstance();
// 把key和value放入容器中
beans.put(key, value);
}
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化properties对象失败");
}finally {
if (in != null) {
try {
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
// 单例设计模式,使用Map作为容器去存储创建的bean对象
// 根据Bean的名称获取相应bean对象
public static Object getBean(String beanName) {
return beans.get(beanName);
}
2.5 调用创建对象
// 创建持久层接口对象
IAccountDao iAccountDao = (IAccountDao) BeanFactory.getBean("accountDao");
// 创建业务层接口对象,执行方法
public static void main(String[] args) {
//IAccountService iAccountService = new AccountServiceImpl();
IAccountService iAccountService = (IAccountService) BeanFactory.getBean("accountService");
iAccountService.saveAccount();
}
使用Properties配置文件和工厂类BeanFactory利用反射机制创建对象,降低程序耦合度。
3、耦合度:即程序间的依赖关系(类之间、方法之间),在实际开发中应该尽量降低程序间的依赖关系,做到编译器不依赖,运行时才依赖;这恰恰就是IOC的作用–解耦。
3.1 解耦思路:
- (1) 使用反射机制来创建对象,避免使用new操作符
- (2) 通过读取配置文件来获取要床架的对象的全限定类名
4、IOC(控制反转),从上述例子可以看出程序创建对象时,程序主动创建则为正转;由IOC容器来查找和注入依赖对象,被动地接受依赖对象,也就是获取依赖对象的方式变为被动了,这就是控制权的反转。
在Spring中实现控制反转的就是IOC容器,实现方法就是依赖注入(DI)。