Spring是一个轻量级J2EE框架。
主要功能:
1、控制反转(IOC)
2、面向切面编程(AOP)
3、面向接口开发
4、事务管理
优点:
降低其他框架的耦合度,拓展性强、简单易用、便于管理。
IOC:
1、给对象属性赋值:
1》通过构造函数
2》通过set方法
3》自动装配
byName:通过参数名称自动装配,当一个bean的name和另外一个bean的property相同时自动装配;
byType:通过参数类型自动装配,当一个bean的数据类型和另外一个bean的property的数据类型兼容时自动装配(必须保证该类型在IOC容器中只有一个对象,否则报错 );
4》注解:
使用注解的步骤:
1)引入context命名空间:
xmlns:context="http://www.springframework.org/schema/context"
2)开启扫描注解:
<context:component-scan base-package="cn.itcast.e_anno2"></context:component-scan>
3)使用注解:
@Component 指定把一个对象加入IOC容器
@Repository 指定把一个对象加入IOC容器 用于持久层
@Service 指定把一个对象加入IOC容器 用于业务逻辑层
@Controller 指定把一个对象加入IOC容器 用于控制层
@Resource(byName) 属性注入 相当于@Autowired(byType)
2、bean对象创建细节
1》创建对象
scope="singleton" 单例 默认值 service/dao/工具类 线程安全 容器初始化之前创建,且整个应用只能有一个
scope="prototype" 多例 Action对象 非线程安全 用到时才创建
2》延迟创建
lazy-init=“false” 不延迟创建 默认值
lazy-init=“true” 延迟创建 只针对单例
3、Bean的作用域
1、singleton:默认范围,这种范围确保无论有多少个请求,每个容器中只有一个bean的实例,由bean factory自身维护。
2、propertory:与单例相反,为每个请求创建一个实例。
3、request:在bean范围内,为每个请求创建一个实例,当请求完成时会失效并被垃圾回收器回收。
4、session:与请求范围相似,确保每个session中有一个bean的实例,session过期后,bean随之失效。
4、IOC容器对baen的生命周期
1、通过构造器或者工厂方法创建bean实例
2、为bean的属性设置值和对其他bean的作用
3、将 bean实例传递给bean后置处理的postProcessBeforeInitlization方法
4、调用bean的初始化方法init-method将bean实例传递给bean后置处理的postProcessAfterInitlization方法
5、当容器关闭时调用bean的销毁方法destroy-mmethod
5、BeanFactory与ApplicationContext的区别
BeanFactory是Spring容器顶级核心接口,较早,功能较少,如:getBean
ApplicationContext是Spring的另一个顶级接口,继承于BeanFactory提供了较多对Bean的管理功能:国际化、校验、监听等。
一般使用ApplicationContext
AOP
1、代理模式
1)代理(proxy),一种设计模式,提供了对目标对象另外的访问方式:通过代理访问目标对象。好处:在实现 目标对象的基础上增加额外的功能。
2)静态代理(代理对象要实现与目标对象一样的接口):
1》在不修改目标对象功能的前提下,对目标对象功能扩展。
2》因为代理对象要实现与目标对象一样的接口,所以会产生很多的类。
3》接口增加方法时,目标对象与代理对象都要维护。
3)动态代理(不需要实现接口)
用JDKAPI生成,动态的在内存中构建代理对象,代理对象不需要实现接口,但目标对象一点更要实现接口,否则无法使用动态代理。
4)Cglib代理(子类代理)
在内存中构建一个子类对象从而实现对目标对象的扩展,CGLIB无需实现接口CGLIB包的底层是一个字节处理框架ASM。
2、AOP
AOP :aspect object programming 面向切面编程:对很多功能都有的重复代码抽取,通过切入点表达式,制定拦截那些类的哪些方法,给制定的类在运行时植入切面类代码。
功能:让关注点代码与业务代码分离。
关注点:重复代码;
切面(类):由关注点形成的类。
切入点:执行目标对象方法,动态植入切面类。
事物
1、事务使用
spring的事务包括声明式事务和编程式事务。声明式事务是用spring的aop来实现的;配置了只读事务和回滚事务(传播行为为REQUIRED)当出现错误后回滚操作。在项目中通过AOP切入事务到service层,将一次逻辑业务操作包括在一个事务中。
2、管理事务
如果仅执行一次单条的查询语句,则没必要使用事务,数据库默认支持SQL的执行期间的一致性;
read-only="true"表示该事务为只读事务,只读事务不存在数据的修改,所以数据库会对只读事务提供一些优化:不启用回滚段,不记录回滚log等。
如何指定只读事务:
bean配置文件中,prop属性增加“read-only”或者使用注解@Transaction(read-only=true)
配置完只读事务后,相当于数据库设置成为只读数据库,若此时进行写操作,会出现错误。
3、spring事务的配置
先配置事务管理器TransactionManager,
再配置事务通知和属性,通过tx:advice,
配置<aop:config>设置哪些方法或类需要加入事务
4、事务传播行为
Propagaion.REQUIRED(spring的默认事务) :指定当前方法必须在事务的环境下执行,若存在事务,则加入。
Propagaion.SUPPORTS :有便用,没有就不用事务。
Propagaion.REQUIRED_NEW :指定当前方法必须在事务中执行,若已存在事务,则挂起该事务,新建事务使用,执行完成后恢复刚才挂起的事务。
5、事务并发
事务并发会引起脏读、幻读、不可重复读等问题,设置事务的隔离级别可以解决。