Spring中的设计模式
- 单例模式: Bean默认作用域为Singleton
- 工厂模式: 通过BeanFactory生产Bean
- 代理模式: Spring AOP用到java的动态代理, 生成Proxy类, 含InvocationHandler用来调用不同的实现类方法, 并加入切面代码
- 模板方法模式: 用抽象类实现共有方法, 有不同实现的方法则用abstract方法
- 观察者模式: Spring Listener, 对象存一个map为listeners, 通知
- 装饰者模式: 同一接口实现多个切面, 可嵌套?
Spring IOC
IOC(控制反转)
- 控制: 对对象的控制由以前的程序员自己控制变成由Spring容器控制
- 反转: 原本是类自己控制使用的对象, 现在变成被动被Spring容易注入
优点:
- 简化程序代码量
- 代码解耦, 依赖关系消失, 只要实现各个部分的任务即可
实现原理:
java反射机制+工厂模式
BeanFactory
Spring IOC中最关键的类, 是一个最根本的接口类, 包含以下方法:
- 4个重载的getBean(...)方法
- isSingleton, isPrototype
- containsBean(name)查询
- getType(name)
- getAliases(name)
- isTypeMatch(name, Class<?>)
XmlBeanFactory是一个经典的BeanFactory实现类, 构造时传入xml文件路径, xmlBeanFactory对象就会读取XML文件中对bean的配置信息, 创建bean, 然后调用xmlBeanFactory.getBean(xxxname)即可获得bean对象
BeanFactory不支持AOP和Web应用
ApplicationContext
ApplicationContext是BeanFactory的派生类接口, 除了继承两种BeanFactory的派生接口, 还继承了有关资源访问, 事件发布,国际化等的接口, 功能更加丰富, 面向用户.
Bean创建时间
| BeanFactory | ApplicationContext | |
|---|---|---|
| Bean创建时间 | 延迟加载,第一次getBean时实例化 | 单例¬ lazy-init: 应用上下文创建时实例化(存在ConcurrentHashMap中); |
| 单例&lazy-init: 第一次getBean时实例化 | ||
| prototype:第一次getBean时实例化 | ||
| 拓展功能(BeanPostProcessor,BeanFactoryPostProcessor) | 需手动注册 | 自动注册 |
Bean初始化和销毁顺序
初始化(包含在创建过程中):
Constructor --> BeanPostProcessor的before方法 --> @PostConstruct注解的方法 --> InitializingBean的afterPropertiesSet方法 --> init-method --> BeanPostProcessor的after方法
销毁:
@PreDestroy注解的方法 -> DisposableBean的destroy方法
Bean注入
XML配置