前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

Pxx  表示在书的第 xx 页。

Spring 框架的核心是 Spring 容器。

1. (P7.) 构造器注入是依赖注入的方式之一。

紧耦合:在 A 类的无参构造器中直接 new 出一个 B 类。

Spring 松耦合:在 A 类中使用有参构造器,把 B 类的超类类型 X 作为构造参数传入。

这样不需要 A 类管理 B 类,并且可以根据不同情况传入不同的实际参数,只是 X 的子类就可以注入到 A 中使用。A

2. (P15) .A 类中有一个 x 方法,B 类有 y ,z 方法。在 x 方法执行前后分别执行 y,z 方法要显示的写出调用代码 。

Spring aop :把 A 类声明为一个切面。把 A 声明为一个 bean , 定义切入点 ( 包含 x 方法 ) ,分别配置 y,z 为前置、后置通知。这样 A 类完全不知情时就已经调用执行 B 类的对应方法了。

3. (P34.) 装配 (wiring):创建应用对象之间协作关系的行为,这也是依赖注入(DI)的本质。

Spring 有三种主要装配机制:在 xml 中进行显示配置、在 java 中进行显示配制、隐式的 bean 发现机制和自动装配。

Spring  从两个角度来实现自动化装配 :组件扫描 (component scanning)- Spring 会自动发现应用上下文中所创建的 bean 。
自动装配 (autowiring) - Spring 自动满足 bean 之间的依赖。

4. (P37.)  扫描包的方式:

1)@ComponentScan 默认会扫描与配置类相同包的类。

2)指定扫描包: @ComponentScan(basePackages="单个类名")、 @ComponentScan(basePackages={“第一个包名”,“第N个包名”}) 、@ComponentScan(basePackagesClasses={A.class,B.class})

最后一种方式利于重构代码,A 、B 类是接口类型的话,改变实现类的类名,在扫描包时不受影响。

5. (P38.)

import static org.junit.Assert.*; 导入此类,可以调用方法 assertNotNull(要检查的对象);   来检查对象是否为 null 。

6 . (P38.) Spring 应用上下文中所有的 bean 都会给写一个 ID , 这个 bean 所给写的 ID 为类名的第一个字母变小写。

可以显示的给 bean 命名,有 2 种方式 :@Compnent ("这个位置写名字") 、@Named ("这个位置写名字") 。

---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 创建于 2018.11.10

7 . (P41.) 注解 @Autowired  可用在构造方法上,属性的 Setter 方法上,以及任何方法上。当有且仅有一个 bean 匹配依赖需求,就会装配起来。当没有匹配时会抛出异常。此时可设置 @Autowired 的属性 required 为 false :@Autowired(required = false),不作检查,但这样没有匹配到 bean ,则 bean 处于未装配状态,如果代码也未作 null 检查,可能会出现 NPE(空指针异常)。

@Autowired 可用@Inject 代替。

8 . (P44.)  JavaConfig 是配置代码,不包含任何业务逻辑,应当单独放到一个包中。

9 . (P45.)  @Bean 会告诉 Spring  这个方法将会返回一个对象,该对象要注册为 Spring 应用上下文中的 bean 。bean 的 ID 与带有 @Bean 注解的方法名是一样的。设置不同名字可以重命名方法名,也可以通过 name 属性指定不同的名字:@Bean(name = "新名字") 。

10 . (P48.)  可用 Spring  Tool  Suite 创建 XML 配置文件,并可选择对应的命名空间。

11 . (P49.)  XML 中的 <bean> 类似于 JavaConfig 中的 @Bean 。 <bean class = "此处要写全限定名(全类路径)"> 。

Spring 发现 <bean> 默认调用构造器创建 bean。

12 . (P56.)  装配通用规则:对于强依赖使用构造器注入,对于可选性的依赖使用属性注入。

在 XML 中,<property> 对应属性的 Setter 方法,<constructor-arg> 对应类的构造器。

13 . (P62.)  导入其它配置

---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 更新于 2018.11.11

14. (P62.)  @Profile(“dev”) 注解指定 bean 属于哪一个 profile 。当注解应用配置在类级别上时,表示Spring 这个配置类中的 bean只有在 dev profile 激活时才会创建。若 dev profile 没有激活,那么带有@Bean 注解的方法都会被忽略掉。

