1、Spring
前期准备
spring framework
官网文档:https://spring.io/projects/spring-framework#overview
中文网站:https://springref.com/
官方下载地址:
Github:https://github.com/spring-projects/spring-framework
maven依赖:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.21</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.21</version>
</dependency>
Spring是一个轻量级、非入侵式的控制反转(IOC)、面向切面(AOP)的框架!
2、控制反转(IOC)
理论推导
思想原型:控制权交到用户手中,实现依赖注入
IOC创建对象
1、默认使用无参构造
2、有参构造方式
- 下标赋值
- 通过类型创建
- 通过参数名设置
在配置文件加载时,容器中管理的对象就已经初始化了
3、Spring配置
alias 别名
bean配置
!--使用Spring来创建对象时,都称为bean-->
<!--类型 变量名 = new 类型()
Hello hello = new Hello();
id = 变量名
class = new 对象
name = 别名,可以定义多个
property 相当于对象的属性
核心:使用set方法实现注入
-->
<bean id="hello" class="com.yangs.pojo.Hello" name="h2 h2,h3">
<property name="str" value="Spring"></property>
</bean>
import:一般用于团队开发使用,可以将多个配置文件合并
4、依赖注入
构造器注入
set注入【重点】
依赖:bean对象的创建依赖容器
注入:bean对象的所有属性,由容器注入
拓展方式注入
可以使用p命名空间和c命令空间
需导入约束
5、bean的作用域 scope
singleton 单例模式(默认)
prototype 原型模式:每次从容器中get时,都会产生一个新对象
其他的(request、application、session)在web中使用
6、Bean的自动装配
Spring会在上下文中自动寻找,并自动给bean装配属性
三种方式:
1、在xml中显示装配
2、在java中显示装配
3、autowire - 隐式自动装配bean【重点】
- byName自动装配:和set方法后面的值对应的bean id。需保证bean id要唯一
- byType:和自己属性类型相同的bean。需保证class唯一
4、使用注解方式
- 需导入约束:context约束
- 开启注解支持
<?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>
- 在属性中使用@Autowired注解,实现自动装配,使用byType方式实现
required 属性 默认为false,为true时,支持null值
@Autowired(required = false)
扩展:@Nullable 标记此注解后,该字段就可以为null值 - @Qualifier(value=“xxx”):如果@Autowired不能唯一自动装配时,需要通过该注解指定id
- @Resource 可以实现自动装配,默认使用byName方式实现,如果找不到名字,就会使用byType方式实现,两个都找不到则报错
name属性,自定义id
@Resource(name=“xxx”)
7、使用注解开发
指定要扫描的包
<context:component-scan base-packages/>
1、bean
@Component
2、属性注入
@Value(“xxx”)
3、@Component 衍生注解
dao @Repository
serivice @Service
controller @Controller
四个注解功能一样,都代表将某个类注册到spring中,装配bean
4、作用域 @Scope
5、最佳实践:
- xml管理bean
- 注解只负责完成属性的注入
8、javaConfig
@Configuration 也会被spring容器托管,注册到容器中,本质也是一个@Component
代表一个配置类,相当于beans.xml
9、代理模式
SpringAOP 底层
代理模式分类:
- 静态代理
- 动态代理
静态代理
优点:
- 使真实角色更纯粹,不用关注一些公共业务【单一职责】
- 公共的处理交给代理角色,实现业务分工
- 公共业务发送扩展时方便集中管理
缺点:一个真实角色就对应一个代理角色,代码量会翻倍
动态代理
动态生成的代理角色
分类:基于接口、基于类
本质:反射机制
Proxy --代理
InvocationHandler --接口,调用处理程序
优点:
一个动态代理类可以代理多个类,只要实现了同一个接口即可
10、AOP切面
导包 aspectjweaver
配置文件导入aop的约束
切入点、环绕增强
11、整合Mybatis
DataSource、sqlSessionFactory
1、sqlSessionTemplate
2、sqlSessionDaoSupport
12、声明式事务
编程式事务:改变原有的代代码逻辑
声明式事务:通过AOP横切进去,不影响原有的代码逻辑