Spring实战读书笔记

Spring-core

Spring之旅 - DI 和 AOP 概念

  • spring 的Bean容器
  • spring 的 核心模块

Spring的核心策略

  • POJO 最小侵入式编程

    Spring不会强迫你实现接口或者继承类,通过DI来装配POJO类型。
  • 采用依赖注入和面向接口实现松耦合

    依赖反转容器(IOC):将整体设计和局部实现之间的依赖关系反转,比如汽车厂设计汽车:如果先设计轮子,再根据轮子设计底盘,再根据底盘设计汽车,在我们更换轮子的时候就会由于轮子和底盘之间依赖关系带来很多不便,我们让轮子去依赖汽车,这就是依赖反转。依赖反转容器就是用来实现依赖反转的代码实现。

    依赖注入(DI):是一种实现依赖反转的方式,将类内成员的属性通过注入的方式获得,这样就将 类成员的初始化 和销毁的职责全部交给了外部去实现,而且还可以抽象出接口。
  • 切面和模板减少样板式代码 实现声明式编程

    面向切面编程(AOP):面向切面编程可以把功能分离出来形成单独的组件,比如日志,事务管理等系统服务在业务逻辑中的分散容易形成混乱(即使抽象为模块函数也会有函数的调用),AOP能够让这些服务模块化 用声明的方式来应用到它们需要影响的组件中,通过动态代理 根本 无需知道这些类的存在。

容纳你的Bean

在基于spring的应用中,容器负责创建对象,配置对象和销毁对象。

Bean工厂提供简单的DI支持

应用上下文提供应用框架级别的服务

Bean的生命周期

装配Bean - 拼装应用组件

  • 声明Bean
  • 构造器注入 和 Setter注入
  • 装配Bean
  • 控制Bean的创建和销毁

Spring 配置的可选方案

  • 在XML中进行显式配置(了解)
  • 在Java中显式配置(了解)
  • Bean发现和自动装配

    Spring通过组件扫描 和autowiring 实现自动化装配

创建可被发现的Bean

首先通过接口建立功能上的抽象,创建接口的一个实现并添加注解(Spring会为这个类创建Bean)。通过@ComponentScan来启用扫描。

为组件扫描的Bean命名

Spring应用上下文中的bean都会有一个ID,如果没有指定就会是类名的第一个字符变为小写,可通过@Named来指定命名。

通过为Bean添加注解实现自动装配

@AutoWired注解不仅仅可以使用在构造器上,还能用在属性的Setter方法上,如果不是必须的匹配,那么可以将required 设置为false。多个Bean可以满足条件的话将会报错。

高级装配

  • Spring profile
  • 条件化的Bean声明
  • 自动装配和歧义性
  • Bean的作用域
  • Spring表达式语言

环境与profile

通过配置profile bean 来实现,要使用profile 首先要将不同的bean整理到一个或者多个profile中,部署的时候确定对应的profile处于active 的状态。配置profile bean。激活profile bean。

条件化的bean (了解 @Condition)

处理自动化装配歧义性

在多个@Bean 满足条件的情况下会抛出异常,此时应该使用@Primary来标识首选的@Bean。

使用限定符限制可以选择范围。@Qualifier来指定符合条件的bean-id。

Bean作用域

默认情况下所有的bean都是单例注入的,Spring定义了多种作用域

使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

>* Singleton

>* Prototype 每次注入或者获取都会获得一个新的实例

>* Session 每个会话创建一个bean实例

> 使用proxyMode(作用域代理)来生成代理 实现懒加载 并且 注入真正会话对应的 Bean

>* Request 在Web应用中每个请求创建一个实例

使用XML配置作用域(了解)

运行时值注入

属性占位符 和 SqEL。

  • 注入外部的值

    使用@PropertySource 注解属性来源

{...} SqEL 表达式

${...} 属性占位符

面向切面 - 如何使用AOP解耦

软件开发中很多应用被称为横切关注点,AOP实现横切关注点和业务逻辑代码的分离。

什么是面向切面编程

切面实现了横切关注点的模块化,使得每个关注点都集中在一个地方,其次,服务模块只包含核心功能代码,次要代码被转移到切面中。

AOP术语

  • advice 切面的工作

前置

后置 不能访问执行结果

返回

异常

环绕

  • pointcut 通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”
  • joinpoint 连接点是在应用执行过程中能够插入切面的一个点,调用切点的时机。
  • Spring对AOP的支持

基于代理的经典Spring AOP;

纯POJO切面;

@AspectJ注解驱动的切面;

注入式AspectJ切面(适用于Spring各版本)

通过代理类封装目标类,拦截调用目标类的消息。直到真正需要被代理的bean的时候,Spring才创建代理对象。

通过切点来选择连接点

  • 编写切点:

    当concert包下的Performance接口被调用

    execution(* concert.Performance.perform(..))

    可以使用&& 和 ||
  • 在切点中选择bean

    bean()可以使用 bean 的id 或者 name 来限制切点只匹配特定的bean。

使用注解创建切面

  • 定义切面

    对类使用@AsspectJ 进行标注,表示Audience不仅仅是一个POJO ,还是一个切面

    通过特定的注解来指定连接点

    可以通过@Pointcut 来指定经常使用的连接点

    启用自动代理
  • 创建环绕通知

    环绕通知可以将整个方法完全包装,相当于在一个通知方法中同时编写前置后置通知。

    通过ProceedingJointPoint 来调用方法,甚至可以直接屏蔽掉方法。
