Spring起步
文章目录
1.1 什么是Spring
Spring是一个Java应用框架,主要有两个概念特别重要:AOP和IoC
一、AOP
AOP:Aspect Oriented Programing,面向切面编程。简单来说,就是把各个功能中公共的功能独立出来增强。
比如有一个类,每个类中的所有方法都需要在执行方法本身的基础上再执行一个 HelloWorld,所以比起在这个类中每一个方法中都写一个 HelloWorld,不如写一个切面类,通过反射技术,拦截这个类的每一个方法,然后在这个切面类中增强。
当然,使用父类、接口等也可以解决这一问题,但是万一有一些类不想增强呢?而且这种解决方法无疑更加麻烦,高耦合。
所以AOP有一定的优点:
- 降低模块的耦合度
- 代码复用性好
- 系统易于扩展
二、IoC
1. 广义的IoC
IoC,Inversion of Control,控制反转。
也就是原来由程序员自己手动控制的对象,现在全部交由框架控制。原来需要程序员控制对象的生命周期和对象间的关系,现在交由框架控制,将程序员一定程度的解放出来。
广义上的IoC有两种实现方式
- DL,依赖查找,并没有找到太多的资料,只是在网上大佬的博客中有描述:用户自己去使用API查找资源和组装对象。那么就是具有侵入性,是一种被淘汰的技术。
- DI,Denpendency Injection,依赖注入,即框架查找资源并生成对象,反向注入到程序中,这就是依赖注入。
2. Spring的IoC:
- 基本概念没什么差别,都是对象的生命周期和对象间的关系交由Spring框架控制。当我需要一个对象,那么这个对象由Spring通过依赖注入到程序中,至于这个对象是否有错误,那是Spring框架的事。
- IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。spring创建了对象,然后注入到程序中,这叫做依赖注入。
三、ORM
ORM,Object Relational Mapping,对象关系映射。
即是数据库模型在代码中的映射。在程序操作数据库的过程中,借助映射来封装对数据库的操作,即规避了直接操作数据库可能带来的风险,也避免了操作数据库的繁琐过程。
常常使用Hibernate、MyBatis等等。
三、Spring体系结构
Spring Framework 5 官方截图如下
https://spring.io/projects/spring-framework#learn
1.2 历史发展
Spring经历了从显示的写xml文件来指导Spring应用上下文来将bean装配起来的原始方式,再发展到基于Java注解配置,自动装配,再到引入Spring Boot,使得几乎完全可以不需要显示的配置任何东西,一切都是**自动配置(autoconfiguration)**的时代。
SpringBoot大幅度减少了构建应用所需要的显示配置的数量(无论XML配置还是Java配置)。
Spring Boot 和 Spring 区别
SpringBoot和Spring的区别就在于Spring是自动配置,Spring Boot只是Spring本身的扩展,比存粹的Spring更加简单。
比如Spring+Spring MVC的一个web应用,需要配置xml文件,在xml文件中配置自动扫描组件或者直接在xml文件中装Bean,然后再完成代码,在放上Tomcat服务器上运行,无论是测试还是部署都极为麻烦。
而引入SpringBoot后,xml文件配置被完全舍弃,SpringBoot也不需要特别的配置,一切都是自动装配,而且内嵌了Tomcat,只需要一个引导类,就可以把程序当作一个jar包来直接运行,非常方便。
Spring IN ACTION 5TH EDITION这本书是使用SpringBoot写的,旨在必要时候才使用了显示的配置。书中说xml配置方式是过时的方式,所以主要关注Spring基于Java的配置。
1.3 初始化Spring应用
使用IDEA为例
新建项目–>Spring Initializr,选择初始化的服务url,或者就使用默认的–>设置项目基本信息–>选择最初的依赖–>选择项目名字和存储地址
1.4 引导类
因为通过可执行JAR方式运行应用,所以需要一个主类,同时还需要一个最小化的Spring配置,这就是Application类做的事。
如果使用IDEA正确的创建了SpringBoot项目,会自动生成一个引导类的模板才对
其中@SpringBootApplication注解是最重要的一行代码
它实际上是一个组合的注解,组合了以下三个注解:
- @SpringBootConfiguration:声明为配置类,这个注解实际上是@Configuration注解的特殊形式
- @EnableAutoConfiguration:启动SpringBoot自动配置
- @ComponentScan:启动组件扫描
package tacos;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class TacoCloudApplication {
/**
* 启动应用查看网页效果应该是http://localhost:8080
* */
public static void main(String[] args) {
SpringApplication.run(TacoCloudApplication.class, args);
}
}
1.5 应用测试类
package tacos;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
/**
* 由于使用的是JUnit5,所以RunWith注解已经不支持
* 而且如果使用的是JUnit 4,请不要忘记也将@RunWith(SpringRunner.class)到测试中,否则注释将被忽略。
* 如果使用的是JUnit 5,则无需添加等价项@ExtendWith(SpringExtension.class),@SpringBootTest和其他@…Test注释已经在其中进行了注释。
**/
@SpringBootTest
class TacoCloudApplicationTests {
/**虽然是一个空的方法,不过足够测试Spring上下文是否成功加载*/
@Test
void contextLoads() {
}
}
@SpringBootTest会告诉JUnit在启动测试的时候加Spring Boot的功能。
1.6 @Controller,@xxxMapping
@Controller
这个注解是放在类上的,会自动生成一个Bean,名字就是这个类的首字母小写。
这个注解是专门用来注解controller层的注解。当然@Component也能实现他的功能,不过使用@Controller能够描述这个Bean到底是干什么的。
@xxxMapping()
SpringMVC请求映射注解
这个注解如果通常是放在方法上面,用于处理 HTTP 不同请求的。当然完整写法应该加上要拦截的路径。以下是SpringMVC的请求映射注解
注解 | 描述 | 举例 | 例子描述 |
---|---|---|---|
@RequestMapping | 虽然也可以用于方法,不过更多用于类,是通用的注解,如果写在类上面,则所有的 |
@RequestMapping()
-
描述:虽然也可以用于方法,不过更多用于类,是通用的注解,默认所有请求都可以,如果写在类上面,则类下面所有的方法都只拦截@RequestMapping指定路径下的请求。
-
举例:
@Controller @RequestMapping("/my") public class HomeController { @GetMapping("/home") public String home(){ //返回视图名 return "home"; }
-
这个例子就是使用了@RequestMapping拦截了/my的请求,这样的话,home()方法就会处理 /my/home 请求而不是处理 /home 请求。
@GetMapping()
- 描述:处理HTTP GET请求,get请求即是浏览器请求页面等数据的请求
- 举例:如上述代码
@PostMapping
-
描述:处理HTTP POST请求,向服务器发数据
-
举例:
@Slf4j @Controller @RequestMapping("/design") public class DesignTacoController { @PostMapping public String processDesign(@Valid Taco design,Errors errors) { if (errors.hasErrors()){ return "design"; } //日志输入 log.info("Processing design: " + design); //重定向到这个目录 return "redirect:/orders/current"; } }
-
用户填写完数据后,提交数据就是用处理@PostMapping注解的方法处理的,当然这里的方法还不完整
@PutMapping()
- 描述:用于处理HTTP PUT请求,向服务器发数据,倒是和post有不同
@DeleteMapping()
- 描述:用于处理HTTP DELETE请求,即删除页面
@PatchMapping()
- 描述:用于处理HTTP PATCH请求
注意
-
所有请求映射注解必须跟上要拦截的路径
-
如果类上有@RequestMapping(“路径”),那么类下面所有请求映射注解都会在这个路径下的子路径下面生效,具体上文有描述。
-
所有的请求映射注解都可以用@RequestMapping代替,如下例子
@GetMappint("/home") //可以用下面的代替,不同的请求替换GET就好 @RequestMapping(value="/home",method=RequestMethod.GET)
equestMapping(“路径”),那么类下面所有请求映射注解都会在这个路径下的子路径下面生效,具体上文有描述。
-
所有的请求映射注解都可以用@RequestMapping代替,如下例子
@GetMappint("/home") //可以用下面的代替,不同的请求替换GET就好 @RequestMapping(value="/home",method=RequestMethod.GET)