Spring

1、IoC控制反转

IoC特点不用new 就可以初始化类;

控制反转的英文名叫 Ioc(Inversion of Control) ,依赖注入英文名叫DI(Dependency Injection)

类之间的关系,不用代码控制,而是由Spring容器(也就是Spring的jar包)来控制。控制权由代码翻转到容器里,这叫控制反转。

表现形式:再初始化对象时,在代码里无须new 而是把类之间的关系写到配置文件里。

2、DI 依赖注入

在代码运行时,,如果我们要在一个类里面使用(也叫注入)另一个类,那么这种注入就是依赖配置文件的。

表现形式:同样是把类的关系写道配置文件里,在运行时会根据配置文件把类注入到另一个类里。

依赖注入常用知识点说明:在spring里,通常在配置文件文件中描述各类以及各类之间的包含关系,在使用的时候,先加载配置文件,Spring的内核会读取配置文件,随后动态的组装各类。

Spring读取配置文件的方式归纳:

类名:XmlBeanFactory

例子:

Resource  resource = new ClassPathResource(“bean.xml”);

BeanFactory factory = new XmlBeanFactory(resource);

类名:ClassPathXmlApplicationContext

例子:

ApplicationContext factory = new ClassPathXmlApplicationContext(“conf/application.xml”);

类名:用文件系统类读取 FileSystemXmlApplicationContext

例子:

ApplicationContext factory = new FileSystemApplicationContext(“classpath:application.xml”);

单例多例,有状态无状态Bean:

我们知道,Spring的容器会在程序运行时,根据配置文件自动创建(或者实例化)具体的Java类(也叫Class,或叫Bean),在配置文件里,可以设置创建文件时是否用单例的方式,如果没有设置,则会自动默认的单利方式来创建。

如果不是单例,则可以用下面语法来修改,它们是等价的。

<bean id=”Jinzekeji” class=”cn.com.codinfun.entity” singleton=”false”>

或者<bean id=”Jinzekeji” class=”cn.com.codinfun.entity” scope=”protrotype”>

3、AOP面向切面编程

3.1简介:

AOP 是 Aspect Oriented Programming 的缩写,译为面向切向编程。用我们最常用的 OOP 来对比理解:

纵向关系 OOP,横向角度 AOP

设计一个日志打印模块。按 OOP 思想,我们会设计一个打印日志 LogUtils 类,然后在需要打印的地方引用即可。

public class ClassA {
private void initView() {
LogUtils.d(TAG, "onInitView");
}
} public class ClassB {
private void onDataComplete(Bean bean) {
LogUtils.d(TAG, bean.attribute);
}
} public class ClassC {
private void onError() {
LogUtils.e(TAG, "onError");
}
}

看起来没有任何问题是吧?

但是这个类是横跨并嵌入众多模块里的,在各个模块里分散得很厉害,到处都能见到。从对象组织角度来讲,我们一般采用的分类方法都是使用类似生物学分类的方法,以「继承」关系为主线,我们称之为纵向,也就是 OOP。设计时只使用 OOP思想可能会带来两个问题:

  1. 对象设计的时候一般都是纵向思维,如果这个时候考虑这些不同类对象的共性,不仅会增加设计的难度和复杂性,还会造成类的接口过多而难以维护(共性越多,意味着接口契约越多)。

  2. 需要对现有的对象 动态增加 某种行为或责任时非常困难。

而AOP就可以很好地解决以上的问题,怎么做到的?除了这种纵向分类之外,我们从横向的角度去观察这些对象,无需再去到处调用 LogUtils 了,声明哪些地方需要打印日志,这个地方就是一个切面,AOP 会在适当的时机为你把打印语句插进切面。

// 只需要声明哪些方法需要打印 log,打印什么内容
public class ClassA {
@Log(msg = "onInitView")
private void initView() {
}
} public class ClassB {
@Log(msg = "bean.attribute")
private void onDataComplete(Bean bean) {
}
} public class ClassC {
@Log(msg = "onError")
private void onError() {
}
}

OOP 与 AOP 的区别

  1. 面向目标不同:简单来说 OOP 是面向名词领域,AOP 面向动词领域。

  2. 思想结构不同:OOP 是纵向结构,AOP 是横向结构。

  3. 注重方面不同:OOP 注重业务逻辑单元的划分,AOP 偏重业务处理过程中的某个步骤或阶段。

OOP 与 AOP 的联系

两者之间是一个相互补充和完善的关系。

如果说 OOP 是把问题划分到单个模块的话,那么 AOP 就是把涉及到众多模块的某一类问题进行统一管理。AOP的目标是把这些功能集中起来,放到一个统一的地方来控制和管理。利用 AOP 思想,这样对业务逻辑的各个部分进行了隔离,从而降低业务逻辑各部分之间的耦合,提高程序的可重用性,提高开发效率。

3.2、应用场景

那AOP既然这么有用,除了上面提到的打印日志场景,还有没有其他用处呢?

当然有!

只要系统的业务模块都需要引用通用模块,就可以使用AOP。以下是一些常用的业务场景:

3.2.1 参数校验和判空

