spring框架阶段总结
在框架部分的学习中,更多的是学习如何应用框架,基础逻辑都是使用特定的包里已封装好的方法来实现我们所需的功能,更多的是考验我们对Java基础的理解。
spring框架
spring框架属于轻量级的JavaEE框架,可以用于解决企业应用开发的复杂性,其核心部分主要是IOC(控制反转)和AOP(面向切面),拥有简化开发、方便事物操作、方便测试、方便整合、支持AOP等特点。
主要特点
-
Inversion of Control (IOC) : 控制反转 , spring框架创建对象,管理对象,以及管理对象之间的依赖关系
-
Aspect-Oriented Programming (AOP): 面向切面编程 ,对比OOP(面向对象)
-
dependency injection (DI) :依赖注入 , 通过构造函数,或set方法, 给对象的属性赋值。IOC是通过DI来实现的
-
bean: java类型 , 由spring框架创建的对象,就被称为bean
IOC
即控制反转,是面向对象中的一种设计原则,用于降低计算耦合度,常见方式为依赖注入。在对象被创建的时候,由一个调控系统内所有对象的外部实体将其所依赖的对象的引用传递给它,即依赖被注入到对象中。
AOP
即面向切面编程,是Spring框架中的一个重要内容,也是OOP(面向对象)的延续。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
spring容器
我们通常创建一个实例,往往由程序员new出来,这个控制权在于程序员。而Spring容器则将其控制反转,也就是指new实例工作不由程序员来做而是交给Spring容器来做,bean类交给Spring容器统一管理销毁。
而当我们在使用Spring的bean对象时,会遇到一些情况:
-
当一个对象被频繁的使用时,对内存资源会有较大的消耗。如果使用Spring管理bean类,Spring会默认管理bean是单例模式,所以会避免不断的创建新的实例从而导致并发量很大时垃圾回收效率低的问题。但这样很容易会导致多线程问题
-
或是当一个对象被使用的次数极少,这个时候就没有必要让这个对象一直存在到内存中,可以将spring管理bean的作用域设置为prototype,在每次调用的时候创建一次 ,用完销毁。
因此,使用Spring管理bean对象可以实现对象对资源的有效使用,所以其又被称为工厂模式
spring提供IOC容器实现的两种方式
-
BeanFactory:
IOC容器中最基本实现方式,是Spring内部使用的接口,不提供开发人员进行使用
特点:加载配置文件的时候不会去创建对象,在获取对象(使用)才会去创建对象
-
ApplicationContext:
BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用
特点:加载配置文件时候就会把在配置文件的对象进行创建
spring配置
创建bean对象的配置
-
调用构造函数
-
调用自己的静态方法
-
调用容器中的其他bean的方法创建对象
对象的初始化方式
-
构造函数初始化
-
调用set方法初始化
-
spring容器初始化
bean的属性设置
-
id : bean的唯一标志
-
class :bean的类型
-
factory-method :调用工厂方法,创建对象
-
factory-bean :调用创建对象的bean , 然后再factory-method 设置需要调用的具体的方法。
-
scope:通过scope设置bean对象时单例还是非单例
-
prototype : 非单例, 每次获取到的对象都是一个新的对
-
singleton :单例, 容器创建好这个对象之后,每次你使用都是同一个对象
-
初始化和销毁方法的设置
-
init-method="init" : 创建对象的时候,执行init方法,
-
destroy-method="destroy" : 容器关闭,bean对象就调用其destroy方法
-
默认:scope="singleton
spring容器创建对象的注解
-
@Component:在类前面添加这个注解,spring框架看到这个注解,就会在spring容器中创建对象
-
@Configuration:在类前这个注解,spring框架,看到这个注解,就会在spring容器中创建对象
-
@Bean:一般在方法前面添加这个注解,spring框架会在容器中创建这个对象
-
@Resource: 对于应用类型,可以采用自动装配的功能,让spring容器根据容器中的对象,根据情况赋值
-
@Service:表示给当前类命名一个别名,方便注入到其他需要用到的类中
-
@Controller:被该注解标识的类代表控制器类,这里控制层里面的每个方法,都可以去调用@Service标识的类
@Autowired
自动装配, 为了减少构造器函数初始化对象和set注入初始化对象, 可以使用autowire ,让spring框架的容器对象,自动匹配容器中的其他bean对象,然后给bean进行初始化
spring MVC
SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringMVC也是要简化我们日常Web开发。
springmvc框架的web项目
java中的web项目
-
servlet,重写service方法
-
jsp,显示servlet转发到jsp的数据
-
web.xml,配置servlet的路径
-
servlet,jsp需要在容器中运行,比如把java web项目部署到tomcat中,启动tomcat之后,就可以访问web项目了。
其编码效率比较低:每次都需要写servlet类,然后要做配置,请求参数需要自己获取,自己封装为对应的对象
spring框架中包含了spring webmvc模块。通常把这个模块称为spring mvc框架
-
M-model : 实体类, dao , service ,统称为model
-
V-View : 界面,展示数据
-
C-Controller :控制层, 调用业务层,转发到对应的view
而spring框架中的web项目包含以下内容
-
DispatcherServlet.java , web.xml中配置这个servlet。
-
Controller(程序员写对应的类), jsp (程序员写对应的jsp文件)
-
ViewResolver & jsp ,(jsp的路径配置 , spring.xml配置文件做配置)
-
HandlerMapping(java的Controller类型, 映射为url ,spring.xml配置文件中配置)。可以用注解简化配置:HandlerMapping
spring MVC常用注解
-
@Controller: spring容器创建对象,让 spring容器知道这个类是Controller类型
-
@RequestMapping:
-
@GetMapping : 只支持get请求方式
-
@PostMapping:只支持post请求方式
-
@RequestMapping:可以设置请求方式,不设置的话,所有请求方式都支持
-
-
@RequestParam:用于设置请求参数和Controller中方法的参数的对应关系
注解中的属性
-
value: 设置请求的url地址 如果只设置请求地址,其他都是默认值,那么一般省略value属性
-
method:用于设置请求的方式
-
params: 用于设置必须包含的请求参数
拦截器的使用
重写HandlerInterceptor中的preHandle方法
当发起请求的时候,就会进入到拦截器中的preHanle方法的运行。如果preHandle方法返回值是true,表示不被拦截,继续访问请求。 返回false,表示被拦截了,不能访问请求了
拦截器的配置
在xml文件中配置拦截器,其中
<mvc:interceptors> <!-- 拦截器的配置--> <mvc:interceptor> <!-- 表示,所有的路径都要被拦截--> <mvc:mapping path="/**"/> <!-- exclude: 例外 , 表示那些请求不被拦截--> <mvc:exclude-mapping path="/toLogin"/> <mvc:exclude-mapping path="/login"/> <!-- 静态资源不被拦截--> <mvc:exclude-mapping path="/js/**"/> <mvc:exclude-mapping path="/html/**"/> <!-- 拦截器对应的类型--> <bean class="com.hqyj.interceptor.LoginInterceptor"></bean> </mvc:interceptor> <mvc:interceptor> <!-- 表示只拦截/emp/** --> <mvc:mapping path="/emp/**"/> <bean class="com.hqyj.interceptor.RoleInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
springmvc的执行
-
用户发送请求到前端控制器(DispatcherServlet)
-
前端控制器 ( DispatcherServlet ) 收到请求调用处理器映射器 (HandlerMapping),去查找处理器(Handler)
-
处理器映射器(HandlerMapping)找到具体的处理器(可以根据 xml 配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet
-
前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)
-
处理器适配器(HandlerAdapter)去调用自定义的处理器类(Controller)
-
自定义的处理器类(Controller)将得到的参数进行处理并返回结果给处理器适配器(HandlerAdapter)
-
处理器适配器 ( HandlerAdapter )将得到的结果返回给前端控制器 (DispatcherServlet)
-
前端控制器(DispatcherServlet )将 ModelAndView 传给视图解析器 (ViewReslover)
-
视图解析器(ViewReslover)将得到的参数从逻辑视图转换为物理视图并返回给前端控制器(DispatcherServlet)
-
前端控制器(DispatcherServlet)调用物理视图进行渲染并返回
-
前端控制器(DispatcherServlet)将渲染后的结果返回。
Mybatis
一款半自动的ORM持久层框架,具有较高的sql灵活性,封装了所有jdbc操作以及设置查询参数和获取结果集的操作,支持自定义sql、存储过程和高级映射。
ORM
即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的sql语句打交道,只要像平时操作对象一样操作它就可以了
mybatis的使用
-
编写mapper.xml,书写SQL,并定义好SQL的输入参数,和输出参数
-
编写全局配置文件,配置数据源,以及要加载的mapper.xml文件
-
通过全局配置文件,创建SqlSessionFactory
-
每次进行CRUD时,通过SqlSessionFactory创建一个SqlSession
-
调用SqlSession上的selectOne,selectList,insert,delete,update等方法,传入mapper.xml中SQL标签的id,以及输入参数
基于Mapper代理的要求
-
mapper接口的全限定名,要和mapper.xml的namespace属性一致
-
mapper接口中的方法名要和mapper.xml中的SQL标签的id一致
-
mapper接口中的方法入参类型,要和mapper.xml中SQL语句的入参类型一致
-
mapper接口中的方法出参类型,要和mapper.xml中SQL语句的返回值类型一致
mybatis-plus
mybatis-plus是一款Mybatis增强工具,用于简化开发,提高效率
在正式使用场景中,常将其与springboot搭配使用,使用更加便利,可大大提高开发效率
spring Boot
springBoot是基于spring框架而生的一个更简单、更快捷的框架,解决的大部分spring框架中的缺点
优点
-
独立运行
-
简化配置
-
自动配置
-
无代码生成和xml配置,一切通过注解来实现
-
内嵌服务容器
常用注解
-
@Controller :处理http请求
-
@RestController:返回json格式,相当于结合了@ResponseBody和@Controller两个注解的功能
-
@RequestMapping: 配置url映射
-
@Configuration:可以将配置文件中的配置自动 与实体进行映射
-
@Autowired:自动装配