前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《 Spring 实战 》(第4版) 读书笔记 (未完结,更新中...)

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

作者头像
微风-- 轻许--
发布2022-04-13 16:02:42
2690
发布2022-04-13 16:02:42
举报
文章被收录于专栏:java 微风java 微风

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 发现机制和自动装配。

代码语言:javascript
复制
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.)

代码语言:javascript
复制
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 注解的方法都会被忽略掉。

代码语言:javascript
复制
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 中可以配置 :

代码语言:javascript
复制
 <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” ,且常量更安全。

代码语言:javascript
复制
可以基于作用域来创建 bean :

1.单例(Singleton):在整个应用中,只创建一个实例。

2.原型(Prototype):每次注入或者通过 Spring 应用上下文获取的时候,都会创建一个新的 bean 实例。

3.会话(Session):在 web 应用中,为每个会话创建一个 bean 实例。

4.请求(Request):在 web 应用中,为每个请求创建一个 bean 实例。

可以在 XML 中配置为:

代码语言:javascript
复制
<bean id ="xxx" class="xxx" scope="prototype">  表示作用域类型为:原型类型

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

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

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

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

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

代码语言:javascript
复制
1.前置通知(Before):在目标方法被调用前 调用通知功能。

2.后置通知(After):在目标方法完成之后 调用通知,此时不关心方法的输出是什么。

3.返回通知(After-returnning):在目标方法成功执行之后 调用通知。

4.异常通知(After-throwing):在目标方法抛出异常后 调用通知。

5.环绕通知(Around):通知包裹了被通知的方法,在被通知方法调用之前和调用之后执行的自定义行为。

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

代码语言:javascript
复制
1.基于代理的经典 Spring AOP。

2.纯 POJO 切面。

3.@AspectJ 注解驱动切面。

4.注入式 Aspect 切面 (适用于 Spring 各个版本)。

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

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

切点定义方式:

代码语言:javascript
复制
@Pointcut(“execution( ** xxx.xxx.xxx.类名.方法名(..))”)  

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

更新于 2018.11.16

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档