—— Feellmoose

视频链接: 无

spring

DI & IoC & Beans

依赖注入

  1. 对象间依赖关系通过属性定义。
  2. 注入有两种方式,一种是通过set方法,一种是通过构造器。

优点:对象不需要知道其依赖关系,也不需要知道它的位置或者类之间的依赖。因此,你的类会更容易测试,尤其是当依赖关系是在接口或者抽象基本类,运用了DI原理代码会更加清晰并且由依赖关系提供对象也将使各层次的松耦合变得更加容易。

控制反转

  1. 将依赖关系定义好后,注入过程交由容器执行。注入有两种方式,属性注入和构造注入。当创建bean后,容器再将这些依赖项注入进去。
  2. 被Spring 容器管理的这些来自于应用主干的这些对象称作beans,bean是一个由Spring容器进行实例化、装配和管理的对象。Beans以及他们之间的依赖关系是通过容器使用配置元数据反应出来。

Spring beans VS EJB

EJB 是一种用于构建和管理企业级应用程序的组件模型和规范,EJB是BEANS,BEANS是什么概念,EJB必须生存在EJB容器中。EJB容器交给企业级服务器实现如Apache、Tomcat、JBoss等,并且只支持管理符合规范的组件。

而Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理,这使得定义和管理组件变得更加简单。

objects VS Spring beans

普通对象是由我们自己创建的不存在spring上下文中,不能享受容器带来的各种服务,不能和容器中各种对象进行直接交互。

spring对象是由spring工厂类帮我们创建的对象,可以享受到容器带来的便捷服务,可以直接和容器中的对象进行交互。

Application Context 接口代表了Spring容器,并且负责上面提到的Beans的实例化、配置和装配。容器通过读取配置元数据获取对象如何实例化、配置和装配的指示。配置元数据可以用XML、Java注解或Java代码来描述。它允许你表示组成你应用的对象,以及对象间丰富的依赖关系。

使用注解表示Bean

  1. 使用@Component注解:在运行时,Spring会找到所有使用@Component或其派生类进行注释的,并将它们用作bean定义。查找带注释的类的过程称为组件扫描。
  2. 使用@Configuration注解注入配置类,在配置类中使用@Bean注解到工厂方法:

在Spring中我们可以用id和name来表示bean,使用基于Java注解时我们可以通过注解定义bean名称,否则使用默认名称生成策略。

使用注解时的默认名称生成策略:作用在类上时,如果不指定bean名称,bean名称的默认规则是类名的首字母小写,即与实例的规范相同,作用在方法上则是首字母小写的方法名。

基于注解注入

  1. 字段注入:使用 @Autowired@Resource ,分别默认按照byTypebyName实现注入。 @Autowired 配合@Qualifier也可以实现byName注入。
  2. setter注入:把 @Autowired 打在setter方法上
  3. 构造方法注入:写一个构造器,默认按照参数注入后构造。

Bean作用域

  1. 单例(默认)当bean具有单例作用域时,Spring只创建一个实例并在整个应用程序中共享它。单例是无状态对象的完美选择。如今,我们应用程序中的绝大多数bean都是无状态单例。
  2. 原型,多实例
  3. 其他EJB的支持的作用域

更多设计上的底层原理,我们现在不去深究,让我们趁热打铁开发一个简单的web后端项目。

Restful APIs

如何开发一个简单的springweb程序?

Controller

在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。

@RequestMapping

@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径,支持通配符“* ”。

@PathVariable

用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。

@requestParam

@requestParam主要用于在SpringMVC后台控制层获取参数。可以通过注解设置更具体的参数信息。

@ResponseBody

该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用

Service

用于业务逻辑封装的组件,复杂的逻辑关系于此实现。

Repository

用与实体类和数据库映射和逻辑的封装,只需要定义接口和实体类,映射和数据库的交互过程由ORM框架和JDBC实现,由于需要数据库的相关知识我们放到下节课讲。

Lombok

使用注解简化POJO,通过解析注解,可以为我们自动生成常用重复设计模式带来的样板代码。

项目实战

本次教学使用项目仓库地址(github):feellmoose/sast_shop (github.com)

本次教学使用项目仓库地址(gitee):feellmoose/sast_shop (gitee.com)

目标:简单认识项目结构,尝试运行spring项目并根据已有部分完善项目,主要实现功能如下:

  • 成功加载运行项目
  • 重新实现product业务,将自己的业务注入后,通过测试

其他

SpringMVC支持解析的参数

  1. HttpServlet 对象,主要包括HttpServletRequest 、HttpServletResponse 和HttpSession 对象。
  2. Spring 自己的WebRequest 对象。
  3. InputStream 、OutputStream 、Reader 和Writer 。
  4. 常用类型和自定义类型的属性

处理参数的注解

  1. 处理requet uri 路径部分参数的注解: @PathVariable
  2. 处理request header部分的注解: @RequestHeader, @CookieValue
  3. 处理request body部分的注解:@RequestParam, @RequestBody
  4. 处理attribute类型是注解: @SessionAttributes, @ModelAttribute

支持的返回类型

  1. 一个包含模型和视图的ModelAndView 对象。
  2. 一个模型对象,这主要包括Spring 封装好的Model 和ModelMap ,以及java.util.Map ,当没有视图返回的时候视图名称将由RequestToViewNameTranslator 来决定。
  3. 一个View 对象。这个时候如果在渲染视图的过程中模型的话就可以给处理器方法定义一个模型参数,然后在方法体里面往模型中添加值。
  4. 一个String 字符串。这往往代表的是一个视图名称。这个时候如果需要在渲染视图的过程中需要模型的话就可以给处理器方法一个模型参数,然后在方法体里面往模型中添加值就可以了。
  5. 返回值是void 。这种情况一般是我们直接把返回结果写到HttpServletResponse 中了,如果没有写的话,那么Spring 将会利用RequestToViewNameTranslator 来返回一个对应的视图名称。如果视图中需要模型的话,处理方法与返回字符串的情况相同。
  6. @ResponseBody,处理器方法的任何返回类型都会通过HttpMessageConverters 转换之后写到HttpServletResponse 中,而不会像上面的那些情况一样当做视图或者模型来处理。

文章参考

什么是EJB以及和Spring Framework的区别_ejb框架_爱叨叨的程序狗的博客-CSDN博客

99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏!!! - 磊哥|www.javacn.site - 博客园 (cnblogs.com)