Spring学习笔记

1.getBean
(1)按名称匹配
(2)按照类型匹配
(3)按照名称和类型匹配

2.IoC容器
(1)BeanFactory:具有懒加载(lazy)的特点,延迟初始化;在创建spring容器的时候,不会立马创建容器中管理的Bean对象;要等到从容器中获取Bean对象时才创建
(2)ApplicationContext:在创建spring容器的时候,立马创建容器中管理的Bean对象

3.Bean的实例化方式
(1)使用无参构造器
(2)静态工厂方法实例化:<bean id="a" class="包名+类" factory-method="静态方法" />
(3)实例工厂方法实例化:<bean id="a" factory-bean="bean名称" factory-method="方法" />
(4)实现FactoryBean接口实例化
// 实例工厂方法
T getObject() throws Exception;
// Bean的类型
Class<?> getObjectType();
// 是否单例,true(默认):单例
boolean isSingleton();

4.Bean作用域
(1)singleton:单例模式,Spring IoC容器中只会存在一个的Bean实例
(2)prototype: 原型模式,每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例
(3)request:用于web开发,在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效。
(4)session:用于web开发,在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。
(5)global Session:在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效,分布式系统存在全局session概念。

5.Bean的实例化和销毁
初始化方法是在对象创建后(构造器被调用后)调用,销毁方法是在对象被正常销毁之前调用
(1)使用@PostConstruct注解初始化,使用@PreDestroy注解销毁Bean
(2)实现InitializingBean重写afterPropertiesSet(), 实现DisposableBean重写destroy()方法
(3)在xml配置文件中,配置Bean时使用init-method和destroy-method配置方法
afterPropertiesSet()会比init-method的方法先调用

6.Bean的生命周期
有图片
Bean自身的方法:配置文件中的init-method和destroy-method配置的方法、Bean对象自己调用的方法
Bean级生命周期接口方法:BeanNameAware、BeanFactoryAware、InitializingBean、DiposableBean等接口中的方法
容器级生命周期接口方法:InstantiationAwareBeanPostProcessor、BeanPostProcessor等后置处理器实现类中重写的方法

7.<context:property-placeholder
location="" //表示属性文件位置,多个之间通过如逗号/分号等分隔;
file-encoding="" //文件编码;
ignore-resource-not-found="" //如果属性文件找不到,是否忽略,默认false,即不忽略,找不到将抛出异常
ignore-unresolvable="" //是否忽略解析不到的属性,如果不忽略,找不到将抛出异常
properties-ref="" //本地java.util.Properties配置
local-override="" //是否本地覆盖模式,即如果true,那么properties-ref的属性将覆盖location加载的属性
system-properties-mode="" //系统属性模式,ENVIRONMENT(默认),NEVER,OVERRIDE
never=""只查找properties-ref、location;
order="" //配置多个<context:property-placeholder/>时的查找顺序
/>

8.@Resource与@Autowired注解的区别
(1)@Resource
注入的Bean必须存在,是J2EE的注解,减少代码和Spring之间的耦合
先按照Bean名称进行匹配,匹配不到再按照Bean类型进行匹配,再匹配不到就抛出异常
(2)@Autowired
先按照类型匹配,匹配不到载按照名称匹配
required属性决定注入的Bean是否必须存在,默认true

9.静态代理
在程序运行前就已经存在代理类的字节码文件,代理对象和真是对象的关系在运行前就确定了

10.动态代理
在程序运行期间由JVM通过反射等机制动态的生成的,所以不存在代理类的字节码文件,代理对象和真实对象的关系是在程序运行时期在确定的
(1)JDK动态代理
1)java动态代理使用java.lang.reflect包中的Proxy类与InvocationHandler接口这两个完成的
2)要使用JDK动态代理,委托必须要定义接口
3)JDK动态代理将会拦截所有的public的方法(因为只能调用接口中定义的方法),这样即使在接口中增加了新的方法,不用修改代码也会被拦截
4)动态代理的最小单位是类(所有类型的方法都会被处理),如果只想拦截一部分方法,可以再invoke方法中对要执行的方法进行判断

(2)CGLIB动态代理
1)CGLIB可以生成委托类的子类,并重写父类非final修饰的方法
2)要求类不能是final的,要拦截的方法使非final、非static、非private的
3)动态代理的最想单位是类(所有类中的方法都会被处理)

11.AOP:面向切面编程
(1)基本术语
1)Joinpoint:连接点,需要被增强的方法
   where:去哪里做增强,强调的是一个地方
