BeanFactory/IOC

BeanFactory是一个顶层接口,是最基本的Bean容器。Spring使用BeanFactory来生成,配置和管理Bean。

ApplicationContext是BeanFactory的子类,它比BeanFactory提供了更加丰富的功能。

平时常用的Bean容器还有3个,它们都是ApplicationContext的子类,如图所示。ClassPathXmlApplicationContext主要用在在类路径加载xml文件的场景,FileSystemXmlApplicationContext主要用在在文件系统加载xml文件的场景,XMLWebApplicationContext主要用在在Web中加载xml文件的场景。

BeanFactory和ApplicationContext在Bean加载方面有什么不同呢?

BeanFactory是延迟加载。BeanFactory初始化完成后,并不加载任何Bean,只有在第一次获取Bean时,BeanFactory才会加载该Bean。而ApplicationContext会在启动后主动加载好单例Bean,这样,从ApplicationContext中获取Bean时效率更高。

什么是 IOC

到这里我们就可以解释一下 Spring 中的核心概念之一的 IOC,即 inverse of control ,翻译过来就是反转控制。想想我们以前想要一个对象就会主动的 new 。现在 Spring 会帮我们创建对象,不需要手工 new(但是要记得配置呀)反转说的就是创建对象的方式反转了,以前是我们自己创建对象,现在由 Spring 为我们创建。

控制又是指什么呢?一个对象要有属性值吧,还有可能存在其它的对象,控制说的就是这些属性和引用不需要自己写了,由 Spring 来为我们自动创建(其实还是我们自己配置的~)。

总结下来就是 Spring 可以自动的为我们创建对象,并注入依赖。而反转控制说的就是以前我们自己创建对象和依赖,现在由程序为我们创建。

藏在 IOC 背后的 DI

DI,Dependency Injection,即依赖注入。IOC 还体现在自动注入依赖,依赖注入这词听起来不太明白,简单的理解为绑定数据,这是一种具体的技术,IOC 是思想,DI 是技术实现。对象之中需要其它的对象,类如 Service 层中需要 DAO 层对象,我们不需要在 Service 中手动 new 了,只需要配置一下即可。

常用的注入方式有两种,set 方法注入和构造方法注入。而每一种注入方式中又有注入基本数据类型和引用数据类型之分。下面就看看如何配置。

set 方法注入

通过 property 标签来配置属性,基本数据类型使用 value 属性即可,若是引用类型则使用 ref 。注意,User 对象中要有 Car 引用并且提供其 set 方法。

构造方法注入

这个配置看一眼就基本理解了,非常简单,说个小细节,对象的创建需要执行构造器,我们在初始化对象的时候会使用反射通过全类名得到对象,而这时就需要一个空参的构造器,我们不提供构造器的情况下,程序会自动为我们提供一个空参构造器,但是一旦重写构造器,我们就需要提供空参构造器,不然就报错。

虽然还有其它属性注入的方式,比方说 p 名称空间注入,spel 注入,但是这些都不重要!最常用的就一个那就是 set 方法注入。抓住重点,简单省时。

总结一下,以上主要说了什么是 Spring,如何搭建入门项目,解释了 IOC 思想,以及站在 IOC 背后的技术 DI,我们使用 set 方式注入基本数据类型和引用数据类型,当然,这些东西都构建在反射之上。

AOP 介绍

AOP 是我们经常听到的概念,然而听的太多我们却忘记了最初的定义,全称 Aspect Oriented Programming 翻译过来就是面向切面编程。首先,要搞清楚这是一种思想,Spring 的核心思想就有 AOP 。

尝试理解一下 AOP 的思想,简单来说就是“纵向重复,横向抽取”这很抽象,举几个例子,Filter 的思想,过滤器在解决乱码的时候不需要我们在每一个类中都写处理乱码的代码。而是直接由 Fliter 来统一处理。还有拦截器的思想,我们在 Action 中需要对参数进行校验、封装,而拦截器又是统一对参数进行校验、封装。

不管是 Fliter 还是拦截器,都是面向切面编程思想的具体应用。而我们今天说的 Spring 中的 AOP 又是如何体现呢?

动态代理和 cglib 代理

那就是通过代理,Spring 中通过代理达到统一增强代理对象的目的,而不需要对类中的方法一个一个增强。我们以前接触过动态代理,知道在动态代理中我们的代理对象和被代理对象需要实现同一个接口,在 Spring 中无法保证每个需要增强的类都实现接口,所以就需要引用另外一种代理技术 cglib 代理。

总结一下就是 Spring 中通过代理来体现 AOP 的思想,而代理的实现又分为动态代理和 cglib 代理。动态代理要求代理类和被代理类实现同一个接口。而 cglib 是继承代理,代理对象只需继承被代理对象即可实现。在 Spring 中优先使用动态代理。

两种代理方式有不同的测试代码,这里我不再展示,当我敲代码的时候我突然想到来上海第一次面试的时候,面试官就让我实现一下 Spring 中的 AOP,现在终于想通了,就是让我写一下两种代理方法的实现呀。可惜,当时一脸懵逼……

Spring 中与 AOP 相关名词

连接点(joinPoint): 在目标对象中,所有可以增强的方法。

切入点(pointCut): 在目标对象中,已经增强的方法。

增强/通知(advice): 增强的代码。

目标对象(target): 被代理对象。

织入(weaving): 将通知应用到到连接点。

代理(Proxy): 将通知织入到目标对象形成代理对象。

切面(aspect): 切入点+通知。

下面通过代码展示一下 Spring 中 AOP 的展示,顺带看看与这几个名词的对象关系。

上面的整个过程就是 Spring 中 AOP 的体现,将通知织入到目标对象中形成代理的这么一个过程。我们为了这个需要准备目标对象,通知对象,还要学会如何配置切点和切面。

上面只是为了测试一下能否正确的生成代理对象,而在 Spring 中真正应用 AOP 的是对事务的处理。Spring AOP 实质就是帮我们生成代理对象,而这个代理对象包含了对事务的处理。我们通过配置即可生成代理对象,而不需要我们再手敲代码处理事务。

在 Spring 中还提供了使用注解来配置,注释的出现就是为了替换配置文件,然而注释使用的不多。

总结一下,IoC 和 AOP 都是 Spring 中的核心概念,IoC 体现在 Spring 会为我们自动创建对象,由以前的手动 new 对象,到现在 Spring 统一管理。

我想到一个例子来说明一下 AOP,高速路上的收费站就是一个切面,Spring 的 IoC 就是一个发车站,负责维护汽车对象和依赖对象汽车上的人,车就是目标对象,而我们要生成的代理对象就是通过收费站的汽车。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值