本文最后更新于131 天前,其中的信息可能已经过时,如有错误请发送邮件到3368129372@qq.com
spring
- 是什么?
- 是一个生态,可以构建java应用所需的一切设施
- 轻量开源容器框架
- 解决逻辑层与其他层直接耦合问题
IOC
-
实现?
-
工厂+反射(依赖注入)
public class Main { public static void main(String[] args) { Bean bean = Main.getBean(""); } public static Bean getBean(String beanPath){ Bean bean=null; try{ bean = (Bean) Class.forName(beanPath).newInstance(); }catch (Exception e){ e.printStackTrace(); } return bean; } }
-
- 加载过程
- new ApplicationContext(或者其实现类)
- 概念态(配置文件)转变为定义态(beanDefination)
- 调用newInstance()获取其对象(纯净态,里面属性未赋值)
- 依赖注入,成熟态
AOP
- 连接点(被增强的业务方法)
- 切面
- 通知(after、before、around)
- 切点
bean
- bean安全性
单例bean一般是线程安全的(注入的是无状态的),但里面的成员变量不是 - beanFactory?
非常顶层的核心接口,简单工厂,用于生产bean - applicationContext?
beanFacory的一个实现类,都可以作为容器。它做得更多!!创建bean的同时会帮我们把bean注册为beanDefinition,加载环境变量,实现多语言等等,主要用的这个来生产 - beanDefinition?
bean的定义信息,包括类路径、是否单例、是否懒加载、是否是抽象的、是否自动装配,读取后交给BeanFactory - Bean
周期
bean 的⽣命周期有五个阶段:
- 实例化:主要是扫描 spring 中的上下⽂和配置(解析和查找)bean 的⼀些扩展配置
- 属性赋值:在这个阶段调⽤ bean 的构造器进⾏实例的创建。setter。构造函数与xml文件实现,使用了BeanFactory与ApplicationText。(依赖注入)
- 先执行aware再执行@PostConstruct
- 初始化:Spring 会调⽤ Bean 实例的 init-method ⽅法,完成⼀些初始化的操作,例如建⽴数据库连接等。
- 使用:这个阶段中,将实例化的 bean 放⼊容器和 spring 的缓存中,此时开发者可以使⽤实例化的 bean
- 销毁:当 spring 的上下⽂关闭时,这些上下⽂的 bean 也会被销毁
- FactoryBean?
一个特殊的bean。是一个接口,但是必须被一个bean实现 - 状态
- 概念态
- 定义态
- 纯净态
- 成熟态
- FactoryBean?
缓存
三级缓存
可解决循环依赖问题,举例:
A<->B
一级缓存存完整对象,二级缓存存代理对象,三级缓存存bean的lambda表达式。A存储时会把完整对象存一级缓存,lambda表达式存三级缓存,并且未完成创建的BEAN会存在一个creatingSet里。B在试图引用A时发现A没创建完,因此用三级缓存的表达式创建对象或代理对象注入到B中,解决了循环依赖问题。
spring mvc
- spring生态的一个组件
- 简化servlet+jsp的开发模式
- 把传统MVE框架里面的Controller控制器做了拆分,分成了前端控制器Dispatcherservlet和后端控制器Controller
- model层拆分成service与数据访问层dao
- 前端支持不同语言,比如velocity、jsp、FreeMark
其他
- 容器
管理着某个对象的生命周期