@Aspect
public class Audience{
@Pointcut("execution(* concert.Performance.perform(..))")
public void performance(){} @Around("performance()")
public void watchPerformance(ProceedingJoinPoint jp){
try{
System.out.println("Silencing cell phones");
jp.proceed();
System.out.println("CLAP");
}
catch(Throwable e){
System.out.println("Demanding a refund");
}
}
}
  • 处理通知中的参数

    args限定符表明传递给 连接点的 方法也会传递到通知中去。
@PointCut("performacne()" + "&& args(trackNumber)")
public void trackPlayed(int trackNumber);

通过注解添加新的功能

  • 基于动态代理暴露新的功能

    给所有类添加一个新的接口

    借助AOP的引入,不必侵入式实现,可以用@DeclareParents

在XML中声明切面(了解)

Spring实战读书笔记的更多相关文章

  1. <<Java RESTful Web Service实战>> 读书笔记

    <<Java RESTful Web Service实战>> 读书笔记 第一章   JAX-RS2.0入门 REST (Representational State ransf ...

  2. 机器学习实战 - 读书笔记(13) - 利用PCA来简化数据

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第13章 - 利用PCA来简化数据. 这里介绍,机器学习中的降维技术,可简化样品数据. ...

  3. 机器学习实战 - 读书笔记(12) - 使用FP-growth算法来高效发现频繁项集

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第12章 - 使用FP-growth算法来高效发现频繁项集. 基本概念 FP-growt ...

  4. 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...

  5. 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习笔记,这次是第7章 - 利用AdaBoost元算法提高分类性能. 核心思想 在使用某个特定的算法是, ...

  6. iPhone与iPad开发实战读书笔记

    iPhone开发一些读书笔记 手机应用分类1.教育工具2.生活工具3.社交应用4.定位工具5.游戏6.报纸和杂志的阅读器7.移动办公应用8.财经工具9.手机购物应用10.风景区相关应用11.旅游相关的 ...

  7. Spring揭秘 读书笔记 三 bean的scope与FactoryBean

    本书可作为王富强所著<<Spring揭秘>>一书的读书笔记  第四章 BeanFactory的xml之旅 bean的scope scope有时被翻译为"作用域&quo ...

  8. spring揭秘 读书笔记 二 BeanFactory的对象注册与依赖绑定

    本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,而且IoC Service Pr ...

  9. spring揭秘 读书笔记 一 IoC初探

    本文是王福强所著<<spring揭秘>>一书的读书笔记 ioc的基本概念 一个例子 我们看下面这个类,getAndPersistNews方法干了四件事 1 通过newsList ...

随机推荐

  1. 升级Python2.7

    习惯于centos6.5的系统,却习惯使用Python2.7,每次都会升级Python版本,安装pip.于是总结了升级过程中遇到问题(原创) 升级Python2.7 注意的是 1.编译2.7时依赖问题 ...

  2. 对gridview绑定数据的操作方法及自定义显示内容

    GridView中Eval和 Bind 的使用 Eval:绑定的是只读数据的显示:Bind:可以绑定只读数据也可以绑定更新数据,Bind方法还把字段和控件的绑定属性联系起来,使得 数据控件(比如Gri ...

  3. ButterKnife 在父类 点击事件没反应的解决方案

    在用继承的方式实现butterKnife的封装的时候遇到问题, butterKnife就在baseActivity中绑定的,但是父类中公共控件点击事件无效.找了半天原因,原来是子类和父类定义的点击方法 ...

  4. SCHTASKS /CREATE

    SCHTASKS   "/" 这个符号前要加个空格才能运行成功  ,搞半天!

  5. IMX6核心板系列解决方案-工业级|商业级|四核|双核|Plus核心板

    i.MX 6Quad四核商业级和工业级系列的应用处理器将可扩展平台与广泛的集成和高能效处理功能相结合,尤其适合多媒体应用.i.MX6 Quad处理器的特性包括: 满足操作系统和游戏的MIPS需求,增强 ...

  6. Python 保留n位小数

    输出a, b 且保留三位小数 a = 2.3456 b = 2.0000 三种方法: round(a, 3)('%.3f' % a)Decimal(a).quantize(Decimal('0.000 ...

  7. viewport 640宽的做法 针对iphone和安卓单独设置

    <!DOCTYPE html> <html lang="ch"> <head> <meta charset="utf-8&quo ...

  8. CAD参数绘制椭圆弧(网页版)

    在CAD设计时,需要绘制椭圆弧,用户可以设置椭圆弧基本属性. 主要用到函数说明: _DMxDrawX::DrawEllipseArc 绘制椭圆弧.详细说明如下: 参数 说明 DOUBLE dCente ...

  9. SQLServer:查询所有外键关联表信息

     --从左到右分别是: 外键约束名,子表名,外键列名,父表名 --use demodtcms--外键信息select fk.name fkname , ftable.name ftablename, ...

  10. Linux安装64位Mysql5.7.22

    以安装在/usr/local目录下为例 1.下载安装包地址:https://dev.mysql.com/downloads/file/?id=476936,安装包保存到/usr/local 2.解压: ...