Spring四种关键策略
- 基于POJO (plain old java object) 的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模板减少样版式代码
依赖注入DI
- 构造器注入(参数中传入对象)
- n ID
应用切面
- 关注点分离
- beforeMethod
- afterMethod
- 在xml声明AOP属性
模板消除样版式代码
- 使用JDBCTemplate封装JDBC的操作
Spring容器
- bean工厂(beanFactory)
- 应用上下文ApplicationContext(AnnotationApplicationConext, pathContext)
Bean生命周期
- 实例化
- 值与bean引用注入到bean中
- 如果实现了BeanNameAware 将Bean传递到SetBeanName()方法中
- 如果实现了BeanFactoryAwere则将bean工厂传入
- 如果实现了ApplicationConextAware则将上下文引用传入
- 如果实现了PostProecess接口则掉调用BeforeInitialization
- 如果bean实现了InitializaingBean接口,则调用AfterPropertSet()方法
- 如果AfterInitialization方法
- disposable销毁
如何装配Bean
- xml,
- java显式装配,
- 自动化装配
自动化装配
组件扫描
自动装备 @component注解,告知Spring创建Bean
@componentScan
@Autowired 可以修饰构造方法,可以修改普通方法,自动装配参数, 接口
Spring设计模式
- 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例
- 单例模式:Bean默认为单例模式
- 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
- 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate
- 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。
JDK动态代理要求被代理的类必须实现一个接口:InvocationHandler 接口,Proxy newProxyInstance(),java反射
CGLIB通过继承的方式动态代理: cglib.jar, asm.jar。通过MethodInterceptor 接口 Enhancer 类,调用父类,继承的方式实例化
Spring作用域
- singleton : bean在每个Spring ioc 容器中只有一个实例
- prototype:一个bean的定义可以有多个实例
- request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
- session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
- global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
- 注意:* 缺省的Spring bean 的作用域是Singleton。使用 prototype 作用域需要慎重的思考,因为频繁创建和销毁 bean 会带来很大的性能开销。
IOC容器加载过程
- 刷新预处理
- 将配置信息解析,注册到BeanFactory
- 设置bean的类加载器
- 如果有第三方想再bean加载注册完成后,初始化前做点什么(例如修改属性的值,修改bean的scope为单例或者多例。),提供了相应的模板方法,后面还调用了这个方法的实现,并且把这些个实现类注册到对应的容器中
- 初始化当前的事件广播器
- 初始化所有的bean
- 广播applicationcontext初始化完成。
Spring Boot
四个特性
- Spring Boot starter 依赖整合,合并Maven Gradle构建
- 自动配置,Spring Boot 4对条件化配置的支持,合理推测所需的bean并自动化配置
- 命令行接口
- Actuator 管理特性
Spring Boot为不同的Spring模块提供了许多依赖项。一些最常用的是:
spring-boot-starter-data-jpa
spring-boot-starter-security
spring-boot-starter-test
spring-boot-starter-web
spring-boot-starter-thymeleaf