系统之间在进行接口调用时,往往是有入参传递的,入参是接口业务逻辑实现的先决条件,有时入参的缺失或错误会导致业务逻辑的异常,大量的异常捕获无疑增加了接口实现的复杂度,也让代码显得雍肿冗长,因此提前对入参进行验证是有必要的,可以提前处理入参数据的异常,并封装好异常转化成结果对象返回给调用方,也让业务逻辑解耦变得独立。

3.2.2 Android API23+的权限控制

避免到处都是申请权限和处理权限的代码

3.2.3 无痕埋点

3.2.4 安全控制

比如全局的登录状态流程控制。

3.2.5日志记录

3.2.6事件防抖

防止View被连续点击触发多次事件

3.2.7 性能统计

检测方法耗时其实已经有一些现成的工具,比如 trace view。痛点是这些工具使用起来都比较麻烦,效率低下,而且无法针对某一个块代码或者某个指定的sdk进行查看方法耗时。可以采用 AOP 思想对每个方法做一个切点,在执行之后打印方法耗时。

3.2.8 事务处理

声明方法,为特定方法加上事务,指定情况下(比如抛出异常)回滚事务

3.2.9 异常处理

替代防御性的 try-Catch。

3.2.10 缓存

缓存某方法的返回值,下次执行该方法时,直接从缓存里获取。

3.2.11 软件破解

使用 Hook 修改软件的验证类的判断逻辑。

3.2.12 热修复

AOP 可以让我们在执行一个方法的前插入另一个方法,运用这个思路,我们可以把有 bug 的方法替换成我们下发的新方法。

通过ORM专注业务

Spring随堂笔记的更多相关文章

  1. J2EE进阶(一)随堂笔记

    进公司搞研发,基本上用的都是J2EE框架.若想在公司混个不错的地位,首先技术上必须过关.由于需求所致,自己学习了J2EE一段时间,主要是Struts2,MyBatis(Hibernate的前身),远远 ...

  2. 【转】Spring.NET学习笔记——目录

    目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...

  3. Spring MVC 学习笔记一 HelloWorld

    Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...

  4. SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能

    在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...

  5. SpringBoot + Spring Security 学习笔记(三)实现图片验证码认证

    整体实现逻辑 前端在登录页面时,自动从后台获取最新的验证码图片 服务器接收获取生成验证码请求,生成验证码和对应的图片,图片响应回前端,验证码保存一份到服务器的 session 中 前端用户登录时携带当 ...

  6. 第63节:Java中的Spring MVC简介笔记

    前言 感谢! 承蒙关照~ Java中的Spring MVC简介笔记 MVC简介 Spring MVC 基本概念 Spring MVC 项目搭建 maven 使用Spring MVC进行开发 实现数据绑 ...

  7. spring揭密学习笔记

    spring揭密学习笔记 spring揭密学习笔记(1) --spring的由来 spring揭密学习笔记(2)-spring ioc容器:IOC的基本概念

  8. Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建

    Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...

  9. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

随机推荐

  1. Mybatis最权威的知识点

    1.什么是Mybatis? (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动.创建连接.创建statement ...

  2. Ignatius and the Princess III HDU - 1028

    题目传送门:https://vjudge.net/problem/HDU-1028 思路:整数拆分构造母函数的模板题 1 //#include<bits/stdc++.h> 2 #incl ...

  3. Spring Cloud 升级之路 - 2020.0.x - 3. Undertow 的 accesslog 配置

    上一节我们讲述了如何使用 Undertow 作为我们的 Web 服务容器,本小节我们来分析使用 Undertow 的另一个问题,也就是如何配置 accesslog,以及 accesslog 的各种占位 ...

  4. 幻灯片放映模式切换windows terminal背景图片

    目录 幻灯片放映模式切换windows terminal背景图片 脚本功能 开发需求 使用技术 操作说明 使用示例 查看帮助 输入参数使用 脚本详情 引用参考 幻灯片放映模式切换windows ter ...

  5. CIE标准色度系统(下)

    四.色温与相关色温 根据绝对黑体光谱分布特性的普朗克定律,由普朗克公式可以计算出黑体对应于某一温度的光谱分布,并由此应用CIE标准色度系统可获得该温度下黑体发光的三刺激值和色品坐标,从而在色品图上得到 ...

  6. Istio最佳实践系列:如何实现方法级调用跟踪?

    赵化冰,腾讯云高级工程师,Istio Member,ServiceMesher 管理委员,Istio 项目贡献者,热衷于开源.网络和云计算.目前主要从事服务网格的开源和研发工作. 引言 TCM(Ten ...

  7. 在 Docker Desktop 中启用 K8s 服务

    Overview 作为目前事实上的容器编排系统标准,K8s 无疑是现代应用的基石,很多同学入门可能直接就被卡到第一关,从哪去弄个 K8s 的环境 自己搭吧,要求的硬件资源太高,基本上搭建一个 K8s ...

  8. Digit Generator UVA - 1583

    ​ For a positive integer N, the digit-sum of N is defined as the sum of N itself and its digits. Whe ...

  9. JDBC_14_使用JDBC工具类实现模糊查询

    使用JDBC工具类实现模糊查询 代码: import java.sql.*; /** * 模糊查询 * 测试DBUtils */ public class JDBCTest09 { public st ...

  10. 图解Leetcode组合总和系列——回溯(剪枝优化)+动态规划

    Leetcode组合总和系列--回溯(剪枝优化)+动态规划 组合总和 I 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 ...