Spring详解,底层原理深入探究(1)
1.简介
Spring 是目前主流的 Java Web 开发框架,该框架是一个轻量级的开源框架,具有很高的凝聚力和吸引力。由 Rod Johnson 创立,2004 年发布了 Spring 框架的第一版,其目的是用于简化企业级应用程序开发的难度和周期。
2.核心
①控制反转(IOC)和面向切面编程(Aop)
②将类交由Spring框架统一管理,自动注入并复制
③系统级服务不用手工写,避免其混杂入业务代码(例如关闭事务),改由Spring织入
3.优点
①轻量级
jar包小,效率高
②非侵入式
不用继承Spring特定的类,Spring的代码不会进入我们的代码中
③针对接口编程
对象由容器创建
④Aop编程的支持
将一部分公共可重复利用的代码抽离出来,一次编程多次利用
⑤可管理其他框架
4.Spring核心之Ioc
Ioc就是指将原本需要手动new出来的对象的控制权交由Spring处理。
具体底层请看Spring板块的下一期内容
5.Spring核心之Aop
Aop为Aspect Oriented Programming:面向切面编程通过预编译的方式和动态代理来实现功能的统一维护
1.优点
减少重复,专注业务
2.核心:使用动态代理的方式在执行方法前或出现异常后加入相关的逻辑
说到这大家或许也有些迷茫,小编带大家来看一个例子了解一下Aop
``
package com.ff.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class AopDemo {
//save方法执行前做日志,执行后做日志,模拟做两次日志
@Around("execution(* com.ff.dao.UserDao.save(..))")
public void tran(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("做日志");
proceedingJoinPoint.proceed();
System.out.println("做日志");
}
//如果save方法抛出异常,则执行这个
@AfterThrowing(value = "execution(* com.ff.dao.UserDao.save(..))",throwing = "e")
public void throw123(Exception e) {
System.out.println("出异常了" + e.getMessage());
}
}
``
package com.ff.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.Date;
@Repository(value = "userDao")
public class UserDao {
@Autowired
JdbcTemplate jdbcTemplate;
public void save() {
System.out.println("保存成功");
//int i=10/0;
jdbcTemplate.update("insert into user(user_name,birthday) values (?,?)", "yuan", new Date());
return;
}
}
如果注释int i=10/0;则结果为
做日志
保存成功
做日志
如果没注释int i=10/0;则结果为
做日志
保存成功
java.lang.ArithmeticException: / by zero
3.AOP 的基本概念
连接点(Joinpoint):类中可以被增强的方法,这个方法就被称为连接点
切入点(pointcut):类中有很多方法可以被增强,但实际中只有 add 和 update 被增了,那么 add 和 update 方法就被称为切入点(实际实现的连接点)
通知(Advice): 通知是指一个切面在特定的连接点要做的事情(增强的功能)。通 知分为方法执行前通知,方法执行后通知,环绕通知等.
切面(Aspect):把通知添加到切入点的过程叫切面. 目标(Target): 代理的目标对象(要增强的类) 代理(Proxy): 向目标对象应用通知之后创建的代理对象
6.Spring的事务管理
事务可以看做是由对数据库若干操作组成的一个单元。 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作 的结合。由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常, 异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操 作数据的并不可靠,需要在这种情况下进行回退。
1.事务特征
原子性(Atomic) 一致性(Consistent) 隔离性(Insulation) 持久性(Duration)
2.事务的形式
编程式事务:注 入 一 个 事 务 管 理 对 象 TransactionTemplate,实现提交和回滚
注解实式事务;只需要在需要事务的方法或类上配置@Transactional,配置xml如下
<!-- 配置 spring 事务管理类, 并注入数据源 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property>
`
<tx:annotation-driven transaction-manager=“transactionManager”/>`
7.事务的传播行为
事务的传播行为是指事务A方法调用事务B方法时 ,B方法的行为(加入A的事务,没有事务,还是自己建事务),由B的传播行为决定
事务的传播行为 | 解释 |
---|---|
PROPAGATION_REQUIRED | 如果当前没事务,创建一个事务,如果有则加入当前事务 |
PROPAGATION_SUPPORTS | 如果A有事务则加入,没有自己就不在事务中运行 |
ROPAGATION_MANDATORY | 使用当前事务,如果当前没有事务则抛出异常 |
PROPAGATION_REQUIRES_NE W | 无论A有没有事务都要建立一个新事务 |
PROPAGATION_NOT_SUPPOR TED | 如果A有事务则把A的事务挂起,B不在事务中执行,A没有,B也不在事务中执行 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没事 务,和1相同 |
请关注小编下期下期主要以讲Spring底层创建原理等