1 Spring简介
1.1简介
spring 框架的雏形,最初的版本 interface21 Rod Johnson 创始人 音乐学博士
Spring 理念 使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架
SSH struct2+spring + hibernate
SSM springMVC+ spring +mybatis(目前要学的是这一套)
官网和源码地址 github地址
1.2优点
开源免费框架(容器)
轻量级,非入侵式框架
控制反转(ioc),面向切面编程(AOP)
支持事务的处理,对框架整合的支持
结构
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
1.3七大功能模块![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/aba35b743a210fd9c1a02dabcedd0116.png)
1.4扩展
Spring boot
快速开发脚手架
基于springboot开源快速开发单个微服务
约定大于配置(约定的规范优先,可以降低配置文件的使用)
spring cloud
基于springboot实现,
学springboot要学spring和springmvc
2. IOC理论推导 控制反转
ioc原型(类似于工厂模式,使用一个set对类内部使用的接口完成动态的绑定,从而可以满足用户的动态增长的需求)
3. IOC本质
两种不同的服务模式:程序控制对象的创建,用户控制对象的创建
控制反转是一种设计的思想,DI(依赖注入)是实现IOC的一种方法 其实就是一个解耦的过程
spring容器在初始化时先读取配置文件,根据配置文件或者元数据 创建与组织 对象并存入容器中,程序使用的时候从IOC容器中取出需要的对象
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring之后,对象是由Spring来创建的
反转:程序本身不创建对象,而变成被动的接收对象
依赖注入:利用set方法来进行诸如
ioc是一种通过描述(xml或者注解)并通过第三方去生产或获取特定对象的方式。在spring中实现控制反转是ioc容器,其实现方法是依赖注入(Dependency injection,DI)
4. IOC创建对象的方式
4.1 使用无参构造方法构造函数 默认方式
4.2 使用有参构造方法
- 使用下标赋值 需要使用
- 使用参数的类型 当有两个参数是一个类型的时候会出现问题 所以不建议使用
- 直接通过参数名
在没有使用getbean方法的时候 只要这个xml文件中有使用注册过,那么里面的对象就已经被实例化了 也就是说,在配置文件加载的时候,容器中管理的对象就已经被初始化了 配置文件中不同的类但是他们内存里是同样的,也就是两个对象用==判断是true
5.Spring配置
5.1 别名 alias
<alias name="id name" alias="new name"/> 别名在getbean的时候使用
5.2 bean的配置
id :bean的唯一标识符 相当于对象名
class :bean对象所对应的全限定名,即包名加类名
name:也是别名,且name更高级可以取多个别名
5.3 import
团队开发使用 将多个配置文件导入
这样的话使用的时候配置总的配置就可以了
6.DI 依赖注入
-
构造器注入
官方推荐 可以避免空值
<constructor-arg name=“变量名” value/ref=啥啥啥> -
Set方式注入
依赖注入:set注入
依赖:bean对象的创建依赖于容器
注入:bean对象中的所有属性,由容器来注入不同的类型的注入 常规类型可以直接使用value,对象使用ref, 数组使用<property name="books"> <array> <value></value> </array></property>; 列表把array换成list就可以了; map使用<property name="card"> <map> <entry key="an test" value="some string"/> </map></property> set使用<set> <value>lol</value> <value>coc</value></set> 注入空值,value的地方直接写<null/> Properties类 <props> <prop key="学号">0203</prop> <prop key="姓名">张三</prop></props>
-
扩展方式注入
p命名空间注入 简化set注入方法 需要先导入p命名空间 xmlns:p=balbabalabbalbalabalabala
<bean id="user" class="com.feng.pojo.User" p:name="dsaf" p:age="21"/>
c命名空间注入 简化构造器注入方法 需要先导入c命名空间 xmlns:c=balabalabala
<bean id="user" class="com.feng.pojo.User" c:name="dsaf" c:age="21"/>
6.1 bean的作用域![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5cbccfc10dd8da9d3c4549cd557f9f78.png)
单例模式
默认情况下就是单例模式
也可以直接显式的指定 在bean 后面加一个scope="***"
java class中的不同的对象指向同一个bean的时候,是同一个对象
原型模式
不同对象指向同一个bean会分别进行新建
另外的是在web中使用
7 Bean的自动装配
自动装配是spring满足bean依赖的一种方式
spring在上下文中自动寻找并自动给bean装配属性
在spring中有三种装配的方式
在xml中显式的配置
在java中显式的配置
隐式的自动装配bean
Byname自动装配 autowire=“byname”
byname会在xml上下文中自动查找和自己对象set方法后面的值对应的beanid
Bytype自动装配 autowire=“bytype”
bytype会在xml上下文中自动查找和自己对象属性类型对应的beanid
使用注解自动装配
使用注解需要:
1.导入约束 context约束
2.配置注解的支持
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/> </beans>
在java类中属性前面使用@Autowired ,在装配的时候会自动到配置文件中去查找类型一致的变量;使用了autowired就可以把set方法去除掉了 相当于使用bytype进行装载
autowired有一个required属性 默认为true;说明不能为空,可以改成false,表示属性可以为空值
可以搭配@qualifier使用,@qualifier(value=“bean id”)指定自动装配的变量
类似用法 @Resources 他们的异同:
同:都用来自动装配,可以放在属性字段 都是通过bytype,
异:autowired是由spring提供的,默认是bytype,resource由java提供,默认是byname,但是可以实现bytype ;;;autowired搭配qualifier使用
8. 使用注解开发
必须要保证aop包已经导入了;同时导入context约束,增加注解的支持
8.1 bean
@Component说明这个类被spring管理了,相当于一个bean
8.2 属性是如何注入的
属性前加@Value(value)
8.3 衍生的注解
@Component有几个衍生注解,在web开发中会按照mvc三层架构分层
dao :@Repository 功能和上面的是一样的
service @Service
controller @Controller 这些注解的功能都是一样的
8.4 自动装配置
AUTOWIRED 和resource
8.5 作用域 @Scope(“type”)
8.6 小结
xml和注解
xml更加的万能 适用于任何场合,维护方便简单
注解 不是自己类不能使用 ;维护相对比较复杂
xml和注解最佳实践:
xml来管理bean
注解负责完成属性的注入
在使用的过程中,必须让注解生效,需要注意开启注解的支持
9 使用java 的方式配置spring
不使用xml,全都使用java来做
javaconfig是spring的一个子项目,在spring4之后成为了一个核心功能
定义一个config类,在类前面加上@Configration注解 表明这个类的功能和一个xml文件是一样的;前面xml有自动扫描功能,这里也可以通过在添加一个注解@ComponentScan(foldername)来实现这个功能
在这个类内部使用注解@Bean 就相当于之前写的一个bean标签 id就是这个方法的名字 class属性就是这个方法的返回值类型;函数的返回值就是这个bean对象
可以使用import注释导入其他的注释类
在对这个类进行提取使用的时候;使用 ApplicationContext context= new AnnotationConfigApplicationContext(MyConfig.class); User user=context.getBean(“getUser”,User.class);
10 代理模式
代理模式就是aop的底层 [spring aop 和springmvc必问]
好处:
可以使得真实角色的操作更加的纯粹,不需要关注公共的业务;
公共业务交给了代理角色,实现了业务的分工
公共业务发生扩展的时候,方便集中管理
缺点:
一个真实角色对应一个代理角色;代码量会翻倍
10.1静态代理:代理拥有一个真实角色属性
抽象角色:使用接口或者抽象类来解决
真实角色:被代理的角色
代理角色:代理真实角色,一般会有一些附属的操作
客户:访问代理对象的人
10.2动态代理
角色和上面的一样
有两大类:基于接口的jdk动态代理(视频中用的是这个)和基于类的cglib动态代理;目前用的比较多的是使用java字节码实现的javasist
主要需要了解两个类:proxy和InvocationHandler
11.AOP
11.1什么是aop:
面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
几个概念:
A. 通知
切面的工作被称为通知,通知定义了切面是什么以及什么时候使用,除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题
有五种通知类型
前置通知:在目标方法被调用之前调用通知功能
后置通知:在目标方法完成之后调用通知,不关心方法的输出是什么
返回通知:在目标方法成功执行之后调用通知
异常通知:在目标方法抛出异常之后调用通知
环绕通知:通知包裹了被通知的方法,在被通知的方法调用之前和之后执行自定义的行为
B连接点
C切点
D切面
E引入
F织入
11.2在spring中实现aop
一 使用spring的api接口 通过配置xml环绕完成,需要配置
xmlns:aop="http://www.springframework.org/schema/aop";
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
使用自定义的类
注解方式
12 整合mybatis
编写数据源
sqlsessionfactory
sqlsessiontemplate
需要给接口写一个实现类
把自己写的类注入到spring中,
测试使用
13 事务
- 声明式事务
进行配置
结合aop实现事务
配置事务通知
编程式事务