目录
2.Xml配置方式依赖注入{DI:Dependency Injection}
4.注解方式注入{DI:Dependency Injection}
Spring是什么
Spring是一个轻量级的,IOC和AOP一站式的Java开发框架,是为了简化企业级应用开发而生的,可以视其为框架的框架,因为它为各种框架提供了支持,例如 Struts,Hibernate,Tapestry,EJB,JSF 等。从广义上讲,可以定义为一种结构,可以在其中找到各种技术问题的解决方案。
Spring框架包含几个模块,如IOC,AOP,DAO,Context,ORM,WEB MVC等
IOC
即Inversion of version,缩写为IOC,是由Spring管理对象而非传统实现中由程序代码直接操控
AOP
Aspect Oriented Programming直译过来就是面向切面编程。AOP是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面.
Spring体系结构(模块)
官网地址:https://spring.io/
Spring Hello World搭建
1.Maven导入spring核心基础jar
2.编写spring配置文件
3.编写一个USER实体类
4.测试spring
IOC(控制反转)
读作“反转控制”(Inverse of Control)更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。
IOC 容器负责对象的实例化、对象的初始化,对象和对象之间依赖关系、对象的销毁、对外提供对象的查找等操作,对象的整个生命周期都是由容器来控制。
我们需要使用的对象都由 ioc 容器进行管理,不需要我们去手动通过 new的方式去创建对象,由 ioc 容器直接帮我们组装好,当我们需要使用的时候直接从 ioc 容器中直接获取就可以了。
正控:若要使用某个对象,需要自己去负责对象的创建
反控:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了 Spring 框架.
Spring Bean管理
1.基于xml配置方式
bean 配置需要 spring 管理的类
id 生成的对象名
class 全类名
name 对象别名,可以为多个
scope :shi
singleton(默认值)在Spring中只存在一个bean示例,单例模式
prototype:原型 getBean()的时候都会new Bean()
request:每次http请求都会创建一个bean,仅用于WebApplicationContext环境
2.Xml配置方式依赖注入{DI:Dependency Injection}
指Spring创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设置给对象
实现IOC需要DI做支持
注入的方式
set方式注入
构造方法注入
3.注解方式实现
开启注解扫描
注解扫描对象
@Component(value="user")等同于<bean id = "user" class = "" ></bean>
@Service
@Responsitory
以上注解都可以实现创建对象功能,只是为了后续扩展功能,在不同的层使用不同的注解标记
@Scope(value = "prototype") 原型
@Scope(value = "singleton") 单例
4.注解方式注入{DI:Dependency Injection}
@Autowired
@Autowired 是 Spring 提供的注解,可以写在字段和 setter 方法上。如果写在字段上,那么就不需要再写 setter 方法。默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的 required 属性为 false。
byType自动注入
该注解默认使用按类型自动装配 Bean 的方式。
byName自动注入
如果我们想使用按照名称(byName)来装配,可以结合@Qualifier 注解一起使用。
需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier的value 属性用于指定要匹配的 Bean 的 id 值。
JDK注解@Resource自动注入
Spring 提供了对 jdk 中@Resource 注解的支持。@Resource 注解既可以按名称匹配 Bean,也可以按类型匹配 Bean。默认按照 ByName 自动注入
byName注入引用类型属性
@Resource 注解指定其 name 属性,则 name 的值即为按照名称进行匹配的 Bean 的 id。
5.注解与XML的对比
注解优点: 方便,直观,高效(代码少,没有配置文件的书写那么复杂)。
注解缺点:以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。
xml 优点是: 配置和代码是分离的,在 xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载。
xml 的缺点是:编写麻烦,效率低,大型项目过于复杂。
Spring数据访问层管理
Spring是个一站式框架:Spring自身也提供了web层的SpringWeb和持久层的 Spring JdbcTemplate。
开发步骤
下载 Spring jdbc 数据访问层 jar 包
导入属性文件
<context:property-placeholder location="config.properties"/>
管理数据源对象
spring管理数据库连接对象
本次采用阿里巴巴数据库连接管理对象
Spring集成Mybatis
Spring 集成 Mybatis 其核心是将 SqlSessionFactory 交由 Spring 管理,并由Spring 管理对 dao 接口的代理实现。
导入mybatis jar包
Spring结合mybatis插件包
配置sqlSessionFactory
指定生成接口代理
在service中注入Dao代理接口,此接口由Spring代理实现
AOP
1.AOP概述
AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,是 java 开发中的一个重要内容。利用 AOP 可以对业务逻辑和非业务逻辑进行隔离,从而使得各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
面向切面编程的好处就是: 减少重复,专注业务;
核心原理:
使用动态代理的方式在执行方法前后或者出现异常的时候做加入相关的逻辑.
使用案例:
事务处理:开启事务,关闭事务,出现异常后回滚事务
权限判断:在执行方法前,判断是否具有权限
日志:在执行前进行日志处理
2.AOP的基本概念
连接点(Joinpoint):类中可以被增强的方法,这个方法就被称为连接点
切入点(pointcut):类中有很多方法可以被增强,但实际中只有 add 和 update被增了,那么 add 和 update 方法就被称为切入点(实际实现的连接点)
通知(Advice): 通知是指一个切面在特定的连接点要做的事情(增强的功能)。通知分为方法执行前通知,方法执行后通知,环绕通知等.
目标(Target): 代理的目标对象(连接点,切入点所在类)
代理(Proxy): 向目标对象应用通知时创建的代理对象
3.springAOP实现
对于 AOP 这种编程思想,很多框架都进行了实现。Spring 就是其中之一,可以完成面向切面编程。
AspectJ 是一个基于 Java 语言的 AOP 框架,它提供了强大的 AOP 功能,且其实现方式更为简捷,使用更为方便, 而且还支持注解式开发。所以,Spring 又将 AspectJ 的对于 AOP 的实现也引入到了自己的框架中。
下载 AOP 相关 jar
AspectJ 中常用的通知有五种类型:
前置通知,后置通知,环绕通知,异常通知,返回通知.
@Before 前置通知:方法执行之前
@After 后置通知:方法执行之后,无论是否出现异常
@AfterReturnning 返回通知:方法成功执行之后通知,出现异常不执行
@AfterThrowing 异常通知:抛出异常之后通知
@Around 环绕通知:方法执行前后都有通知
基于注解方式的实现
启动 AspectJ 支持:<aop:aspectj-autoproxy />
定义通知:
@Component
@Aspect
public class AOPDemo {
@Before("execution(* com.ff.spring.dao.UserDao.*(..))")
public void saveLog(){
System.out.println("saveLog");
}
@AfterThrowing(value = "execution(*com.ff.spring.dao.UserDao.*(..))",throwing = "e")
public void afterthrow(Throwable e){
System.out.println("afterthrow");
}
public void aroundAdvice(ProceedingJoinPoint joinPoint){
try {
//前置通知
Object[] objects = joinPoint.getArgs();
joinPoint.proceed();//调用我们自己的目标方法
//返回通知
} catch (Throwable throwable) {
throwable.printStackTrace();
//异常通知
}
//后置通知
}
}
表达式说明:
Spring事物管理
数据库事务管理?
数据库事务管理就是对一次数据库操作过程中执行的多条语句进行管理,保证一次对数据库操作过程中多条 sql 要么都执行成功,要么都不执行,从而确保数据一致性.
我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操作数据的并不可靠,需要在这种情况下进行回退。
事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态,这些操作要么都完成,要么都取消,从而保证数据满足一致性的要求
Spring 事务管理?
Spring 事务管理就是 spring 框架针对程序中提交事务这部分非业务代码进行分离管理,减轻程序员负担.在程序执行没有问题时,提交事务,出现问题时,回滚事务.
Spring 中的事务管理分为两种形式:
一种是编程式事务,一种是声明式事务.
编程式事务在项目中很少使用,这种方式需要在我们代码中需要提交事务或回滚事务时自己写代码实现.
声明式事务管理建立在 AOP 基础上,本质是对方法前后进行拦截,所以声明式事务是方法级别的。
基于注解实现的 spring 事务管理
Spring 框架,提供事物管理实现类是 DataSourceTransactionManager.
配置事物管理器
注解方式
在类或方法上使用@Transactional标签即可
声明式事务不生效的场景
@Transactional 应用在非 public 修饰的方法上
异常被 catch 捕获导致失效
出现编译期异常
数据库引擎不支持事务