Spring 确定哪个 profile 处于激活状态,依赖两个独立的属性:spring.profiles.active 和 spring.profiles.default 。可以有多种配置方式来设置这两个属性:1)作为 DispatcherServlet 的初始化参数。2)作为 web 应用上下文参数。3)作为 JNDI 条目。4)作为环境变量。5)作为 JVM 的系统属性。6)在集成测试类上,使用 @ActiveProfiles 注解设置。

15. (P75.)  只有满足某种条件才创建 bean ,即条件化,使用注解: @Conditional ( Xxx.class ) 。xxx可以传一个任意的实现了Conditon 接口的实现类。

16. (P80.)  当只有一个 bean 匹配时,Spring 会自动装配。多个 bean匹配时,确定首选 bean 的方式 :

@Primary + @Component 组合,或者 @Bean + @Component 组合,多个 bean匹配时,可以确定优先选择对象。

XML 中可以配置 :

 <bean id="xxx" class ="xxxx" primary ="true" > 来确定首选 bean 。

17. (P81.)  指定注入 bean 方式: @Autowired + @Qualifier(" 要注入的 bean 的ID ") 。这种方式是和类名紧耦合的。

可以用自定义限定符注解 :在一个类 A 上加上注解 @Qualifier("cold") 假定表示这个类有 cold 特性。

同时把 bean  交给 Spring 管理,于是在 A 类上就有2个注解 :@Component + @Qualifier("这个位置是特性,可任意填写") 或者:@Bean + @Qualifier("特性描述") 。

当有多个特性时是不能把 @Qualifier 写多次的,会编译报错。这时就用处定义注解:public @interface Cold( ) ... public @interface Red( ) ... 等。

当在方法上、类上要注入对应特性 bean 时注解写为:@Component + @Cold + @Red ,组合起来使用就行了。

18. (P84.) Sprng 应用上下文中的所有 bean 都是单例的,不论注入多少次,每次注入的都是同一个 bean。

指定作用域来创建 bean 使用注解:@Scope("prototype") 表示该 bean  作用域类型为 原型类型。可用常量代替“prototype” ,且常量更安全。

可以基于作用域来创建 bean :1.单例(Singleton):在整个应用中,只创建一个实例。2.原型(Prototype):每次注入或者通过 Spring 应用上下文获取的时候,都会创建一个新的 bean 实例。3.会话(Session):在 web 应用中,为每个会话创建一个 bean 实例。4.请求(Request):在 web 应用中,为每个请求创建一个 bean 实例。

可以在 XML 中配置为:

<bean id ="xxx" class="xxx" scope="prototype">  表示作用域类型为:原型类型

应用场景如:购物车则把作用域设置为:会话类型。

其实,注入的并不是真正的 bean ,而是一代理对象,代理对象会报露出与原 bean 相同的方法,当service 真正调用该方法时,代理会对其进行懒解析,并将调用委托给会话作用域内真正的 bean。

19. (P89.) Spring 提供了两种在运行时求值的方式:属性占位符(Property placeholder)、Spring 表达式语言 (SpEL)。

注入外部值可以用 Spring Environment 来检索属性。

20. (P103.) Spring 切面有 5 种类型:

1.前置通知(Before):在目标方法被调用前 调用通知功能。2.后置通知(After):在目标方法完成之后 调用通知,此时不关心方法的输出是什么。3.返回通知(After-returnning):在目标方法成功执行之后 调用通知。4.异常通知(After-throwing):在目标方法抛出异常后 调用通知。5.环绕通知(Around):通知包裹了被通知的方法,在被通知方法调用之前和调用之后执行的自定义行为。

21. (P105.) Spring 提供了 4 种类型的 AOP 支持:

1.基于代理的经典 Spring AOP。2.纯 POJO 切面。3.@AspectJ 注解驱动切面。4.注入式 Aspect 切面 (适用于 Spring 各个版本)。

22. (P106.) Spring 的切面由包裹了目标对象的代理类实现。代理类处理方法的调用,执行额外的切面逻辑,并调用目标方法。

23. (P110.)  注解 @Aspect 用于定义切面。

切点定义方式:

@Pointcut(“execution( ** xxx.xxx.xxx.类名.方法名(..))”)  

也可以把以上这一行注解给在一个空参 void 方法 A 上。在其它方法上通知注解的切点写法为:@Before( "A" ),表示 这个前置通知的切点同于 A 方法的切点。

---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 更新于 2018.11.16

