发表于: 2025-06-04 20:37:59

0 37


今天完成的任务:学习深度思考。


27.为什么要用start.sh,stop.sh,deploy.sh 来完成容器的启动,停止和部署,而不是直接用容器自带的命令?

1. 简化操作流程

  • 脚本可以将多个步骤封装为一个简单的命令,减少手动输入复杂命令的繁琐性。例如,start.sh 可能不仅启动容器,还会同步配置文件、设置环境变量等。
  • 对于复杂的多容器应用(如使用 Docker Compose),脚本可以统一管理多个容器的启动和停止,避免逐个操作。

2. 提高可移植性和一致性

  • 脚本可以确保在不同环境中执行相同的操作流程,避免因手动输入命令导致的差异。例如,deploy.sh 可能包含文件同步、权限设置等步骤,确保部署的一致性。
  • 在团队协作或跨机器部署时,脚本可以快速复现相同的环境,减少人为错误。

3. 集成额外逻辑

  • 脚本可以嵌入额外的逻辑,例如:
    • 检查 Docker 是否已安装。
    • 验证容器状态,避免重复启动或停止。
    • 记录操作日志(如 docker.log),便于后续排查问题。
    • 设置资源限制(如 ulimit)或权限(如 chmod)。

4. 支持自动化与扩展

  • 脚本可以轻松集成到自动化工具(如 CI/CD 流水线、定时任务 crontab)中,实现定时启停或条件触发。
  • 脚本支持扩展,例如添加健康检查、依赖服务等待逻辑等。

5. 隔离复杂性

  • 直接使用容器命令需要用户熟悉 Docker 的语法和参数(如端口映射、卷挂载)。脚本隐藏了这些细节,对非运维人员更友好。
  • 对于生产环境,脚本可以封装安全策略(如避免直接暴露 docker run 的危险参数)。

6. 生命周期管理

  • 脚本可以与容器生命周期钩子(如 ENTRYPOINTCMD)结合,在启动或停止时执行初始化或清理操作。
  • 例如,stop.sh 可能先优雅停止服务,再备份数据,最后调用 docker stop

对比直接使用容器命令的局限性

  • 手动命令易出错:例如忘记加 -d 参数导致前台阻塞,或漏掉 --project-name 导致 Compose 网络冲突。
  • 缺乏标准化:不同成员可能使用不同的命令或参数,导致环境不一致。

总结

脚本化管理的核心优势是标准化、自动化和可维护性,尤其适合复杂或多容器场景。而直接使用容器命令更适合临时调试或简单单容器操作


28.什么是Filter,什么是Interceptor,他们的区别是什么,和AOP又是什么关系?

Filter是什么

过滤器:依赖于servlet容器。在实现上,基于函数回调,它可以对几乎所有请求进行过滤,

一个过滤器实例只能在容器初始化时调用一次


Interceptor是什么

依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。

在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,

就是在一个方法前,调用一个方法,或者在方法后,调用一个方法


AOP是什么

AOP(Aspect-Oriented Programming)是一种编程思想,对OOP的补充

常见实现:Filter和拦截器(代理模式)

OOP: 对于所有对象中都存在的一些公共行为,无能为力

为减少重复代码,AOP(面向切面)技术诞生


2.1 Filter 的使用:

(1)在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest

(2)根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据

(3)根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据


2.2 创建一个Filter

(1)创建Filter 处理类

init方法、destory方法、doFilter方法

(2)在web.xml 文件中配置Filter


2.3 interceptor 使用

通过实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter抽象类,

复写preHandle()、postHandle()和afterCompletion()来对用户的请求进行拦截处理

3.1 Filter与interceptor的区别

(1) 接口定义不同

Filter 接口定义在 javax.servlet 包中,接口 HandlerInterceptor 定义在org.springframework.web.servlet 包中

(2) 规范不同

Filter 是在 Servlet 规范中定义的,是 Servlet 容器支持的;拦截器是在 Spring容器内的,是Spring框架支持的

(3) 使用资源不同

拦截器是一个Spring的组件,归Spring管理,因此能使用Spring里的任何资源、

 对象;Filter 不能够使用 Spring 容器资源

(4) 深度不同

Filter在只在 Servlet 前后起作用;拦截器能够深入到方法前后、异常抛出前后等。

(5) 调用者不同

Filter 是被 Server 调用;Interceptor 是被 Spring 调用。

因此 Filter 总是优先于 Interceptor 执行


3.2 多个过滤器执行顺序

(1): 执行 第一个Filter中chain.doFilter()之前的部分

(2): 执行 第二个Filter中chain.doFilter()之前的部分

(3): 业务逻辑

(4): 执行 第二个Filter中chain.doFilter()之后的部分

(5): 执行 第一个Filter中chain.doFilter()之后的部分


3.3 面向切面编程

(1)通知(增强)Advice:你想要的功能

(2)连接点 Join point:spring允许你是通知(Advice)的地方

       spring 方法 ,AspectJ支持构造器或属性注入时

(3)切点 Pointcut:连接点的基础上,来定义切入点