2)Pointcut:切点,需要为哪些包中的哪些类的哪些方法做增强,可以认为是连接点的集合
   where:去哪些地方做增强,强调多个地方
切点定义了哪些连接点会得到增强(通知)
3)Advice:增强(通知),当拦截到Joinpoint后,在方法执行的什么时机(when)做什么样(what)的增强
   方法执行的时机:前置增强,后置增强,异常增强,最终增强,环绕增强
4)Aspect:切面,Pointcut + Advice,去哪些地方 + 在什么时机 + 做什么增强
5)Target:目标对象,被代理的目标对象,委托对象
6)Weaving:织入,把Advice加到Target上。被创建出代理对象的过程,由spring完成
7)Proxy:一个类被AOP织入增强后,创建出来的代理对象
(2)Pointcut表达式
execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)
1)?代表可有可无
2)*表示任意类型的参数
3)..表示任意类型参数且参数个数不限
4).*表示包下的所有类
5)..*表示包、子孙包下的所有类

12.数据源
一般配置成连接池
1)原始jdbc步骤:获取jdbc连接,定义预编译语句,定义sql,执行sql,处理结果集,提交事务,处理异常,回滚事务,释放资源

13.事务
事务是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务
1)特性:ACID
原子性(Atomicity):事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做
一致性(Consistency):在事务执行之前数据库的数据处于正确状态,而事务执行完后数据库的数据依然处于正确状态,即数据库的完整性约束没有被破坏
例如A转账给B,无论成功与否,A和B转账前后的账户总额是一致的
隔离性(Isolation):当多个事务处于并发访问同一个数据库资源时,事务之前互相影响程度,不同的隔离级别决定了各个事务对数据库资源访问的不同行为
持久性(Durability):事务一旦提交成功,它对数据库的数据改变是不可逆的
2)数据库并发问题
第一类丢失更新:两个事务更新相同数据。如果一个事务提交,另个一个事务回滚,第一个事务的更新会被回滚
脏读:第二个事务查询到第一个事务未提交的更新数据,第一个事务提交该数据且回滚了,第二个事务操作脏数据
幻读:一个事务查询到另一个事务已经提交的新数据,导致多次查询数据不一致
不可重复读:一个事务查询到另一个事务已经修改的数据导致多次查询数据不一致
第二类丢失更新:多个事务同时读取相同数据,并完成各自的事务提交,导致最后一个事务提交会覆盖前面所有事务对数据的改变
3)隔离级别
                       隔离级别                            脏读      幻读       不可重复读       第一类丢失更新       第二类丢失更新
ISOLATION_READ_UNCOMMITED(读未提交)  是           是              是                         否                       是
ISOLATION_READ_COMMITED(读已提交)      否           是              是                         是                       是
ISOLATION_REPREATABLE_READ(可重复读)  否           否              是                         是                       是
ISOLATION_SERIALIZABLE(串行)                    否           否              否                         否                       否
ISOLATION_DEFAULT 使用后端数据默认的隔离级别

Oracle支持ISOLATION_READ_COMMITED(缺省值)和ISOLATION_SERIALIZABLE
Mysql支持以上四种,默认是是ISOLATION_REPREATABLE_READ
4)传播行为
(AService)a方法中调用(BService)b方法
情况一:遵从当前事务
PROPAGATION_REQUIRED:必须存在一个事务;如果当前存在一个事务,则加入到当前事务;否则新建一个事务
PROPAGATION_SUPPORTS:支持当前事务;如果当前存在一个事务,则使用该事务;否则以非事务的形式运行
PROPAGATION_MANDATOY:必须存在事务;如果当前存在一个事务,则使用该事物;否则抛出非法的事务异常

情况二:不遵从当前事务
PROPAGATION_REQUIRED_NEW:不管当前是否存在一个事务,都会新开启一个事务
PROPAGATION_NOT_SUPPORTS:以非事务方式运行;如果存在事务,则把当前事务挂起
PROPAGATION_NEVER:不支持事务;如果当前存在事务,则抛出非法的事务异常

情况三:嵌套事务
PROPAGATION_NESTED:如果当前存在一个事务,则在嵌套事务中运行;如果当前不存在事务,则新建一个事务;
嵌套事务回滚不影响当前事务;当前事务回滚影响嵌套事务

本博客所有文章均是原创,如若转载请注明来源,谢谢.https://www.cnblogs.com/icanner

Code change world
原文地址:https://www.cnblogs.com/icanner/p/9617343.html