常用注解
使用需要开启注解支持
组件(除springBoot需要component-scan)
@Repository/@Mapper(数据访问层) @Service(服务层) @Controller(控制层) @Configuration(代替.xml成为bean的配置类) @Component(其余组件)
bean属性自动装配
@Autowired(需注入值的地方) @Qualified(被注入值的地方) @Value(注入值)
作用域
@Scope
url映射位置
@RequestMapping
@mapper和@repository:
@Mapper是mybatis提供的注解,用于实现数据库功能。在 Spring 程序中,Mybatis 需要找到对应的 mapper,在编译的时候动态生成代理类。
@repository则是spring整合mybatis的注解,用于spring容器定位数据访问层
SpringMVC
MVC初解(源自百度百科)
V是view,即前端页面,如html
C是controller,用于接受需求及参数,调用模型,获取响应数据,并返回添加上数据的视图
M即模型,是数据和处理数据的算法。划分模型区域的最佳方法是根据其特性:模型的代码只用写一次就可以被视图重用。
springMVC框架原理:
用户提出请求,DispatcherServlet根据url调用HandlerMapping,经过和调用返回解析信息,DispatcherServlet使用HandlerAdapter,HandlerAdapter根据信息选择Controller,Controller调用数据库实现模型并返回视图逻辑名给DispatcherServlet,Servlet根据结果调用试图呈现
属性传递
@RequestParam:以拼接字符串的方式,把参数装入get类型的URI,value用于在前端表单名和后端实体属性名不同时使用,required用于在无参时自动赋予null值,但注意传入的是int型时会报错,因为只有包装类型可以赋值null
数据回传通常使用Model,也可以通过@RestController
数据从前到后通过post,要求提交的表单中各项name
和对象的属性名一致 ,如果表单项没有而后端参数存在的方法会默认赋予null值,可以用对象承接,对象中没有被赋值的自动复制于null
控制器返回的方法(JavaGuide)
Controller 返回一个页面
单独使用 @Controller 不加 @ResponseBody的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。
@RestController 返回JSON 或 XML 形式数据
但@RestController只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。
@Controller +@ResponseBody 返回JSON 或 XML 形式数据
如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用@Controller 并结合@ResponseBody注解,也就是说@Controller +@ResponseBody= @RestController(Spring 4 之后新加的注解)。
@RequestMapping:接收请求,默认不限种类,包括get,post,Head等
@GetMapping():等价于@RequestMapping(method = RequestMethod.Get )
Spring
IOC/DI
参考
https://blog.csdn.net/ivan820819/article/details/79744797
出现原因
面向对象的出现使得内部透明,外部引用变简单,但与此同时对象间的调用情况依旧复杂,如何降低对象间甚至模块间的功能耦合成为焦点
作用
把对象管理交给容器。
如果对象A需要对象B,由容器完成对象B的初始化和调用,直接注入到对象A。所以从另一个方面描述这件事,这被称为依赖注入。
实现
通过获得类名,容器可以
缺陷
工作流程
具体应用
AOP
作用和定义
面向切面编程,即把经常用到的附属代码装入,在需要的对象对应位置切入切面,从而简化开发,降低耦合。
关键名词
joint point,是所有可能需要切面的对象
point cut,是对象是否真正需要切面的判断逻辑代码块
advice,通过point cut判断的就可以执行advice了
aspect,point cut和advice组合名词
advice常用api
before:在advice执行前先执行,但不可以跳过advice
after return:在返回值后执行
after throwing:在抛出异常后执行
after:在advice执行后必定执行,包含前两者
around:包含前面所有,前后都执行
Spring的自动装配:
功能
在前端传入表单或后端mybatis对应数据表,与对象的单个属性或集体相同时,可以以对象来替代,而不用写多个参数
自动装配流程:
1 配置文件中加入annotation-config开启注解支持(springBoot不需要)
2 在需要的类上加入组件注释之一
3 注入属性
4 在需要使用的的地方声明,在头上通过@Autowired()实现注入
关于属性注入
对于组件类属性的注入,直接注释后就可以被装配,而对于实体类属性的注入则通常有以下三种方法:
前提条件:pojo类型写好set方法或构造方法
对于Spring
1 被注入的实体类bean
对于SpringBoot
2 @PropertySource(value = “classpath:XXX.properties”)利用配置文件注入属性
3 在实体类上的属性添加@Value("")
关于@Autowired
1 Autowired使用byName查找,属性的名称应对应实体类setxxx中xxx,大小写都可以
2 (required==“false”)可以在没有属性可以注入时照常运行,否则会报NullPointer
3 多个同类型属性bean需用@Qualified()指定
4 启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowired、@Resource(是CommonAnnotationBeanPostProcessor后置处理器处理的)或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性
(https://www.cnblogs.com/fnlingnzb-learner/p/9723834.html)
5 自动过滤静态方法和变量,所以装配的量不能为静态,如果要为静态自动装配,通过注解构造方法或set方法的形参来赋值给静态变量
关于@Scope作用域
用于bean身上,规定bean的作用域:
singleton 只能创建一个bean
prototype 每次创建不同bean
request 仅在当次请求中有效
session 仅在本次会话中有效
application 在整个应用过程中都有效
关于注解扫描
Spring注入的流程
首先他会把项目中target -> classes 目录下的「.class」文件进行解析
通过Spring.xml中的「context:component-scan」进行注解扫描
如果这个路径下的「.class」文件的类上面是否存在@Component声明的注解
如果被此类注解修饰,Spring会把所有被注解修饰的bean进行实例化操作 供给@Autowired进行注入
(在spring注解的源码中@Service和@Repository等等都继承了@Component注解)
Mybatis
数据源
用于承载数据库信息,连接数据库的数据结构,包含账号密码等。
mybatis原理级实现:
通过配置文件属性建立用完就丢的sqlsessionfactorybuilder(唯一的建造,用来解耦不需要反复使用的代码),用它建长久保持相当于数据库连接池sqlsessionfactory,他根据xml或注解的具体操作,建立代理接口完成sql语句的sqlsession(相当于一次事务,执行多条语句,回滚后回收)。
session可以获取不同mapper,声明接口型变量来承载对应mapper,后变量调用方法实现,session提交关闭。
参数传递???
多个参数传递值需要用@Param来标识,否则会mysql无法区分,或者使用对象,在需要的地方会自动取出对象对应的属性值,但要配置set和get方法,@Param仅用于普通属性,并且不能和对象共用
@Update("update evaluate set repairs_id=#{repairsId},repairs_time=#{repairsTime},repairs_user_id=#{repairsUserId},service_user_id=#{serviceUserId},repairs_place=#{repairsPlace},repairs_telephone=#{repairsTelephone},repairs_photo=#{repairsPhoto},freetime=#{freetime},repairs_detail=#{repairsDetail},repairs_status=#{repairsStatus}" where repairs_id=#{repairsId})
int updateRepairs(Repairs repairs);
注解sql
在接口上可以直接写注解语句
对于同名参数的处理
ResultMap
一对多和多对一(级联)
一对多
可以用子查询和级联实现一对多,也可以直接用join on连接
动态sql
缓存
JavaConfig
@import(xxx.class)
专门用于JavaConfig导入
JavaConfig写法:
1.用@Configuration注解JavaConfig类,
2.用每个方法来表示Bean并使用@Bean注解方法。
3.每个方法名代表XML配置文件中的name
4.方法返回对象本身
JavaConfig和SpringBoot自动装配之间的关系??
SSM综合
Restful
什么是Restful
Representational State Transfer,表现层状态转化,即客户端通过HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
“表现层"其实指的是"资源”(Resources)的"表现层"。
所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。
我们把"资源"具体呈现出来的形式,叫做它的"表现层"
比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;
资源的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。
什么是RestfulAPI
网络分为前后端,各种前端设备如平板,手机等变换层出不穷,而服务器一般保持电脑。
因此,必须有一种统一的API机制,方便不同的前端设备与后端进行通信,RESTful API是目前比较成熟的一套互联网应用程序的API设计理论。
怎么用RestfulAPI
协议选择
https
域名和版本位置
api放在主域名前,版本应在主域名后,如:https://api.example.com/v1
路径
过滤
?=参数
通过参数过滤信息
状态码
错误处理
HTTP动词
返回结果
以下是不同操作后服务器返回给客户端的结果
GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档
http://www.ruanyifeng.com/blog/2014/05/restful_api.html
http://www.ruanyifeng.com/blog/2011/09/restful.html
项目结构
sources(或src)文件:装源代码
resources文件:装资源文件(如配置文件)
关于lombok
作用
主要缩减实体类的冗余代码
使用方法
1 IDEA在setting/plugin处下载lombok
2 在pom中加入(版本自定,不带version无法使用)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
3 在实体类上使用注释
重要注释
@Data可以提供get/set/equals/hashCode/toString
@NoArgsConstructor/@AllArgsConstructor 提供构造方法
SSM常见的404错误
ideaweb项目不会自己配置所需jar包,需手动添加:
project structure选中当前项目,在WEB-INF下面添加lib,lib导入jar包