(4)切面 Aspect:通知和切入点的结合

(5)引入 Introduction: 向现有的类添加新方法属性

(6)织入 Weaving : 切面应用到目标对象来创建新的代理对象的过程

5.1 多个过滤器与拦截器的代码执行顺序

过滤器在servlet启动后开始执行,进入页面访问开始执行拦截器


5.2 AOP实现,统一异常

重点在切点的定义,异常可以为预期异常和非预期异常,处理方式不同


5.2 监听器

以监听Web应用的上下文信息、Servlet请求信息和Servlet会话信息,即ServletContext、ServletRequest、HttpSession

执行顺序:监听器>过滤器>拦截器


29.使用Annotaion的时候需要有哪些配置,他的加载过程是怎么样的? 

注解开发介绍

Annotation(注解),其实就是对类,方法,属性进行的一种标示,一种注释(注意一下,注释其实不是为了让我们开发或维护人员阅读更方便,而是为JVM看),通过这些标示,Java虚拟机可以完成这些标示对应的功能。例如使用框架开发时,我们都是通过配置文件进行对象关系组合映射等功能,而通过注解我们可以完全代替配置文件的编写。

注解如同标签

回到博文开始的地方,之前某新闻客户端的评论有盖楼的习惯,于是 “乔布斯重新定义了手机、罗永浩重新定义了傻X” 就经常极为工整地出现在了评论楼层中,并且广大网友在相当长的一段时间内对于这种行为乐此不疲。这其实就是等同于贴标签的行为。

Annotation的作用:

编写文档:通过代码里标识的元数据生成文档。

代码分析:通过代码里标识的元数据对代码进行分析。

编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。

JDK内置的几个常用注解:

(1)@Override:此注解能够实现编译时检查,当某方法前边添加此注解时,表示此方法为重写父类中的方法。如果此方法不是父类的方法,例如我们本来想重写toString呢,却写成了tostring,则编译无法通过,会提示错误。

(2)@Deprecated:此注解是对不应该,或者将要淘汰的方法进行标识,当编程人员使用时就会给予提示。

(3)@SuppressWanings:此注解表示去除一些警告,但是里边需要我们制定参数。

(4)@interface进行自定义注解的定义。使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

(二)Spring注解开发

Spring框架的核心功能IoC(Inversion of Control),也就是通过Spring容器进行对象的管理,以及对象之间组合关系的映射。通常情况下我们会在xml配置文件中进行action,service,dao等层的声明,然后并告知框架我们想要的注入方式,然后在类中声明要组合类的get,set方法。而通过Spring框架中注解的运用也就主要是解决这类问题的。而框架中另一个核心知识AOP,一种面向横切面的方法编程,在程序中一般都是进行一次设置就可以的,所以都还放在配置文件中。例如声明式事物的设置,一次设置,后边就不用管了,所以这个没有必要使用注解进行简化。

1.首先需要在配置文件中增加命名空间的和约束文件

2.开启Spring的注解功能,这样Spring环境才会进行指定位置的扫描,进行类之间的关联组合

3.声明注解类,让Spring框架可以识别

(1)类的分层注解,由于我们后台开发都是分为三层进行开发的,所以Spring框架提供了三种对于不同层的注解方式:

控制层:@Controller

服务层:@Service

持久层:@Repository

默认情况下使用注解声明的Bean对象id名称为:类名称的首字母小写,一般不需要我们进行设置,如果想要设置时,例如我们指定的是实现类,而名字指向了接口,直接添加value属性即可:@Service(value="name"),当然value是可以省略的。

Spring框架还为我们提供了代替上边三个分层注解的通用注解:@Component.当然提倡大家使用分层注解更好一些,区分层次比较明确。

(2)自动装配功能的实现对象之间的组合关系,在属性前边指定下边的注解:

@Autowired : 采用类型的方式完成自动装配 : byType

@Resource : 采用名称+类型的方式完成自动装配 : byName +byType

另外Spring提供的两种注解的自动装配功能,属性不需要声明set,get方法也可以完成组合功能,这是非常方便的。


(1)注解开发的优缺点

优点:1)开发速度快;2)编译期间容易发现错误的出处 。

缺点:1)管理分散,基本每个类上都有;2)扩展功能时,没有遵循OCP开发原则(一个软件应该对扩展开放,对修改关闭,可以在不必修改源代码的情况改变模块的行为)。

(2)配置文件开发的优缺点

优点:1)遵循OCP开发原则,修改配置文件即可进行功能扩展;2)集中管理对象和对象之间的组合关系,易于阅读。

缺点:1)开发速度相对较慢;2)编译时很难检查出错误,运行中的错误很难定位,调试难度较大。

如果客户需求不会频繁发生变化。那么使用注解非常好,开发效率快。

如果客户需求经常发生变化,那么采用配置文件的方式会好一些。有利于扩展。


遇到的问题:今天把任务三的项目下载下来,看的一脸懵,不知道从哪里开始。

一步步来吧。

明天的计划:继续学习深度思考



返回列表 返回列表
评论

    分享到