spring

Spring框架学习笔记

Spring是Java平台上的开源应用框架,起源于Rod Johnson于2002年所著的《Expert One-on-One:J2EE Design and Development》,2003年Rod公开了框架源码,2004年1.0版Spring正式发布。
框架优势:

  • 有效组织中间层对象
  • 实现面向接口编程的范式
  • 易于进行单元测试
  • 简化了数据库访问层

依赖注入与控制反转

传统上,被调用者实例由调用者创建,Spring框架通过依赖注入,使调用者无需关心实例的常见,实现了面向接口编程,达到了控制反转的目的。

面向切面编程

为分散的对象添加公共的行为,通过AOP,完成公共逻辑的统一管理,减少了系统中的重复代码,降低了模块件间的耦合,提高了系统的可维护性。

  • Aspects模块集成了AspectJ
  • Instrumentation模块提供了class instrumentation和classloader实现

主要模块

核心容器[Core Contrainer]

  • Beans、Core
    提供基本功能:创建、配置和管理Bean
  • Context:扩展BeanFactory,提供上下文信息,添加了I18N、资源加载、校验等功能
  • Expression Language:用于访问和操纵运行时对象

AbstractApplicationContext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void refresh() throws BeansException, IllegalStateException {
Object var1 = this.startupShutdownMonitor;//同步锁
synchronized(this.startupShutdownMonitor) {
this.prepareRefresh();//为刷新准备新的Context
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();//刷新所有BeanFacotry子容器
this.prepareBeanFactory(beanFactory);//创建BeanFactory

try {
this.postProcessBeanFactory(beanFactory);
this.invokeBeanFactoryPostProcessors(beanFactory);
this.registerBeanPostProcessors(beanFactory);
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();//刷新由子类实现的方法
this.registerListeners();
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
} catch (BeansException var5) {
this.destroyBeans();
this.cancelRefresh(var5);
throw var5;
}

}
}

BeanFactory详解

1
2
3
4
5
6
7
8
//Bean Factory 接口
Boolean containsBean(String name) //check Bean existing
Object getBean(String name)
Class getType(String name)
//Application 子接口,扩展附加功能
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
XmlWebApplicationContext

数据访问

  • ORM模块提供对象关系映射API,集成了JPA、JDO、hibernate、iBatis
  • OXM:提供Object/XML映射抽象
  • JMS模块包含了发布和订阅特性
  • Transaction模块提供了对声明式和编程式事务的支持

Web模块

  • 支持Web、Servlet、Struts、Portlet

Test模块

  • 支持JUnit
  • 支持TestNG

Spring Boot

注解

  • Profile
    • 使用环境中的ActiveProfiles来标明context,从而设置不同的参数
    • @Profile("dev") or @Profile("prod")
    • context.getEnvitonment().setActiveProfiles(“prod”)
  • Application Event
    • 自定义ApplicationEvent
    • 自定义ApplicationListener
    • 使用容器发布事件
  • SpringAware
    • 通过对应的Aware接口,使Bean获取对应的信息
    • BeanNameAware
    • BeanFactoryAware
  • Concurrent
    • ThreadPoolTaskExecutor:实现了一个基于线程池的TaskExecutor
  • Scheduled
    • 定时任务