1、Spring简介
1.1、spring的由来
spring是轻量级java开发框架,是一个轻量级的企业级开发的一站式解决方案,所谓解决方案是可以基于Spring解决javaEE开发的所有问题。最早由Rod Johnson创建。目的是解决企业级应用开发的业务与逻辑层和其它各层的耦合问题。是一个分层的轻量级开源框架。提供基础框架支持。
1.2、spring的体系结构
20多个模块,这些模块分布在核心容器、数据访问层、web层、aop模块、信息模块、植入模块和测试模块。
1.3、Spring的优点
- 低侵入式设计
- 独立于各种应用服务器
- 依赖注入特性将组件关系透明化,降低耦合度
- 面向切面编程特性允许将通用任务进行集中式处理
- 与第三方框架的良好整合
1.4、Spring的发展过程
- xml配置
- 注解配置
- java配置
项目构建工具:Maven
2、Spring IOC
2.1、Spring IOC 的基本概念
**控制反转(IOC):**对象的实例不由调用者创建,而是由Spring容器来创建。spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制,这样,控制权就由调用者转移到spring容器,控制权反生了反转,这就是spring的控制反转。
**依赖注入:**Spring 容器角度来看, Spring 容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例 这就是Spring的依赖注入。
综上所述,控制反转是一种通过描述 (在 Spring 中可以XML或注解 )并通过第三方去产生或获取特定对象的方式。在 Spring中实现控制反转的是IOC容器 其实现方法是依赖注入。每一个被Spring管理的Java对象都称之为Bean;而Spring提供了一个IoC容器用来初始化对象,解决对象间的依赖管理和对象的使用。
2.2、Spring IOC 容器
2.2.1、BeanFactory
BeanFactory由org.spring.framework.beans.factory.BeanFactory
接口定义,它提供完整的IOC服务支持,是一个管理 Bean的工厂,主要负责初始化各种Bean。
2.2.2、ApplicationContext
ApplicationContext是BeanFactory的子接口,也称为应用上下文,由org.springframework.context.ApplicationContext
接口定义。
实现ApplicationContext接口实例的三种方法:
- 通过ClassPathXMLApplicationContext 创建
- 通过FileSystemXmlApplicationContext 创建
- 通过Web服务器实例化ApplicationContext容器
2.3、依赖注入的类型
依赖注入的作用是使用spring框架创建对象时动态的将其所依赖的对象(例如属性值)注入Bean组件中。spring框架的依赖注入通常有两种实现方式。一种是使用构造方法注入,另一种是使用属性的setter方式注入。
2.3.1、使用构造方法注入
<!-- 将指定类 TestDIDaoimpl 配置给 Spring ,让 Spring 创建其实例 -->
<bean id="myTestDIDa" class="dao.TestDIDaoImpl">
<!-- 使用构造方法注入 -->
<bean id="testDIService" class="service.TestDIServiceImpl">
<!-- myTestDIDao 注入到 TestDIServiceimpl 类的属性 testDIDao -->
<constructor-arg index="0" ref="myTestDIDao"/>
</bean>
</bean>
2.3.2、使用属性setter方法注入
<!-- 使用setter方法注入 -->
<bean id="testDIService1" class="service.TestDIServiceImpl1">
<!-- 调用TestDIServiceImpl1 类的setter方法,将myTestDIDao注入到TestDIServiceImpl1类的属性testDIDao上 -->
<property name="testDIDao" ref="myTestDIDao"/>
</bean>
2.3.3、使用P命名空间注入属性值
3、Spring Bean
3.1、Bean的配置
Spring看做一个大型工厂,用于生产和管理Spring容器中的Bean,如果要使用工厂生产和管理Bean,需要开发者将Bean配置在spring的配置文件中。Spring框架支持XML和Properties两种格式的配置文件。
XML配置文件的根元素是,他包含了多个子元素,每一个bean元素定义一个Bean,并描述Bean如何被配置到Spring容器中。常用属性:
id:Bean在工厂中的唯一标识
class:Bean的具体实现类
scope:Bean的作用域
constructor-arg:构造方法注入,指定构造方法的参数,该元素的index属性指定参数的序号,ref属性指定对应工厂其它Bean的引用关系,type属性执行参数类型,value属性指定参数的常量值。
property:用于设置一个属性,那么指定Bean实例中相对应属性的名称,value属性指定Bean的属性值,ref属性指定属性对工厂中其它bean的引用关系
list:property元素的子元素,封装list或数组类型的依赖注入
map:property元素的子元素,封装map类型的依赖注入
entry:map的子元素,用于设置一个键值对。
3.2、Bean的实例化
3.2.1、构造方法实例化
3.2.2、静态工厂实例化
3.2.3、实例工厂实例化
3.3、Bean的作用域
3.4、Bean的生命周期
3.5、Bean的装配方式
3.5.1、基于XML配置的装配
3.5.2、基于注解的装配
- 1、@Component(“annotationUser”)
或者@Component(value=‘annotationUser’);@Value(“chenheng”)给属性uname赋值。
配置文件中配置注解:
<context:componnet-scan base-package="Bean所在的包路径"></context:componnet-scan>
-
2、@Repository
该注解用于将数据访问层(DAO)的类标识为Bean,即注解数据访问层BEan,其功能与@Component相同。 -
3、@Service
该注解用于标注一个业务逻辑组件类(Service层),其功能与@Component相同 -
4、@Controller
该注解用于标注一个控制器组件类(SpringMVC的Controller),其功能与@Component相同。 -
5、@Autowired
该注解可以对类成员变量、方法及构造方法进行标注,完成自动装配的工作。通过使用@Autowired来消除setter和getter方法。默认按照Bean的类型进行装配。 -
6、@Resource
该注解与@Autowired的功能一样,区别在于该注解默认按照名称来装配注入的,只有当找不到与名称匹配的Bean时才会按照类型来装配注入;而@Autowired默认按照Bean的类型进行装配,如果想按照名称来装配注入,则需要和@Qualifier注解一起使用。
@Resource有两个属性,name和type,name是指定Bean实例名称,type指定Bean实例类型。 -
7、@Qualifier
该注解与@Autowired注解配合使用。当@Autowired注解需要按照名称来装配注入时需要和该注解一起使用,Bean的实例名由@Qualifier注解的参数指定。
4、Spring AOP
4.1、Spring AOP的基本概念
4.1.1、AOP的概念
-
AOP:面向切面编程,基本单元是Aspect(切面);Struts2的拦截器设计就是基于AOP。
-
OOP:面向对象编程,基本单元是类
-
OOP可以通过封装或继承的方式达到代码的重用,但是仍然有同样的代码分散在各个方法中,因此采用OOP处理日志记录、性能统计、安全控制、事务处理、异常处理等操作不仅增加了开发者的工作量,而且提高了升级维护困难。为了解决此类问题,AOP思想应运而生。
-
AOP采取横向抽取机制:即将分散在各个方法中的重复代码抽取出来,然后在程序编译或者运行阶段将这些抽取出来的代码应用到需要执行的地方。
-
OOP采用的是纵向重用。
-
AOP不是OOP的替代品,而是OOP的补充。
AOP原理:
- 将复杂的需求分解出不同方面,将分散在系统中的公共功能集中解决
- 采用代理机制组装起来允许,在不改变原程序的基础上对代码进行增强处理,增加新的功能。
4.1.2、AOP的术语
切面:封装横切到系统功能(例如事务处理)的类
连接点:程序运行中的一些时间点,例如方法的调用或异常的抛出。
切入点:需要处理的连接点。在Spring AOP中,所有的方法执行都是连接点,而切入点是一个描述信息,他修饰的是连接点,通过切入点确定哪些连接点需要被处理。
通知 :由切面添加到特定的连接点的一段代码。
引入:允许在现有的实现类中添加自定义的方法和属性。
目标对象:所有被通知的对象。
代理:通知应用到目标对象之后被动态创建的对象。
织入:将切面代码插入的目标对象上,从而生成代理对象的过程。
4.2、动态代理(未更)
4.2.1、JDK 动态代理
4.2.2、CGLIB动态代理
4.3、基于代理类的AOP实现
4.3.1、通知类型
- 环绕通知:在目标方法执行前和执行后实施增强,日志记录 事务处理等功能
- 前置通知:目标方法执行前实施增强,可应用于权限管理等功能。
- 后置返回通知:目标方法成功执行后实施增强,关闭流,删除临时文件等功能。
- 后置(最终)通知:目标方法执行后实施增强,可以应用与释放资源。
- 异常通知:在方法抛出异常后实施增强,处理异常,记录日志等功能。
- 引入通知:在目标类中添加一些新的方法和功能,应用于修改目标类(增强类)。
4.3.2、ProxyFactoryBean
4.4、基于XML配置开发AspectJ
4.5、基于注解开发AspectJ
实例步骤:
上面的配置文件是xml的配置,现在使用java配置来配置:
5、Spring 的事务管理
5.1、Spring的数据库编程
5.1.1、Spring JDBC的配置
配置文件:
5.1.2、Spring JdbcTemplate常用方法
5.2、编程式事务管理
在代码中显式调用 beginTransaction commit rollback 等与事务处理 相关的方法 ,这就是编程式事务管理。当只有少数事务操作时,编程式事务管理才比较合适。
5.2.1、基于底层API的编程式事务管理
5.2.2、基于TransactionTemplate的编程式事务管理
5.3、声明式事务管理
Spring 的声明式事务管理是通过AOP 技术实现的事务管理,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
声明式事务管理最大的优点是不需要通过编程的方式管理事务,因而不需要在业务逻辑代码中掺杂事务处理的代码,只需相关的事务规则声明便可以将事务规则应用到业务逻辑中。通常情况下,在开发中使用声明式事务处理不仅因为其简单,更主要的是因为这样使得纯业务代码不被污染,极大地方便了后期的代码维护。
缺点:最细粒度只能作用到方法级别,无法做到代码块级别。可以让代码块独立为方法就可以解决这个问题。
5.3.1、基于XML方式的声明式事务管理
Spring 框架提供了 tx 命名空间来配置事务,提供了<tx:advice>元素来配置事务的通知。在配置<tx :adv ce>元素时一般需要指定 id 和transaction-manager 属性,其中 id 属性是配置文件中的唯一标识, transaction-manager 属性指定事务管理器。。另外还需要<tx:attributes >子元素,该子元素可配置多个<tx:method>子元素指定执行事务的细节。
5.3.2、基于@Transactional 注解的声明式事务管理
5.3.3、事务失效
代码中使用try。。catch处理了异常,程序执行到异常代码的时候可以继续执行下面的,所以事务失效。
即是没有处理异常,事务也失效。
默认在运行时抛出异常事务才会处理,要想所有异常都能处理,那么就在后面加上如下语句。
使用注解还是要注意事务失效的情况,所以遇到checked类型的异常,要指定注解的属性值。
下一篇:MyBatis