spring是什么?
spring于2003年兴起的一个轻量级的IOC和AOP的java开发框架,为了简化企业级开发而生的
特点
轻量级:jar包小,运行消耗内存资源小,核心包小
非侵入式
spring框架代码不会侵入到我们的业务代码(用户管理 servlet service dao)
UserSelevt extends HttpServlet(侵入式)
IOC
即Inversion of Control 缩写IOC 控制反转(把什么控制权反转给谁 以前写的代码,哪里需要对象就在哪里new一个对象)
AOP
面向切面 为Aspect(切面) Oriented Programming
开发出了第一版程序 saveStudent(){ }该原来的代码
绑定(配置)
saveLog(){}
后来要在第一版的基础上添加功能(保存日志,管理事务 sqlseesion.commit())
AOP的思想是 可以帮我们动态代理的调用,而不需要修改代码
一站式
它是一个后端管理框架,集基础容器,数据访问(jdbc,事务管理),web(Servlet),Aop为一身的一站式框架
Spring搭建
第一步:导入jar包
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
第二步:创建类
第三步:创建spring配置文件
第四步:测试spring
创建new ClassPathXmlApplicationContext(“spring,xml”);spring容器
获取spring创建的bean对象
注解:
创建对象:
@Component
@Scope
@Repository
@Service
@Controller
注入对象:
@Autowired(required=true)添加在属性,set方法 ,构造方法 是spring提供的注解标签 支持byName byType
@autowired(required=true)默认 注入值不能为空 是根据属性的类型自动注入(根据属性的类型在spring容器中查找) byType
也可以通过对象名查找注入,需要结合@Qualifier(value=" ")
JDK中的注入:
@Resource(name=“对象名”)是JDK自身提供的注解表奇案,也有byName和byType两种注入方式
IOC:spring创建对象
DI:Dependency Injection依赖注入 为创建好的对象属性注入值
构造方法注入
属性set方法注入
注解与xml的对比
注解的优点:方便直观高效(代码量少,没有配置文件那么复杂)
注解的缺点:以硬编码的方式写入java代码中,修改需要重新编译代码
xml的优点:配置和代码是分离的,修改xml代码无需重新编译,直接修改,修改完成之后,
只需要重启服务器即可将新的配置加载
xml的缺点:编写过于麻烦,效率低,大型项目应用过于复杂
Spring JDBC模块
spring是一个一站式框架,提供了对JDBC的管理封装
封装一个JdbcTempate模板类,提供用于执行sql的方法
JDBC模块对数据库事务进行管理
spring数据链接不直接参与和数据库的连接
可以使用一些第三方的组件连接数据库
DECP c3p0 阿里druid(德鲁伊)数据库连接组件 自身还提供了数据库连接池技术 sql监控
三大功能:
1.数据库连接,封装了jdbc
2.数据库连接池 频繁的连接数据库
创建销毁连接对象 Connection SqlSession 开销大
创建一个连接对象的池子 与数据库交互时,
可以先从连接池中获取连接
用完后不进行销毁,只是还回到连接池中 减少创建销毁的开销
让spring来管理创建Druid数据库连接对象
jdbcTemplate中常用的方法
execute:无返回值,可执行ddl,增删改语句
updata:执行新增、修改 删除语句
queryFor...:执行查询相关语句
不适用AOP的开发方式
先定义好接口与一个实现类,该实现类中除了要实现接口中的方法外,还要再写两个非业务方法,非业务方法也称为交叉业务逻辑;
doTransaction():用于事务处理
doLog():用于日志处理
然后,在使用接口口调用它们,接口的方法也称为主业务逻辑
AOP概述
AOP为面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术
AOP是OOP的延续,是软件开发中的一个热点也是Spring框架中的一个重要的内容,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
AOP OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想,OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果,这两种设计思想在目标上有着本质的差异
面向切面编程的好处就是:减少重复,专注业务
注意 :面向切面编程知识面向对象编程的一种补充
核心原理
使用动态代理的方式在执行方法前后或者出现异常的时候做加入相关的逻辑
使用案例
事务处理:开启事务,关闭事务 出现异常后回滚事务
权限判断:在执行方法前,判断是否具有权限
日志:在执行前进行日志处理
AOP的基本概念
连接点:类中可以被增强的方法,这个方法就叫连接点
切入点:类中有很多方法可以被增强,但实际只有add和update被增加了,那么add和update方法就被称为是切入点
通知:在连接点上要做的事情(分为:前置通知 后置通知 异常通知 环绕通知 最终通知)
切面:把通知添加到连接点的过程
目标:要增强的类
代理:向目标对象应用通知之后创建的代理对象
springAOP实现
对于AOP这种编程思想,很多框架都进行了实现,spring就是其中之一,可以完成面向切面编程
然而,AspectJ也实现了AOP的功能,AepectJ是一个基于Java语言的AOP框架,它提供了强大的AOP功能,且其实现方式更为简捷,使用更为方便,而且还支持注解式开发,所以Spring又将AspectJ的对于AOP的实现方式也引入到了自己的框架中
在Spring中使用AOP开发时,一般使用AspectJ的实现方式
AspectJ是一个优秀面向切面的框架,它扩展了java语言,提供了强大的切面实现
spring事务管理
事务可以看做是由对数据库若干操作组成的一个单元
我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多部操作的结合,由于数据操作在顺序执行的过程,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,要么都取消,从而保证数据满足一致性的要求
Spring中的事务管理分为两种,一种是编程式事务,一种是声明式事务
编程式事务在项目中很少使用,这种方式需要注入一个事务管理对象TransactionTemplate,然后在我们代码中需要提交事务或回滚事务时自己写入代码实现
声明式事务管理建立在 AOP 基础上,本质是对方法前后进行拦截,所以声明式
事务是方法级别的。
…
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>provided</scope>
</dependency>
<!-- mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- 阿里数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--spring-mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!--gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>