Spring
1.1简介
Spring:顾名思义:春天 ----》给软件带来了春天
maven
//maven库
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
1.2优点
- Spring是一个开源的免费的框架(容器)!
- Spring是一个轻量级、非入侵式的框架
- 控制反转(IOC),面向切面编程(AOP)
- 支持事务的处理,对框架整合的支持!
总结:Spring就是一个轻量级的控制反转(IOC)和面向切面变成(AOP)的框架!
1.3、 组成
1.4 拓展
在Spring的官网有这个介绍:现代化的Java开发!说白就是基于Spring的开发
SpringBoot
一个快速开发的脚手架
基于Springboot可以快速的开发单个微服务
约定大于配置
Spring Cloud
基于SpringBoot实现的
因为大多数公司都在使用SpringBoot进行快速开发,学习SpringBoot的前提是SpringMVC和Spring
弊端:发展了太久了之后,违背了原来的理念!配置十分繁琐,人称"配置地狱"
2.IOC理论推导
1.UserDao接口
2.UserDapImpl实现类
3.UserService业务接口
4.UserServiceImpl业务实现类
在之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码!如果程序代码量十分大,修改一次的成本代价十分昂贵
使用一个Set接口实现。发生了革命性的变化!
private UserDao useDao;
//利用set进行动态实现值的注入!
public void setUserDao(UserDao userDao){
this.userDao =userDao;
}
之前,程序是主动创建对象!控制权在程序员手上
使用set注入后,程序不再具有主动性,而是变成了被动的接受对象!
这个思想,从本质上解决了问题,程序猿就不用再去管理对象的创建。
系统的耦合性大大降低,可以更加专注的在业务的实现上!这就是ioc的原型!
Ioc是Spring框架的核心内容,使用多种方式完美实现Ioc,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IOC
Spring容器在初始化时要先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从IOC容器中去除需要的对象
采用XML方式配置Bean的时候,Bean的定义信息和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入
总结:对象由Spring来创建,管理,装配!
Spring配置
-
别名
设置别名一样能得到值 -
Bean的配置
id: bean的唯一标识符,也就是相当于我们学的对象名
class:bean对象所对应的全限定名:包名+类型
name:别名,name比alias高级,可以同时取多个别名
scope:设置单例等模式 -
import
这个import,一般用于团队开发使用,可以讲多个配置文件导入,合并为一个
依赖注入
-
构造器注入
-
set方式注入【重点】
依赖注入:set注入
依赖:bean对象的创建依赖于容器
注入:bean对象中的所有属性,由容器来注入!
环境搭建:
1、复杂类型
2、真是测试对象
- 拓展方式注入
使用p命名 (properties)和使用c命名(construct-org)
注意:p命名和c命名空间不能直接使用,需要导入xml约束
xmlns:p=“http://www.springframework.org/schema/p”
xmlns:c=“http://www.springframework.org/schema/c”
Bean的作用域
Scopes:
singleton:单例(Spring默认机制)
prototype:原型
每次从容器中get的时候,都会产生一个新对象!
3. request、session、application、websocket这个只能在web开发中使用
Bean的自动装配
~自动装配是Spring满足bean依赖的一种方式
~Spring会在上下文中自动寻找。并自动装配属性!
~在Spring中有三种装配的方式
1.在xml中显示的配置
2、在java中显示配置
3.隐式的自动装配
byname:会自动在容器中查找,和自己对象set方法后面的值对应的beanid!(名字对应)
byType:会自动在容器中查找,和自己对象属性类型相同的bean!(保证类型全局唯一)
小结:
byname的时候,需要保证所有的beanid唯一,并且这个bean需要和自动注入的属性的set方法的值一致
bytype的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致!
注解实现自动装配
jdk1.5支持,Spring2.5支持注解
要使用注解须知:
1.导入约束 context约束
2.配置注解的支持:
xmlns:context=“http://www.springframework.org/schema/context”
context:annotation-config/ //开启注解支持
@Autowired
直接在属性上使用即可!也可以在set方式上使用!
使用Autowired我们可以不用编写Set方法,前提是这个自动装配的属性在IOC(Spring)容器中存在,且符合名字byname
@Autowired(required="")//如果显示了定义了autowired的required属性为false,说明这个对象可以为null,否则不许为空
@Nullable 字段标记了这个注解,说明这个字段可以为null
如果@Autowired自动装配的环境比较负责,自动装配无法通过一个注解@Autowired完成的时候,我们可以@Qualifier(value=“xxx”)去配置@Autowired的是使用,指定一个唯一的bean对象注入!
小结:
@Resource和@Autowired的区别:
都是用来自动装配的,都可以放在属性字段上
@Autowired通过byType实现,而且必须要求对象存在【常用】
@Resource默认通过byname的方式实现,如果找不到名字,则通过byType实现。如果两个都找不到的情况下,就报错【常用】
执行顺序不同:
@Autowired通过byType
@Resource默认通过byname的方式实现
使用注解开发
在Spring4之后,要使用注解开发,必须要导入aop
使用注解需要导入context约束,增加注解的支持!
1.bean
<context:component-scan base-package=“com.lkd.User”/> //扫描包
context:annotation-config///约束
@component:自动装配通过名字
在类上加入@Component注解等价于<bean id="User" class="com.lkd.pojo.User"/>
2.属性如何注入
在字段加@Value注解,可以显示值
3.衍生的注解
@Component有几个衍生注解,我们在web开发中,会按照MVC三次架构分层
dao 【@Repository】
Service【@Service】
Controller【@Controller】
4。自动装配注解
@Autowired
5.作用域
@scope
6.小结
xml与注解:
xml更加万能,使用于任何场景,维护简单方便
注解不是自己类,维护相对复杂
xml和注解最佳实践:
xml用来管理bean
注解只负责属性的注入
我们使用的过程中,只需要注意一个问题:必须让注解生效,就需要开启注解的支持
使用Java的方式配置Spring
我们现在要完全不适用Spring的xml配置,全权交给Java来
JavaConfig是Spring的一个子项目,在Spring4之后,它成为了一个核心功能
AOP
代理模式
为什么要学习代理模式?
因为这既是SpringAOP的底层!【SpringAOP 和SpringMVC】
代理模式的分类:
静态代理
动态代理
代理模式的好处:
可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
公共也就交给代理角色!实现了业务的分工
公共业务发生扩展的时候,方便集中管理!
缺点:
一个真实角色就会产生一个代理角色;代码量就会翻倍~开发效率会变低
动态代理
动态代理和静态代理角色一样
动态代理的代理类是动态生成的,不是我们直接写好的!
动态代理分为两大类:基于接口的动态代理,基于类的动态代理
基于接口–JDK动态代理
基于类:cglib
java字节码实现:javasist
了解两个类:proxy 和 InvocationHandler:调用处理程序
AOP
1.什么是AOP?
面向切面编程,通过预编译方式和运行期动态代理实现功能的统一维护的一种技术。
2,AOp在Spring中的作用
提供声明式事务;允许用户自定义切面
横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志,安全,缓存,事务等等
切面(ASPECT):横切关注点被模块化的特殊对象。即,它是一个类
通知(Advice):切面必须要完成的工作。即,它是类中的一个方法
目标(Target):被通知对象
代理(Proxy):向目标对象应用通知之后创建的对象
切入点(PointCut):切面通知执行的"地点"的定义
连接点(JointPoingt):与切入点匹配的执行点
使用Spring实现AOP
【重点】使用AOP植入,需要导入一个依赖包
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
<scope>runtime</scope>
</dependency>
整合Mybatis
步骤:
1.导入jar包
junit
mybatis
mysql数据库
Spring相关的
aop织入
mybatis-Spring 【new】
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<!--Spring操作数据库的话,还需要一个Spring-jdbc-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
</dependencies>
2、编写配置文件
3.测试
回忆mybatis
- 编写实体类
- 编写核心配置文件
- 编写接口
- 编写Mapper.xml
- 测试
Mybatis-Spring
会帮助你将Mybatis代码无缝地整合在Spring中
\
- 编写数据源
- SqlSessionFactory
- SqlSessionTemplate
- 需要给接口增加实现类
- 将自己写的实现类,注入到spring中,
- 测试
声明式事务
1、回顾事务
把一组业务当成一个业务来做;要么都成功,要么都失败
事务在项目开发中十分重要,涉及到数据的一致性问题,不能马虎!
确保完整性和一致性
事务ACID原则:
原子性
一致性
隔离性:多个业务可能操作同一个资源,防止数据损坏
持久性:事务一旦提交,无论发生什么问题,结果都不会被影响,被持久化的写到存储器中
2、Spring事务
1.标准配置
开启Spring的事务处理功能,在Spring的配置文件中创建一个DataSourceTransactionManager
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource"/>
</bean>
2.声明式事务
3.编程式事务
为什么需要事务?
如果不配置事务,可能存在数据提交不一致的情况下
如果不在Spring中去配置声明式事务,我们需要在代码中手动配置
事务在项目开发中很重要