Spring实战第5版笔记 1 Spring起步

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 官方截图如下

image-20200426152304715

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)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值