Spring基础

184 阅读2分钟

Spring中的设计模式

  1. 单例模式: Bean默认作用域为Singleton
  2. 工厂模式: 通过BeanFactory生产Bean
  3. 代理模式: Spring AOP用到java的动态代理, 生成Proxy类, 含InvocationHandler用来调用不同的实现类方法, 并加入切面代码
  4. 模板方法模式: 用抽象类实现共有方法, 有不同实现的方法则用abstract方法
  5. 观察者模式: Spring Listener, 对象存一个map为listeners, 通知
  6. 装饰者模式: 同一接口实现多个切面, 可嵌套?

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创建时间

BeanFactoryApplicationContext
Bean创建时间延迟加载,第一次getBean时实例化单例&not 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配置