1、Spring简介
Spring 是一个轻量级的控制反转(IOC)且面向切片(AOP)的容器框架
官方文档:核心技术 (spring.io)
七大模块:
导入spring maven地址:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
优点:
- 开源免费的框架
- 轻量级、非入侵式的框架
- 控制反转IOC、面向切面AOP
- 支持事务处理,对框架整合的支持
2、Spring组成及拓展
- SpringBoot:快速开发单个微服务、约定大于配置
- Spring cloud:基于Spring boot,企业级开发,前置学习springmvc和spring
- 弊端:发展太久违背了原来的理念,杂糅太多,配置繁琐(配置地狱!)
3、IOC理论推导
IOC原型:set注入,再新增业务后,程序员不用再大量更改代码,新增了dao业务后,不用更改service层,而是在用户test类里面直接set业务类型,相当于程序由原来的主动执行变成了受用户控制的被动执行,这就是控制反转。
4、10C本质
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是loC容器,其实现方法是依赖注入(DependencyInjection,Dl)。
5、HelloSpring
到了现在,我们彻底不用再程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的loC,一句话搞定:对象由Spring 来创建,管理,装配!
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的
反转:程序本身不创建对象,而变成被动的接收对象依赖注入:就是利用set方法来进行注入的.IOC是一种编程思想,由主动的编程变成被动的接收
6、IOC创建对象方式
- 1默认使用无参构造创建
- 2有参构造,通过下标赋值、参数名、参数类型创建
创建bean时就已经实例化了。
7、Spring配置说明
- 别名alias ;
- bean内的配置:
<!--id :bean 的唯一标识符,也就是相当于我们学的对象名class :bean 对象所对应的全限定名:包名 +类型name :也是别名,而且name 可以同时取多个别名
-->
<bean id="userT" class="com.kuang.pojo.UserT" name="user2 u2,u3;u4"><property name="name" value="西部开源"/></bean>
- import导入别的xml文件,应用于多人开发,合成所有的xml文件为一个总的,内容相同的也会被合并。
8、DI依赖注入环境
三种方式注入:
- 构造器注入(之前的做法)
- set方式注入
- 拓展方式注入
例如官网案例的p标签注入:
9、依赖注入之Set注入
10、c命名和p命名空间注入
官方案例解释:
p注入就是特根据特性注入,为set注入;而c注入就是构造器注入:
11、Bean的作用域
- 单例模式:(默认是单例模式,不需要显式设置)
- 原型模式:prototype
每次从容器中get都会产生新对象
- 其余的request、session、application
12、自动装配Bean
- 在xml中显式配置
- 在java中显示配置
- 隐式自动装配 (autowired)
byname会自动查找对象中set方法后面的变量对应的beanID,且要保证id唯一;bytype与byname相似,但是必须类型唯一才能装配;
13、注解实现自动装配
- 注解开发一般比xml更好,配置注解支持<context:annotation-config/>(若不配置则会报错空指针异常)
<?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>
使用注解可以忽略set方法,因为底层是使用反射实现,可以直接使用在属性上,也可以写在set方法上
- nullable,可以使字段为空:
- autowired的required设置:
- 可以使用此注解指定装配对象:
- autowired和qualifier是一套,Resource也可以实现: (可以加name属性来定位)
- 小结:
- 都可以自动装配,都可以放在属性字段;
- @Autowired默认bytype实现,@Resource默认byname,如果找不到就通过bytype,再找不到就报错
- 执行顺序不同
14、Spring注解开发
- bean
@Component
使用组件功能,则不再需要配置bean,直接使用注解扫描 :(@Component放在类上 )
- 属性注入
@Value:
- 衍生注解
@Component有几个衍生注解,在web开发中按照mvc分层:这三个注解都和component等价,只是用于表示mvc分层,都是将类放在容器中装配
- dao
- service
- controller
- 作用域
@Scope
- 小结
- xml万能,适用于任何场合,维护简单方便;
- 注解开发不是自己的类用不了,维护复杂;
- 最佳实践:xml用来管理bean,注解只负责属性注入(只用@value) ;
- 使用时只需要注意开启注解支持:
15、使用JavaConfig实现配置
完全不需要配置文件,只用java类配置,不用xml配置 ;Java Config是spring的一个子项目,spring4后成为核心功能。
官方示例:
创建configjava文件,且配置config文件:
注意@Configuration也是用于将类注册到容器中:
ApplicationContext下的类:
全程没有配置xml文件:
@Import:
- 总结:
实体类用@Component,配置类用@Configuration,(可能还用到@ComponentScan、@Import),纯java配置的方式在spring boot中随处可见。
16、@SpringBootApplication注解 源码追溯
SpringBoot底层逻辑就是Spring扩展而来
17、静态代理模式
- 类似中介
18、静态代理再理解
19、动态代理详解
静态代理缺点就是类增加了,开发效率降低了,动态代理底层是反射,代理类是动态生成的
实现机制氛围里两类:
- 基于接口实现:JDLLK代理
- 基于类实现 :cglib、java字节码
需要了解两个类:Proxy、InvocationHandle
InvocationHandle 需重写invoc方法:
代理类的创建程序:
客户:(动态生成代理)
- 情景2:
万能模板:(创建代理角色)
新增需求(获取日志功能),横向增加需求:
20、AOP实现方式一
需要导入AOP织入依赖包
<!--https://mvnrepository.com/artifact/org.aspecti/aspectiweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectiweaver</artifactId>
<version>1.9.4</version>
</dependency>
配置Spring的xml:
Service:
packagecom.kuang.service;
public interface Userservice {
public void add();
public void delete()public void update(
public void select();
}
log:
Test:
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImp1;
import org.springframework.context.Applicationcontext;
import org.springframework.context.support.classPathXmlApplicationcontext;
public class MyTest {
public static void main(string[] args){
Applicationcontext context = new classPathXmlApplicationcontext( configLocation: "applicationContext.xml");//动态代理代理的是接口UserService userService =(UserService)context.getBean( s: "userService");
userService.add();}}
21、AOP实现方式二
使用自定义类实现AOP:
22、注解实现AOP
23、回顾Mybatis
- mybatis步骤:
环境:
技术:
编写实体类
编写核心配置文件
注册接口
编写接口和实现类
编写Mapper.xml
测试
- 导入jar包:
- junit
- mybatis
- mysql
- spring
- aop织入
- mybatis-spring(new)
24、整合Mybatis方式一
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整 合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 Mapper 和 SqlSession 并注入到 Bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。最终,可以做到应用代码不依赖于 MyBatis。
工程目录:
步骤:
user:
user接口:
userxml:
导入依赖:
xml配置:
spring配置
写实现类:
注入spring:
测试:
25、整合Mybatis方式二
测试类使用usermapper2
26、事务回顾
- 确保完整性和一致性,要么成功要么失败
- ACID原则:原子性、一致性、隔离性、持久性
- 步骤:
- 导入上述24点中依赖
- 建包、类(实体类、接口)
- 导入mybatis配置文件
- 整合spring
- 写实现类(两种方式)
27、Spring声明式事务
spring事务管理分为:
- 声明式事务(AOP),交由容器管理
- 编程式事务 (会改变代码,不考虑)
mybatis-spring – MyBatis-Spring | 简介 (vrd.net.cn)