SpringBoot Web入门
Spring Boot只是简化了Spring项目的配置,其底层还是Spring Framework
创建步骤
注意:
语言选择Java,类型选择Maven,JDK和Java要保持一致,打包方式为Jar
点击下一步
选择Spring Boot的版本,注意不要选择后面带(SNAPSHOT)的版本
配置依赖项,可以再搜索框搜索依赖项名称进行查找,配置完后点击创建。
Spring官方脚手架连接不上解决方案
直接将URl地址换成阿里云的骨架
入门解析
HTTP协议
概述
请求协议
请求数据格式
post方式有请求体,而get方式没有请求体
服务区获取请求分为以下几个步骤
1.获取请求方式
2.获取请求url地址
3.获取请求协议
4.获取请求参数
5.获取请求头
响应协议
响应数据格式
响应数据格式分为响应行,响应头,响应体三部分
状态码
其中3XX表示重定向
即浏览器响应如3xx(Location:B)的状态码时,再次发起一次请求,请求B服务器,底层涉及到两次请求响应。
常见状态码
响应数据设置
分为两种方式
SpringBootWeb案例
在项目开发中,对于基本类型,我们建议使用包装类
可以添加Lombok依赖项,可以直接通过注解简化Java的样板代码,如:
@Data,提供get和set方法;
@NoArgsConstructor,提供无参构造
@AllArgsConstructor,提供全参构造
分层解耦
我们在进行软件设计或软件开发的时候,尽量遵循单一职责原则。
单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。
这样就可以让类、接口、方法的复杂度更低,可读性更强,扩展性更好,也更利于后期的维护。
三层架构
控制层(Controller)
controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据
业务逻辑层(Service)
service:业务逻辑层,处理具体的业务逻辑,
数据访问层(Dao)
dao:数据访问层(Data Access 0bject)(持久层),负责数据访问操作,包括数据的增、删、改、查。
前端发起的请求,由Controller层接收(Controller响应数据给前端)
Controller层调用Service层来进行逻辑处理(Service层处理完后,把处理结果返回给Controller层)
Serivce层调用Dao层(逻辑处理过程中需要用到的一些数据要从Dao层获取)
Dao层操作文件中的数据(Dao拿到的数据会返回给Service层)
分层解耦
内聚:软件中各个功能模块内部的功能联系。
耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
软件设计原则:高内聚低耦合。
高内聚:指的是一个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越高,则内聚性越高,即 "高内聚"。
低耦合:指的是软件中各个层、模块之间的依赖关联程序越低越好。
关于解耦我们的解决思路是:
提供一个容器,容器中存储一些对象(例:UserService对象)
Controller程序从容器中获取UserService类型的对象
我们想要实现上述解耦操作,就涉及到Spring中的两个核心概念:IOC和DI
IOC&DI入门
控制反转: Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为:IOC容器或Spring容器。
依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
程序运行时需要某个资源,此时容器就为其提供这个资源。
例:EmpController程序运行时需要EmpService对象,Spring容器就为其提供并注入EmpService对象。
bean对象:IOC容器中创建、管理的对象,称之为:bean对象。
在实现类加上 @Component
注解,就代表把当前类产生的对象交给IOC容器管理。
用@Autowired为Controller 及 Service注入运行时所依赖的对象
IOC详解
Spring框架为了更好的标识web应用程序开发当中,bean对象到底归属于哪一层,又提供了@Component的衍生注解:
前面声明bean的四大注解,要想生效,还需要被组件扫描注解
@ComponentScan
扫描。该注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解
@SpringBootApplication
中,默认扫描的范围是启动类所在包及其子包。所以,我们在项目开发中,只需要按照如上项目结构,将项目中的所有的业务类,都放在启动类所在包的子包中,就无需考虑组件扫描问题。
DI详解
1.属性注入
优点:代码简洁、方便快速开发。
缺点:隐藏了类之间的依赖关系、可能会破坏类的封装性。
2.构造函数注入
优点:能清晰地看到类的依赖关系、提高了代码的安全性。
缺点:代码繁琐、如果构造参数过多,可能会导致构造函数臃肿。
注意:如果只有一个构造函数,@Autowired注解可以省略。(通常来说,也只有一个构造函数)
3.setter注入
优点:保持了类的封装性,依赖关系更清晰。
缺点:需要额外编写setter方法,增加了代码量。
在项目开发中,基于@Autowired进行依赖注入时,基本都是第一种和第二种方式。(官方推荐第二种方式,因为会更加规范)但是在企业项目开发中,很多的项目中,也会选择第一种方式因为更加简洁、高效(在规范性方面进行了妥协)。
那如果在IOC容器中,存在多个相同类型的bean对象就会出现报错
方案一:使用@Primary注解
当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。
方案二:使用@Qualifier注解
指定当前要注入的bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。 @Qualifier注解不能单独使用,必须配合@Autowired使用。
方案三:使用@Resource注解
是按照bean的名称进行注入。通过name属性指定要注入的bean的名称。
面试题:@Autowird 与 @Resource的区别
@Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
@Autowired 默认是按照类型注入,而@Resource是按照名称注入