一. Spring简介
1.1 什么是Spring
Spring是一个Java企业级应用的开源框架。主要用来开发Java应用,Spring的用途不仅限于服务器端的开发。它是一个容器框架,用来装javaBean(java对象),Spring是一个轻重级的控制反转(IoC)和面向切面(AOP)的容器框架
目的: 解决企业应用开发的复杂性
1.2 Spring的好处
- 基于 POJO的轻量级和最小侵入性编程
- 通过依赖注入(DI)和面向接口实现松耦合
- 基于切面(AOP)和惯例进行声明式编程
- 通过切面和模板减少样式代码
二. Bean容器
通过容器统一管理对象的生命周期
(1)减少对象创建、销毁的步骤,提高了效率
(2)可以统一管理对象之间的依赖关系
Bean配置项
- scope:singleton(单例)和 prototype(原型)
- 静态工厂方法
- 实例工厂方法
singleton:单例方式,每个容器只有一份
prototype:平时new的方式,每次调用getBean() 都会得到一份新的bean
三. IoC 控制反转
bean对象从程序自行管理的方式,转变为Spring容器管理,控制权发生了反转
优势: 容器统一管理bean对象,对象解耦
四. DI 依赖注入
依赖注入,是IOC的一个方面,不用创建对象,而只需要描述他如何被创建,不在代码里面直接组装组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后IOC容器负责组装
bean对象设置属性的依赖关系
注入方式:
1.属性注入
2.构造方法注入:构造器依赖注入通过容器触发一个类的构造器实现,该类有一系列的参数,每个参数代表一个对其他类的依赖
五. Bean、IoC、DI 的原理
反射和字节码技术
字节码技术:java编译为class字节码文件时,可以在生成的字节码中,注入自己的逻辑
六. Spring生命周期
- Spring容器从 XML 文件中 读取 bean 的定义,并实例化bean
- Spring根据 bean 的定义填充所有的属性
- 如果 bean 实现了BeanNameAware 接口,Spring传递bean的ID到 setBeanName方法
- 如果bean 实现了 BeanFactoryAware 接口,Spring传递beanfactory给 setBeanFactory 方法
- 如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext方法,传入Spring上下文
- 如果bean关联了BeanPostProcessor接口,Spring会在postProcesserBeforeInitialization() 方法内调用它们
- 如果Bean在Spring配置文件中配制了init-method属性会自动调用其配制的初始化方法
- 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法
- 最后如果Bean配制了destroy-method属性,会自动调用其配置的销毁方法
七、@SpringBootApplication
这个注解是Spring Boot
项目的基石,创建Spring Boot
项目之后会默认在主类加上
我们可以把这个注解看作是@Configuration
、@EnableAutoConfiguration
、@ComponentScan
注解的集合
这三个注解的作用为:
@Configuration
:允许Spring上下文中注册额外的Bean或导入其他配置类@EnableAutoConfiguration
:启动SpringBoot的自动配置机制@ComponentScan
:扫描@Component(@Service,@Controller)
注解的bean,注解默认会扫描该类所在的包下的所有的类
八、Spring Bean
相关的注解
8.1 @Autowired
自动导入对象到类中,被注入进的类同样要被Spring容器管理
比如:Service
类注入到Controller
类中
8.2 @Component
、@Repository
、@Service
、@Controller
@Component
:通用的注解,可标注为任意类Spring的组件@Repository
:对用DAO层,数据库操作@Service
:对应服务层:涉及一些复杂的逻辑,需要用到DAO层@Controller
:对应SpringMVC控制层,主要用户接受用户请求并调用Service层返回数据给前端页面@Configuration
:设置配置类@Bean
:使用在方法上,表示注册一个名称为方法名的bean对象到容器中
8.3 Bean 的使用:装配、注入
@AutoWired
:spring的注解@Resource
:jdk的注解,是一个规范,Spring是实现了这个规范@Bean
所在的方法,以方法参数进行注入
如果是同一个类型Bean 注册了多个对象到容器中,装配时,指定Bean的名称
(1)AutoWired
+@Qualifier
(2)@Resource(name = “bean的名称”)
九. Spring MVC
@Controller
:类上使用,表示定义处理客户端请求的Bean@RestController
:和@Controller作用一样,但是所有方法都是默认有@ResponseBody的效果
9.1 响应相关的
@ResponseBody
:返回的Content-Type响应头为application/ json- 不带
@ResponseBody
注解,需要返回字符串,表示静态资源路径
统一的异常处理:配置@ControllerAdvice+@ExceptionHandler统一拦截在Controller请求方法中抛出的异常
统一的拦截器:@Configuration+实现WebMvcConfigurer接口,处理的路径映射,只要匹配路径的请求,统一会调用拦截器方法
9.2 请求相关的
@RequestMapping
:以使用在类、方法上,表示客户端请求的配置(包括uri、请求方法、数据类型)@RequestParam
获取请求数据
不加注解,默认就是@RequestParam
类型可以是封装数据类型,自定义类型
请求数据中,键和自定义类型属性匹配,和封装类型直接匹配
接受url中的数据,x-www-form-urlencoded(表单默认的提交方式),form-data- 直接注入
HttpServletRequest
和HttpServletResponse
@PathVariable
:获取请求路径的变量
十. Spring AOP
- 我们实现统一的业务功能,比如说日志处理、事务处理、访问权限的处理、统计时间的处理 我们可以使用AOP达到目地,这样就不用在每个业务代码里面都加这样的业务代码,只需在一处代码完成就可以了
- 使用AOP的好处是 统一处理,不会侵入业务代码
AOP的原理:
在编译器以及运行期(即时编译),通过织入字节码的方式,生成原有类型的代理类
AOP 的 类型:
静态代理
动态代理
AOP 的实现方式:
(1)JDK的方式:被代理类必须实现接口。基于InvocationHandle
+Proxy
生成代理类 动态代理
(2)CGLIB的方式:被代理类不需要实现接口 动态代理
(3)Aspectj的方式:静态代理
Spring采取的是前两种方式
Spring中的静态代理是自己封装的
十一. Mybatis
- Hibernate 与 Mybatis的区别
Hibernate
是属于全自动ORM映射工具,使用Hibernate
查询关联对象或者关联集合时,可以根据对象关系模型直接获取,所以是全自动的
Mybatis
在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以称为半自动ORM映射工具
- 接口加上
@Mapper
注解,会通过Mybatis
框架生成代理类