定义:
特点:
常用模块:
核心容器/spring上下文/spring-aop/spring-dao/spring-orm/spring-web模块/spring mvc 框架
常用注解:
@controller/@RestController/@Autowired/@ResquestMapping/@pathVariable/
@RequestParam/@ResponseBody/@RequestHeader
@ModelAttribute/@SessionAttribute/@Valid/@CookieValue
@service/@Repository/@Compent/@scope/@compentScan/@compent/@lazy-bean/@import
集成第三方:
Shiro == 权限
Redis == 缓存
Mybatis == 持久层
Quartz/spring-task ==定时任务
Oval/hibernate-validator == 校验
上下文:
ApplicationContext 由 BeanFactory 派 生 而 来 。
ApplicationContext 继承了 HierarchicalBeanFactory 和 ListableBeanFactory 接口。
包含:
名称 |
| 备注 |
AnnotationConfig | ApplicationContext(通用后缀) | 从一个或多个基于Java的配置类中加载Spring应用上下文 |
AnnotationConfigWeb | 从一个或多个基于Java的配置类中加载Spring Web应用上下文 | |
ClassPathXml | 从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源 | |
FileSystemXml | 从文件系统下的一个或多个XML配置文件中加载上下文定义 | |
XmlWeb
| 从Web应用下的一个或多个XML配置文件中加载上下文定义
|
bean的作用域:
>>singleton(单例)|spring singleton的缺省是饿汉模式,如果需要设置成懒汉模式:default-lazy-init="true"/多线程下不安全。
创建时机:
在IOC容器初始化的时候该对象就会被创建
>>prototype(多例)|对这个bean的每次请求都会创建一个新的bean实例
>>request:一次请求范围,在请求完成后,bean会失效并被垃圾回收器回收/
>>session:会话范围,在session过期后、bean会自动失效/
>>global session:global-session和protlet应用相关
Bean的生命周期:
步骤序号 | 方法名/类名 | 动作 | 备注 |
1 | BeanDefinitionReader |
|
|
2 | BeanDefinition |
|
|
3 | BeanFactoryPostProcessor | 获取配置文件${}中的值 |
|
4 |
| Spring对bean进行实例化(通过反射) |
|
5 |
| Spring将值和bean的引用注入到bean对应的属性中;(依赖注入) |
|
6 |
| 处理Aware接口(如下是列举,更多可以查看源码) | 见说明1 |
7 | BeanPostProcessor |
|
|
8 | InitializingBean |
|
|
9 | DisposableBean |
|
|
10 | destroy |
|
|
说明1
6.1>如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBean-Name()方法;
6.2>如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
6.3>如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;
Ioc(控制反转也叫依赖注入):
a:定义:
b:依赖注入的方式:Setter/接口/构造器
c:实现原理:工厂模式+反射机制
[
反射知识点:
https://blog.csdn.net/zjc_jia/article/details/111597865
]
d:代码层面上:注解@autowired
d.1:场景:
Controller:区分两个service;可以使用注解:Qualifier
e:Ioc容器
Beanfactroy:ioc最基本的容器,负责生产和管理bean,懒加载,不支持国际化/
Applicationcontext:即时加载,支持国际化
FactoryBean:接口,getbean获取bean对象
Aop:
Aop解决的问题:横向问题与业务主逻辑分开,实现解耦
Aop应用的业务场景:权限/日志/错误处理/缓存/[事务/内容传递/懒加载]
Aop实现者:spring aop/AspectJ/jboss aop
Aop注解:Aspect/Pointcut
Aop实现方式:
>如果代理类是接口,那么实现方式为java动态代理
>如果代理类不是接口,那么实现方式为cglib
[
代理模式相关知识点:
https://blog.csdn.net/zjc_jia/article/details/112094874
]
代理时机:对象初始化的时候
aop的通知方式:前置/后置/异常/最终/环绕/
相关术语:
通知(表示添加到切点的一段逻辑代码,并定位连接点的方位信息)/
连接点(能够被拦截的地方,每个成员方法都可以称之为连接点)/
切点(具体定位的连接点)/
切面(切面由切点和增强/通知组成)/
引入(引入/引介允许我们向现有的类添加新方法或属性。是一种特殊的增强)/
织入(将增强/通知添加到目标类的具体连接点上的过程)|编译期|类加载期|运行期/
Spring AOP 基于动态代理方式实现;AspectJ 基于静态代理方式实现
事务
事务(Transaction),一般是指要做的或所做的事情
事务的四个特性(ACID):原子性/隔离性/持久性/一致性/
核心接口:org.springframework.transaction
PlatformTransactionManager 事务管理器|提交事务/回滚事务
TransactionStatus 事务状态|是否是新的事务/是否有保存点/设置回滚/是否回滚/刷新/是否完成
TransactionDefinition 基本事务属性的定义|是否只读/传播行为[required/requires_new/supports/not_supported /never ]/隔离规则/回滚规则/事务超时//
隔离级别:
DEFAULT/使用后端数据库默认的隔离级别,
[
mysql默认隔离级别:Repeatable read:重复读[rr级别]
Oracle默认隔离级别:READ COMMITTED[rc级别]
PostgreSQL默认隔离级别:READ COMMITED[rc级别]
]
脏读/幻读/不可重复读
脏读:
一个事务读取到了另外一个事务没有提交的数据[解决方案:READ_COMMITTED]
幻读:-resultNum不一样
同一事务中,用同样的操作读取两次,得到的记录数不相同[解决方案:SERIALIZABLE_READ]
不可重复读:content不一样
在同一事务中,两次读取同一数据,得到内容不同[解决方案:REPEATABLE_READ]
传播机制:
REQUIRED :默认的 spring 事务传播级别,使用该级别的特点是,如果上下文中已经存在事务, 那么就加入到事务中执行,如果当前上下文中不存在事务, 则新建事务执行。
SUPPORTS : 该传播级别的特点是,如果上下文存在事务, 则支持事务加入事务, 如果没有事务, 则使用非事务的方式执行
MANDATORY :该级别的事务要求上下文中必须要存在事务, 否则就会抛出异常!
REQUIRES_NEW :每次都会新建一个事务, 并且同时将上下文中的事务挂起, 执行当前新建事务完成以后, 上下文事务恢复再执行
NOT_SUPPORTED :当前级别的特点就是上下文中存在事务, 则挂起事务, 执行当前逻辑, 结束后恢复上下文的事务
NEVER :传播级别要求上下文中不能存在事务, 一旦有事务, 就抛出 runtime 异常, 强制停止执行
NESTED:该传播级别特征是, 如果上下文中存在事务, 则嵌套事务执行, 如果不存在事务, 则新建事务
Autowired/resource的区别
- a=byType注入方式;r=byName注入方式
- a=spring提供的注解;r=javax
[
byName就是通过Bean的id或者name,byType就是按Bean的Class的类型
]
try...catch对Spring事务的影响
1.catch只打印异常,不抛出异常 - 影响
2.catch打印异常,并抛出异常(RuntimeException) - 不影响
Spring 的默认事务机制,当出现unchecked异常时候回滚,checked异常的时候不会回滚
BeanInitializationException
有两个重要的 bean 生命周期方法,第一个是 setup , 它是在容器加载 bean的时候被调用。第二个方法是 teardown 它是在容器卸载类的时候被调用
Spring中的设计模式:
简单工程模式(beanfactory)/单例模式/适配器/代理模式(aop)/观察者(applicationListener)/策略模式/模板方法
循环依赖:
产生原因:
a类:注入b类
b类:注入a类
解决方案:三级缓存(实例化与初始化分开处理/提前暴露对象)