《 Spring 实战 》(第4版) 读书笔记 (未完结,更新中...)相关推荐

  1. Spring 实战 第4版 读书笔记

    第一部分:Spring的核心 1.第一章:Spring之旅 1.1.简化Java开发 创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB.相对EJB来说,Spring提供 ...

  2. 《Spring实战》第二章读书笔记

    装配Bean 定义表演者(Performer)接口,含有一个表演(Perform)方法: package com.springinaction.springidol;public interface ...

  3. C++书籍笔记目录汇总【目前1本读书笔记(持续更新中……)】

    C++书籍笔记汇总 C++Primer Plus (第六版)阅读笔记 + 源码分析[目录汇总]

  4. 软技能-代码之外的生存指南-读书笔记(持续更新中)

    思维导图,最后再画 文章目录 职业 自我营销 学习 生产力 理财 健身 精神 第一章 为何本书与你先前读过的任何都迥然不同 概述 职业 第二章 从非同凡响开始:绝不要做他人都在做的 选择领域做专,转变 ...

  5. 《spring实战第四版》的读书笔记

    <spring实战第四版>的读书笔记 1 概述 <Spring实战第四版>描述了Spring4架构的设计,看完了以后,最大感觉是Spring的IOC与aop理念实在是太强大了, ...

  6. C++ Primer 第三版 读书笔记

    1.如果一个变量是在全局定义的,系统会保证给它提供初始化值0.如果变量是局部定义的,或是通过new表达式动态分配的,则系统不会向它提供初始值0 2.一般定义指针最好写成:" string * ...

  7. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

  8. Think in Java第四版 读书笔记10 第16章 数组

    Think in Java第四版 读书笔记10 第16章 数组 数组和容器很像 但他们有一些差别 16.1 数组为什么特殊 数组与容器的区别主要在效率和存储类型 效率:数组是简单的线性序列 使得数组的 ...

  9. Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)

    22.一旦获得了一个 Charset,就可以在 Java 的 Unicode 和指定的编码格式之间进行转化,下面以 GBK 和 Unicode 之间做为例子. 从 Unicode 到 GBK: imp ...

  10. Spring实战第五版第二章字段校验返回视图报错解决及javax.validation完整pom依赖

    Spring实战第五版第二章 2.3 校验表单输入 在编写"/design"页面post处理逻辑时,按照书本上直接'return "design"; '方式,会 ...

最新文章

  1. win10 java applet_win10系统的ie11浏览器无法打开Java applet
  2. 规格选项表管理之查询获取规格选项表列表数据
  3. 米家摄像头固件_小米摄像头被谷歌紧急封禁!别人的设备,能看到你家现场
  4. 产品经理必须要知道的25个简约设计理念
  5. Android开源工具项目集合
  6. Linux服务器运行环境搭建(二)——Redis数据库安装
  7. Oracle密码中含有特殊字符时exp,imp的使用
  8. 排序 -> 快速排序
  9. 前端开发不容错过的jQuery图片滑块插件(转)
  10. Yarn无法查看日志: Aggregation may not be complete, Check back later or try the nodemanager at xxxx:xxxx
  11. pythonmooc期末考试编程题_大学moocPython编程基础期末考试搜题公众号答案
  12. 如何能够做好主动沟通
  13. android接推流sdk,Android-SDK推流端说明
  14. pandas训练集测试集划分_用pandas划分数据集实现训练集和测试集
  15. 傅立叶变换变换matlab,希尔伯特变换和傅里叶变换MATLAB仿真
  16. 用CSS美化表格【前端知识】
  17. c# md5加密算法实例
  18. 决策树分析例题经典案例_决策树分类的实例
  19. CU的递归划分详细介绍
  20. 【Matlab】mod函数和rem函数的区别

热门文章

  1. 一步步编写操作系统4 安装x86虚拟机 bochs
  2. 由浅到深理解ROS(6)-坐标转换
  3. Python:Sklearn概述
  4. 【HDU - 6237】A Simple Stone Game(贪心,思维,素因子分解,数学)
  5. 【2018icpc宁夏邀请赛现场赛】【Gym - 102222A】Maximum Element In A Stack(动态的栈中查找最大元素)
  6. 【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐下象棋(记忆化搜索dp,dfs)
  7. 15.深度学习练习:Deep Learning Art: Neural Style Transfer
  8. linux监控命令执行,你可能不知道的 即时监控 Linux 使用者执行指令的三种方法...
  9. pvz安卓服务器维修礼包码,植物大战僵尸2礼包兑换码大全2020最新版
  10. ios 代码设置控件宽高比_iOS--利用比例纯代码适配屏幕大小