Spring模块
| 大模块 | 小模块 | 作用 |
|---|---|---|
| 核心容器 | Beans | 和core一起提供控制反转和依赖注入。你不再需要编程去实现单例模式,允许你把依赖关系的配置和描述从程序逻辑中解耦。 |
| 核心容器 | Core | 同上 |
| 核心容器 | Context | Spring容器。上下文模块从Beans模块继承其功能,并添加支持国际化(使用,例如,资源集合),事件传播,资源负载,并且透明创建上下文 |
| 核心容器 | SpEL | 提供了强大的表达式语言去支持查询和操作运行时对象图 |
| 面向切面 | AOP | 提供了一个符合AOP联盟(要求)的面向方面的编程实现 |
| 面向切面 | Aspects | 单独的spring-aspects模块,提供了与AspectJ的集成。 |
| 类植入 | Instrumentation | 支持和类加载器的实现,可以应用在特定的应用服务器中 |
| 消息 | Messaging | 传输消息 |
| 数据访问/集成 | JDBC | 连接数据库等 |
| 数据访问/集成 | ORM | 对象关系映射 |
| 数据访问/集成 | OXM | 提供了一个支持对象/ XML映射实现的抽象层 |
| 数据访问/集成 | JMS | 包含用于生产和消费消息的功能 |
| 数据访问/集成 | Transactions | 事务 |
| Web | Websocket | websocket主要功能就是实现网络通讯,比如说最经典的客服聊天窗口、您有新的消息通知,或者是项目与项目之间的通讯,都可以采用websocket来实现。 |
| Web | Servlet | Servlet容器 |
| Web | Web | 提供基本的面向Web的集成功能,例如多部分文件上传功能,以及初始化一个使用了Servlet侦听器和面向Web的应用程序上下文的IoC容器 |
| Web | Portlet | 类似Servlet |
| 测试 | Test | 进行单元测试和 集成测试 |
SpringMVC的发展
Spring SpringMVC Springboot的关系
Springboot包含了Spring并做了扩展 如加入Starter来简化Maven配置
Spring包含了SpringMVC
Springboot > Spring > SpringMVC
SpringMVC 和 Springboot中的模块差别在哪
去掉了servlet.xml的配置
事务
事务的分类
-
声明式事务
-
编程式事务
编程式事务
手动提交事务
public class UserService {
@Resource
UserDAO userDAO;
@Resource
DataSource dataSource;
@Resource
PlatformTransactionManager transactionManager;
public void addUser(User user) throws Exception {
TransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
// [1] 插入纪录
userDAO.insert(user);
// [2] 范例抛出异常
Integer i = null;
if (i.equals(0)) {
}
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
throw e;
}
return;
}
}
声明式事务
指定某一个函数为事务
方式:
- 基于TransactionInterceptor的声明式事务;
- 基于TransactionProxyFactoryBean的声明式事务;
- 基于/命名空间的声明式事务;
- 基于标注(@Transactional)的声明式事务。
事务的传播行为
当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。
| 传播行为 | 存在事务 | 不存在事务 | 场景 |
|---|---|---|---|
| propagation_requierd | 运行 | 创建事务 | 正常事务,失败后全体回滚 |
| propagation_supports | 运行 | 非事务运行 | 查询 |
| propagation_mandatory | 运行 | 抛出异常 | 强制由事务调用 |
| propagation_required_new | 挂起当前事务 | 创建事务 | 失败不影响当前事务 |
| propagation_not_supported | 挂起当前事务 | 非事务运行 | 本身不以事务运行 |
| propagation_never | 抛出异常 | 非事务运行 | 整个系统不以事务运行 |
| propagation_nested | 嵌套运行 | 创建事务 | 根据小事务决定大事务 |
单例的循环依赖
A的构造函数中有B
B的构造函数中有A
判断
如果存在在ealySingletonObjects或者singletonObjects都算是循环依赖
三级缓存
- singletonFactories : 单例对象工厂的cache
- earlySingletonObjects :提前暴光的单例对象的Cache
- singletonObjects:单例对象的cache
/** Cache of singleton objects: bean name --> bean instance */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
/** Cache of singleton factories: bean name --> ObjectFactory */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);
/** Cache of early singleton objects: bean name --> bean instance */
private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);
原理
- Spring是通过递归的方式获取目标bean及其所依赖的bean的;
- Spring实例化一个bean的时候,是分两步进行的,首先实例化目标bean,然后为其注入属性。