1. spring中重要概念:
1. beans和core 他们提供了spring框架最基本功能: IOC和DI
context上下文,基于beans与cores , spel 他是spring提供的一个表达式语言.
2. loc 控制反转 : 原来由我们自己实例化的对象交给我们spring容器来实例化,这时候对象的初始化的权利就会反转.
①.在xml中配置: <bean id="" class="全类名"> , 在springboot中配置 @Bean
②.spring 中提供了beanfactory工厂,我们一般使用的是他的子接口类applicationContext,读取配置文件,实例化对象
applicationContext a = new clasPathxmlapplicationContext("application.xml");
a.getbean("id");
3. DI : 在spring框架负责创建bean对象,动态的将依赖对象(也就是参数)注入bean组件(方法)中.比如用: @Autowired
2.AOP:
1.JDK动态代理: invoke方法的参数(proxy代理对象,调用方法的Method对象,调用方法的参数 )
Cglib可以没有接口,也可以有接口的类动态代理
2. spring 采用的是哪一种动态机制:
如果目标对象,有接口,优先使用 jdk 动态代理
如果目标对象,无接口,使用 cglib 动态代理
3.静态AOP: 是指AspectJ实现的AOP,他是将切面代码直接编译到java类文件中
动态AOP: 是指将切面代码动态织入实现的AOP 技术为
JDK提供的动态代理和CGLIB(动态字节码增强技术)
4.动态代理相关术语:
目标对象 target: 只需要被增强的代理对象
连接点: 指的是对象中哪些被拦截的方法
切点: 指的是所有的连接点中哪些具有某些特征的方法进行切入
通知: 分为前置,后置,异常通知等, 是指对这些方法进行增强操作
切面: 切点和通知组成了切面
织入: 指的是对代理对象进行增强的过程, 织入可以在编译期,
类装载期,运行期等;AspectJ是静态织入,spring是动态织入
代理对象: 指的是被织入后的对象,产生的结果代理对象;
3.bean获取与实例化
它采用延迟加载的方案,只有真正的getbean时才会实例化bean.
applicationContent 他是扩展了beanfactory接口,
applicationContent实现类 FileSystemxmlapplicationcotext("src/..xml");classPathxmlapplicationcontext;
applicationContext他会在配置文件加载的时候,就会初始化bean,,提交预处理错误的存在.
并且applicationContext,在不同的应用层的context实现.
4. bean的作用域:
在bean标签内 scope=" "
prototype : 多例 每一次从spring容器中获取时,都会返回一个新的实例.
singleton : 单例 代表springIOC容器中只有一个bean实例.(默认)
request : 用在web开发中, 将bean对象使用request.setrrtribute()存储在request域中.
session : 用在web开发中, 将bean对象使用session.setrrtribute()存储在session域中.
5. bean的生命周期:
1. 实例化对象 2. 封装属性
3.如果实现了beanNameAware 重写方法, 得到bean的id或name值
4.如果实现了applicationAware 重写方法, 得到application的对象
第三步和第四步是让bean了解spring容器. 第五步和第八步是 对指定bean进行功能增强.
5.对于bean的生命周期,两个方法: 增强bean可以使用后处理bean
6. 如果需要初始化或销毁操作我们可以使用 init-method destroy-method
6. spring 通知基于AOP:
1. 五种通知: 前置 ,后置 ,环绕 ,异常抛出通知, 最终通知
环绕通知: 日志操作,权限校验, 性能监控,事物管理 最终通知: 资源释放.
2. 声明切点的步骤:
类上面: @Aspect 声明当前bean是一个切面 方法上面:
前置@before("execution(表达式)")
后置 @AfterReturning(value = "execution(* *.update(..))", returning = "value")
环绕通知: @around("execution(* *.update(..))")
异常通知: @afterthrowing(value = "execution(* *.update(..))", throwing = "ex")
最终通知: @After(value = "execution(* *.update(..))", returning = "value")
3. execution() 用于描述方法
语法:execution(修饰符 返回值 包.类.方法名(参数) throws异常)
修饰符,一般省略
public 公共方法
* 任意
返回值,不能省略
void 返回没有值
String 返回值字符串
* 任意
包,[省略]
com.xc.crm 固定包
com.xc.crm.*.service crm包下面子包任意 (例如:com.itheima.crm.staff.service
com.xc.crm.. crm包下面的所有子包(含自己)
com.xc.crm.*.service.. crm包下面任意子包,固定目录service,service目录任意包
类,[省略]
UserServiceImpl 指定类
*Impl 以Impl结尾
User* 以User开头
* 任意
方法名,不能省略
addUser 固定方法
add* 以add开头
*Do 以Do结尾
* 任意
(参数)
() 无参
(int) 一个整型
(int ,int) 两个
(..) 参数任意
throws ,可省略,一般不写。
综合1
execution(* com.itheima.crm.*.service..*.*(..))
综合2
<aop:pointcut expression="execution(* com.xc.*WithCommit.*(..)) ||
execution(* com.itheima.*Service.*(..))" id="myPointCut"/>
7.spring 事物:
1.spring 事物管理的优点:
①.提供一致的对于不同的事物管理的API
②.支持声明式事务管理 ,基于aop对目标进行代理,添加around环绕通知.
③优秀的整合与spring的数据访问
④事物管理的三个接口: platformtransactionst(事物管理器) transactionstatus(事物运行状态)
transactiondefinition 事物的一些相关信息 例如隔离 传播 超时,只读
2.动态代理概念:
①. 代理对象存在的价值主要用于拦截对真是业务对象的访问,
②. 代理对象应该具有和目标对象相同的方法
③.. jdk里面的proxy,用newProxyInstance的invoke方法来实现代理,代理对象必须有接口
④. CGLB动态代理,无限制
3. Spring事务其实就是spring AOP,底层创建了代理对象,然后在代码开头和结尾封装了开启事物和事物回滚或提交操作
4.事物特性: 一致性,原子性,隔离性,持久性
5.事物属性:
① 事物隔离,事物隔离级别,由底层的数据库实现
一: 脏读: 读到了另一个事物未提交的数据
二: 不可重复读: 指的是事物中重复读取了别的线程已经提交的数据,两次查询不一致,导致银行报表有问题
三: 幻读: 所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,
当之前的事务再次读取该范围的记录时,会产生幻行;
四: 串行化: 强制事物串行执行,都加锁
②事物超时: 数据库超时
③事物只读: 一般用与查询 true/false
④事物回滚规则: rollback-for 设置一个异常,产生异常,触发事物回滚 no- rollback-for不会发生事物回滚
⑤事物传播行为:
一. REQUIRED : 表示业务方法需要在一个事物当中进行,如果这个时候业务方法执行的时候已经在
一个已有的事物中了,则加入事物,否则重新开启 一个事物
二. NOT_SUPPORTED: 表示业务方法不需要事物,如果业务方法执行时候已经在一个事物中,则事物被挂起,
等方法执行完毕后,事物恢复执行
三 PROPAGATION_MANDATORY: 表明方法必须在事物中运行,事物如果不存在,则抛出一个异常
3. spring jdbc Template 提供jdbc模板, 类似于dbutils
4. Platformtransactionmanager: 平台事物管理器 作用: 解决在不同的持久化层技术事物代码不同问题.
datasourcesactionmanager 用于mybatis
hibernatesactoinmanager 用于hibernate
5.注解: 可以使用 @Transaction(属性....) 在类或方法上添加事物管理.
isolation="隔离级别" propagation="事物传播" timeout="超时时间默认值" read-only是否只读
rollback-for 设置一个异常,产生异常,触发事物回滚 no- rollback-for不会发生事物回滚
8. 注解开发:
1. 在xml中 一个约束文件,context名称空间, <context:component base-package="com.xc"/>
指明spring扫描哪个包,它包含了 <context:annotation-config/>功能是作用是让spring常用的标签生效
2. @Component("id名")在类上面, 如果没指定id名, 会默认以类名首字母小写.
3.在spring2.5后为@Component添加了三个衍生的注解 ,针对不同的层用, 如果不确定哪个层,就用@component
@Repository 用于DAO层 @Service 用于service层 @Controller 用于表现层
4.属性依赖注入:
①简单属性或set方法注入: @value("值")
②复杂属性或set方法注入: 对引用类型的成员属性,@autowired 默认是按照类型进行注入.
加上@qualifier("id名"),可以根据名称注入, 另一种注解 @resuore(name="id")
③ @autowired 和 @resuore 两种注解的区别:
1. 都可以写在字段上,或卸载set方法上
2. @autowired 默认是按照类型进行注入.
3. @resuore是javaee的提供注解, 减少了与spring耦合,默认按照name记性装配, 查找不到,再按照类型注入.
5.其他注解 @scope(值) 描述bean的作用域 在自定义初始化方法上加@postconstruct
在销毁方法上加 @predestroy 只对于scope(singleton) 有效, 调用close方法时候才能够执行.