1. Spring 依赖注入
1.1 依赖注入的三种方式
-
通过构造器注入
private AlarmContactService alarmContactService; private final AlarmService alarmService; private final SysUserService sysUserService; @Autowired public AlarmContactController(AlarmContactService alarmContactService, AlarmService alarmService,SysUserService sysUserService) { this.alarmContactService = alarmContactService; this.alarmService = alarmService; this.sysUserService = sysUserService; }
-
通过 setter 注入
private AlarmContactService alarmContactService; private AlarmService alarmService; private SysUserService sysUserService; @Autowired public void setAlarmContactService(AlarmContactService alarmContactService) { this.alarmContactService = alarmContactService; } @Autowired public void setAlarmService(AlarmService alarmService) { this.alarmService = alarmService; } @Autowired public void setSysUserService(SysUserService sysUserService) { this.sysUserService = sysUserService; }
-
通过 filed 注入
@Autowired private AlarmContactService alarmContactService; @Autowired private AlarmService alarmService; @Autowired private SysUserService sysUserService;
1.2 自动装配
Spring 装配包括手动装配
和自动装配
,手动装配方式可以基于 xml 装配、构造方法、setter 方法等。自动装配有五种自动装配的方式,可以用来指导 Spring 容器用自动装配方式来进行依赖注入。
-
no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。
-
byName:通过参数名 自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。
-
byType:通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byType,之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多个 bean 符合条件,则抛出错误。
-
constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
-
autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式。
2. Spring AOP 实现
2.1 什么是 AOP
AOP (Aspect Orient Programming), 直译过来就是面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。
"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
2.2 AOP 实现原理
Spring 通过对目标对象使用代理模式生成代理对象的方式来实现 AOP。有两种主要的方式 JDK 的动态代理和 CGLIB 的动态代理,默认使用 JDK 方式。
2.3 AOP 使用场景
场景一: 记录日志
场景二: 监控方法运行时间 (监控性能)
场景三: 权限控制
场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 )
场景五: 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 )
3. Spring MVC 的拦截器
3.1 什么是拦截器
Spring MVC 中的拦截器(Interceptor)类似于 Servlet 中的过滤器(Filter),它主要用于对处理器进行预处理和后处理,同时也提供了一种可以提取处理器中可重用部分的方式。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
在一个项目中可以设置多个拦截器,这些拦截器按一定的顺序联结成一条链,这条链称为拦截器链。 在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用,拦截器也是 AOP 思想的具体实现。
3.2 拦截器的原理
Spring MVC 中拦截器是实现了 HandlerInterceptor 接口的 Bean:
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception;
void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception;
void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler, Exception ex) throws Exception;
}
-
preHandle():预处理回调方法,若方法返回值为 true,请求继续(调用下一个拦截器或处理器方法);若方法返回值为 false,请求处理流程中断,不会继续调用其他的拦截器或处理器方法,此时需要通过 response 产生响应;
-
postHandle():后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时可以通过 modelAndView 对模型数据进行处理或对视图进行处理
-
afterCompletion():整个请求处理完毕回调方法,即在视图渲染完毕时调用
3.3 拦截器和过滤器的区别
- 拦截器基于 java 的反射机制,而过滤器是基于函数回调
- 拦截器不依赖于 servlet 容器,过滤器依赖 servlet 容器
- 拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起作用
- 在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
- 拦截器可以获取 IOC 容器中的各个 bean,而过滤器就不行,这点很重要,在拦截器注入一个 service,可以调用业务逻辑
4. Spring Boot
4.1 Spring Boot 特点
Spring Boot 的特点:
(1)快速开发 Spring 应用的框架
(2)内嵌 Tomcat 和 Jetty 容器,不需要单独安装容器,jar 包直接发布一个 Web 应用
(3)简化 Maven 配置,继承父工程这种方式,一站式引入需要的各种依赖
(4)基于注解的零配置思想
(5)和各种流行框架 Spring MVC、Mybatis、Spring Cloud 无缝整合
4.2 Spring Boot 常用注解
- @SpringBootApplication:这个注解是 Spring Boot 最核心的注解,用在 Spring Boot 的主类上,标识这是一个 SpringBoot 应用,用来开启 Spring Boot 的各项能力。相关等同于@Configuration,@EnableAutoConfiguration 和@ComponentScan 三个注解同时使用。
- @EnableAutoConfiguration:Spring Boot 自动配置开启注解。
- @ConditionalOnXXXX:Spring Boot 基于@Conditional 扩展出的衍生注解,根据是否满足某一个特定条件来决定是否加载指定的 Bean。比如扩展出的注解有:@ConditionalOnBean、@ConditionalOnClass 等。
- @ConfigurationProperties:基于类型安全的属性配置注入,可以将 properties 属性和一个 Bean 及其属性关联,从而实现类型安全配置。
5. Maven
5.1 Maven 是什么?
Maven 是一个项目管理工具。它负责管理项目开发过程中的几乎所有的东西。
- 版本:Maven 有自己的版本定义和规则
- 构建:Maven 支持许多种的应用程序类型,对于每一种支持的应用程序类型都定义好了一组构建规则和工具集。
- 输出物管理:Maven 可以管理项目构建的产物,并将其加入到用户库中。这个功能可以用于项目组和其他部门之间的交付行为。
- 依赖关系:Maven 对依赖关系的特性进行细致的分析和划分,避免开发过程中的依赖混乱和相互污染行为
- 文档和构建结果:Maven 的 site 命令支持各种文档信息的发布,包括构建过程的各种输出,javadoc,产品文档等。
- 项目关系:一个大型的项目通常有几个小项目或者模块组成,用 Maven 可以很方便地管理
5.2 Maven 仓库
仓库:存放 jar 的地方可以通过 Manen 坐标准确的找到仓库中的 jar 包并添加到工程依赖中。
仓库的分类:
1、本地仓库:当前电脑上的仓库
2、远程仓库:
私服:搭建在局域网中,一般公司都会有私服,私服一般使用 nexus 来搭建。具体搭建过程可以查询其他资料
中央仓库:架设在 Internet 上,像刚才的 springframework 就是在中央仓库上
5.3 Maven 坐标
坐标:使用下面的三个向量在仓库中唯一的定位一个 Maven 工程 (jar 包)。
5.4 Maven 命令
- mvn clean:清理
- mvn compile:编译主程序
- mvn test-compile:编译测试程序
- mvn test:执行测试
- mvn package:打包
- mvn install:安装
6. git
6.1 什么是 git?
Git 是目前世界上最先进的分布式版本控制系统。
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
6.2 git 工作原理
- Workspace:工作区
- Index / Stage:暂存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
6.3 git 常用命令
- git clone:拷贝一份远程仓库,也就是下载一个项目。
- git push:上传远程代码并合并
- git add :添加文件到暂存区
- git commit:提交暂存区到本地仓库。
- git checkout:检出。最为常用的两种情形是创建分支和切换分支。
- git pull:下载远程代码并合并
6.4 Svn 与 Git 的最主要的区别?
Svn 是集中式的版本控制系统。可以看出 Svn 集中式版本控制都是把所有的版本存储在 Svn 服务器中且必须要联网到 Svn 服务器才可以进行版本的回退、更新等操作。
假如哪天 Svn 服务器坏了,那么所有的版本代码都将丢失,也就无法获取代码和回退版本等操作。
Git 是分布式版本控制系统。使用 Git 每个电脑都有完整的版本号和日志信息。且没有网的时候,Git 照样可以工作,只是把代码提交到本地,待有网再提交到远程 Git 仓库。就算哪天 Git 服务器坏了也没事,因为本地仓库都保存了完整的版本。
6.5 Git、Github、Gitlab 与 Gitee 之间的关系
Git:是一种版本控制系统,是一个命令,是一种工具,有点像 cmd(命令行工具)。
Github:是一个基于 git 实现在线代码托管的仓库,向互联网开放,企业版要收钱。
Gitlab:类似 github,一般用于在企业内搭建 git 私服,要自己搭环境。
Gitee:即码云,是 oschina 免费给企业用的,不用自己搭建环境,可以建立自己的私有仓库。
Git-ce:是社区版,gitlab-ee 是企业版,收费的。