spring 源码剖析(二) 熟悉基本知识

来源:互联网 发布:品茗软件哪里买 编辑:程序博客网 时间:2024/06/06 09:02

因为我也是个菜鸡,但是吃透Spring要一点一点来有借鉴有自己理解的,可能说的比较烂

了解了Spring模块化架构后,对于新手还需要掌握IOC/AOP


首先如何解决对象之间的耦合度过高的问题???

软件专家Michael Mattson提出了IOC理论,用来实现对象之间的“解耦”,

目前这个理论已经被成功地应用到实践当中,很多的J2EE项目均采用了IOC框架产品Spring。


IOC

基本概念

=================================================

IOC(Inversion of Control) 控制反转,对象创建的职责由对象本身转到了容器

控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方

1996年   Michael Mattson  提出 对象A获得依赖对象B的过程,由主动行为变为了被动行为(由第三方获取),控制权颠倒过来了,这就是“控制反转”这个名称的由来。


IOC的别名:依赖注入(DI) 

1.控制反转到底什么被反转了???
2004年,Martin Fowler 提出了获得对象的控制过程被反转了

得出 获得依赖对象的过程由自身管理变为了由IOC容器主动注入 简化为依赖注入

所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。


IOC中最基本的技术就是“反射(Reflection)”编程

反射的应用是很广泛的,很多的成熟的框架,比如象Java中的Hibernate、Spring框架

我们可以把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言的的反射编程,根据配置文件中给出的类名生成相应的对象。从实现来看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性

=====================================================================================

一系列问题:

Spring IoC容器如何知道哪些是它管理的对象呢?

这就需要配置文件,Spring IoC容器通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配。一般使用基于xml配置文件进行配置元数据,而且Spring与配置文件完全解耦的,可以使用其他任何可能的方式进行配置元数据,比如注解、基于java文件的、基于属性文件的配置都可以。

Spring管理的对象是是么??

:即Bean就是由Spring容器初始化、装配及管理的对象

IoC怎样确定如何实例化Bean、管理Bean之间的依赖关系以及管理Bean呢?

这就需要配置元数据,在Spring中由BeanDefinition代表,后边会详细介绍,配置元数据指定如何实例化Bean、如何组装Bean等。

====================================================================================

入门实践

安装jdk,配置环境,下载相关包都一样,做个动手党吧。工具推荐sts

基本例子网上都有,看下主要代码

在spring.xml中的配置依赖关系

  1.  <!-- id 表示你这个组件的名字,class表示组件类 -->  
  2. <bean id="hello" class="cn.javass.spring.chapter2.helloworld.HelloImpl"></bean> 
测试类中的主要代码

  1.              //1、读取配置文件实例化一个IoC容器  
  2.              ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");  
  3.              //2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”  
  4.               HelloApi helloApi = context.getBean("hello", HelloApi.class);  
  5.               //3、执行业务逻辑  
  6.               helloApi.sayHello(); 
自此一个完整的Spring Hello World已完成

深入理解下容器和Bean

在Spring Ioc容器的代表就是org.springframework.beans包中的BeanFactory接口,BeanFactory接口提供了IoC容器最基本功能;BeanFactory是IOC核心接口,负责实例化,定位配置应用程序中对象及监理对象之间的依赖。

而org.springframework.context包下的ApplicationContext接口扩展了BeanFactory,还提供了与SpringAOP集成、国际化处理、事件传播及提供不同层次的context实现 (如针对web应用的WebApplicationContext)。


简单说, BeanFactory提供了IoC容器最基本功能,而 ApplicationContext 则增加了更多支持企业级功能支持。ApplicationContext完全继承BeanFactory,因而BeanFactory所具有的语义也适用于ApplicationContext。


BeanFactory3种实现和使用方法

 1.XmlBeanFactory 构造参数Resource而来可以是filepath也可以是classpath

 2.ClassPathXmlApplicationContext

 3.FileSystemXmlApplicationContext


ApplicationContext接口获取Bean方法简介:

• Object getBean(String name) 根据名称返回一个Bean,客户端需要自己进行类型转换;

• T getBean(String name, Class<T> requiredType) 根据名称和指定的类型返回一个Bean,客户端无需自己进行类型转换,如果类型转换失败,容器抛出异常;

• T getBean(Class<T> requiredType) 根据指定的类型返回一个Bean,客户端无需自己进行类型转换,如果没有或有多于一个Bean存在容器将抛出异常;

• Map<String, T> getBeansOfType(Class<T> type) 根据指定的类型返回一个键值为名字和值为Bean对象的 Map,如果没有Bean对象存在则返回空的Map。


IoC容器到底是如何工作(针对xm配置来讲)

一、准备配置文件

二、由IoC容器进行解析元数据: IoC容器的Bean Reader读取并解析配置文件,根据定义生成BeanDefinition配置元数据对象,IoC容器根据BeanDefinition进行实例化、配置及组装Bean。

三、实例化IoC容器:由客户端实例化容器,获取需要的Bean。


常见的3种注入方式:set注入,接口注入,构造注入


到此你应该基本了解IOC基本概念了吧

IOC缺点

1.由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。

2.需要配置,需要学习成本

一些工作量不大的项目或者产品,不太适合使用IOC框架产品。





AOP

AOP面向切面编程

AOP适合于那些具有横切逻辑的应用

如性能监测,访问控制,事务管理、缓存、对象池管理以及日志记录

目的:分离解耦,使得用户更加专注逻辑

AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象, 
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。

aop框架具有的两个特征: 
1.各个步骤之间的良好隔离性 
2.源代码无关性

AOP使用场景

1.AOP用来封装横切关注点,具体可以在下面的场景中使用

2.Authentication 权限

3.Caching 缓存

4.Context passing 内容传递

5.Error handling 错误处理

6.Lazy loading 懒加载

7.Debugging 调试

8.logging, tracing, profiling and monitoring 记录跟踪 优化 校准

9.Performance optimization 性能优化

10.Persistence 持久化

Resource pooling 资源池

Synchronization 同步

Transactions 事务


重要的基本概念

切面(Aspect)

连接点(Joinpoint)

通知(Advice)

切入点(Pointcut)

目标对象(Target Object)

AOP代理(AOP Proxy)

通知(Advice)类型:

------------------------------------------------------------------

前置通知(Before advice)

后置通知(After advice)

返回后通知(After  Return  advice)

环绕通知(Around advice)

抛出异常后通知(After throwing advice)

AOP 代理则可分为静态代理和动态代理两大类,

其中静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;

而动态代理则在运行时借助于 JDK 动态代理、CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。

Spring的事务管理机制实现的原理,就是通过这样一个动态代理对所有需要事务管理的Bean进行加载,并根据配置在invoke方法中对当前调用的 方法名进行判定,并在method.invoke方法前后为其加上合适的事务管理代码,这样就实现了Spring式的事务管理。Spring中的AOP实 现更为复杂和灵活,不过基本原理是一致的。


总结

今天回顾了Spring 中最基础的知识下,相当于一个扫盲篇,如果有不懂的地方,希望能够及时百度查阅博客消化下, 希望能够对IOC/AOP有所熟悉,为之后的学习打下更好的基础



原创粉丝点击