初识Spring
第五章 初识Spring框架
两种方式
继承接口和使用配置文件
Spring 简介 Rod Johnson提出
轻量级框架, Java EE的春天,当前主流框架
目标
使现有技术更加易用,推进编码最佳实践
内容
IoC容器
AOP实现
数据访问支持
简化JDBC/ORM 框架
声明式事务
Web集成
schema:配置Spring框架的某些功能是需要用到的schema文件,对于已经集成的IDE环境(如idea),这些文件不需专门导入。
Spring框架依赖的jar包:
jar包 | 说明 |
---|---|
spring-beans-5.2.2-RELEASE.jar | 包含spring框架管理Bean和配置文件的基本功能 |
spring-core-5.2.2-RELEASE.jar | Spring核心jar包,是其他组件的基本核心,包含Spring的基本核心类 |
spring-context-5.2.2-RELEASE.jar | Spring核心的扩展包,包含大量的工具类 |
spring-expression-5.2.2-RELEASE.jar | Spring框架中一个强大的表达式解析语言,支持在运行时动态解析表达式给对象赋值等功能 |
Spring项目步骤:
- 添加依赖的jar包
- 编写Spring配置文件,在项目的classpath根路径下创建applicationContext.xml
- 编写测试代码通过Spring进行属性注入。
Spring设计理念 Spring是面向Bean的编程
Spring 两大核心技术
控制反转(IoC:Inversion of Control ) /依赖注入(DI:Dependency Injection )
面向切面编程(AOP:Aspect Oriented Programming)
Spring的优点
低侵入式设计
独立于各种应用服务器
依赖注入特性将组件关系透明化,降低了耦合度
面向切面编程特性允许将通用任务进行集中式处理
与第三方框架的良好整合
控制反转 / 依赖注入
将组件对象的控制权从代码本身转移到外部容器
组件化的思想:分离关注点,使用接口,不再关注实现
依赖的注入:将组件的构建和使用分开
执行原理:被动接受spring注入
Spring会根据配置文件中的信息,自动创建对应的实例对象,并通过setter方法为其属性赋值。
如何使用Spring实现“控制反转”?
编写HelloSpring类,输出“Hello, Spring!”
字符串“Spring”通过Spring注入到HelloSpring类中
步骤
添加Spring到项目中
编写配置文件
编写代码获取HelloSpring实例
设值注入
使用bean元素定义一个组件
id属性:指定一个用来访问的唯一名称
name属性:指定多个别名,名字之间使用逗号、分号或空格进行分隔
public class UserServiceImpl implements UserService {
private static final Logger log = Logger.getLogger(UserServiceImpl.class);
public boolean addNewUser(User user) {
log.info(“添加用户 ” + user.getUsername());//记录日志
SqlSession sqlSession = null;
boolean flag = false;
//异常处理
try {
sqlSession = MyBatisUtil.createSqlSession();
if (sqlSession.getMapper(UserMapper.class).add(user) > 0)
flag = true;
sqlSession.commit(); //事务控制
} catch (Exception e) {
log.error("添加用户 " + user.getUsername() + "失败", e); //记录日志
sqlSession.rollback(); //事务控制
flag = false;
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
return flag;
}
}
Spring初始化运行环境实现的方式
一:ApplicationContext是一个接口,负责读取Spring配置文件,管理对象的加载、生成、维护Bean对象与Bean镀锡之间的依赖关系,负责Bean的生命周期等。
-
ClassPathXmlApplicationContext
1.classpath:前缀是不需要的,默认就是指项目的classpath路径下面;
2.如果要使用绝对路径,需要加上file:前缀表示这是绝对路径;
-
FileSystemXmlApplicationContext
1.没有盘符的是项目工作路径,即项目的根目录;
2.有盘符表示的是文件绝对路径.
注意:如果要使用classpath路径,需要前缀classpath:
二:还可以通过BeanFactory接口及其Bean组件实施管理。
面向切面编程(AOP)
所谓面向切面编程,是一种通过预编译和运行期动态代理的方式实现在不修改源代码的情况下给程序动态添加功能的技术(简单来说,只需要关心关联组件的接口定义,不需要关心具体实现) 通过Spring框架灵活配置以替代具体实现。
- 通过代理对象来调用原对象的方法
- 代理对象方法前后都可插入代码,这些代码就是增强处理
AOP的目标:让我们可以“专心做事”
AOP原理 依赖动态代理
- 将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决
- 采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能
AOP相关术语
增强处理(Advice)
- 前置增强
- 后置增强
- 环绕增强、异常抛出增强、最终增强等类型
切入点(Pointcut) 对连接点的特征进行描述,可以使用正则表达式
连接点(Join Point) 程序执行的某个具体的执行点
切面(Aspect) 一个模块化的横切逻辑(横切关注点),可能会横切多个对象
目标对象(Target object) 被一个或多个切面增强的对象
AOP代理(AOP proxy) 由AOP框架所创建的对象,实现执行增强处理方法等功能
织入(Weaving) 将增强处理连接到应用程序中的类型或对象上的过程
Advice(增强处理)
配置元素介绍
怎样使用AOP
实现步骤
- 在项目中添加Spring AOP的jar文件
- 编写前置增强和后置增强实现日志功能
- 编写Spring配置文件,对业务方法进行增强处理
- 编写代码获取带有增强处理的业务对象
增强处理
public class UserServiceLogger {
private static Logger log=Logger.getLogger(UserServiceLogger.class);
public void before(JoinPoint jp) {
log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().
getName() + " 方法。方法入参:" + Arrays.toString(jp.getArgs()));
}
public void afterReturning(JoinPoint jp, Object result) {
log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().
getName() + " 方法。方法返回值:" + result);
}
}
定义切入点
切入点:简单的说,就是连接点的查询条件
<aop:config>
<aop:pointcut id="pointcut"
expression="execution(public void addNewUser(entity.User))"/>
</aop:config>
表达式匹配规则举例
public * addNewUser(entity.User): “*”表示匹配所有类型的返回值。
public void (entity.User): “”表示匹配所有方法名。
public void addNewUser(..): “..”表示匹配所有参数个数和类型。
- com.service..(..):匹配com.service包下所有类的所有方法。
- com.service...(..):匹配com.service包及其子包下所有类的所有方法
织入增强处理
织入:在切入点插入增强处理
<aop:config>
<aop:pointcut id="pointcut"
expression="execution(public void addNewUser(entity.User))" />
<aop:aspect ref="userServiceLogger">
<aop:before method="before"
pointcut-ref="pointcut"></aop:before>
<aop:after-returning method="afterReturning"
pointcut-ref="pointcut" returning="result"/>
</aop:aspect>
</aop:config>