Spring原理简单分析

来源:互联网 发布:设计app的软件 编辑:程序博客网 时间:2024/05/06 04:54

本文知识点主要来自Spring技术内幕:深入解析Spring架构与设计原理(第2版) 。

1.spring设计理念

操作系统关心的是对存储、计算、通信、外围设备等物理资源的管理,为用户提供一个统一的服务接口。

spring其关心的是一些企业应用资源的使用,比如数据的持久化,数据集成、事务处理、消息中间件、分布式计算等高效可靠处理企业数据方法的技术抽象。

spring划分为三个层次核心、组件和应用3个基本的层次

核心及:IOC容器和aop模块。通过IOC容器来管理pojo对象,以及他们相互之间的耦合关系,使企业的信息或数据 资源可以用简单的java语言来抽象和描述;另一方面,可以通过aop,以动态和非侵入式的方式来增强服务的功能。

面向接口开发而不是依赖于具体的产品实现。

架构:SpringIOCIOC容器BeanFactory的接口与实现,同时为了让应用更方便地使用IOC容器,还需要在IOC容器的外围提供其他的支持,这些支持包括Resource访问资源的抽象和定位等。Spring还设计了IOC容器的高级形态ApplicationContext应用上下文供用户使用(一般在测试中)。

              Spring AopTransactionProxyFactoryBean声明式事务处理。在这个模块中,Spring  aop实现了一个完整的建立aop代理对象,实现aop拦截器,直至实现各种Advice通知的过程。

              SpringMVC:这个模块以DispatcherServlet为核心,实现了MVC模式,包括怎样与WEB容器环境的集成,web请求的拦截、分发、处理和ModelAndView数据的返回,以及如何集成各种UI视图展现和数据表现。通过这个模块,可以完成WEB的前端设计。

              Spring JDBC/Spring  ORM:Spring JDBC包提供了jdbcTemplate作为模板类。封装了基本的数据库操作方法,如数据查询、更新等。还提供了HibernateTemplate来实现对Hibernate的驱动,比如:Session的获取和关闭、事务处理的关联等,从而把一些通用的特性实现抽象到Spring中来,更充分地体现了Spring的平台作用。

              Spring事务处理:通过AOP的切面增强实现了声明式事务处理的功能。只需要在IOC容器中对事务属性进行配置就行。

2.Spring的核心IOC容器和aop的实现原理进行阐述。强调面向接口编程。

(本文图片来自Spring技术内幕:深入解析Spring架构与设计原理(第2版) )

1.概念IOC

控制反转,其实就是依赖注入。通过把对象的依赖注入交给框架后IOC容器来完成。

应用控制反转后,当对象被创建时,由一个调控系统内的所有对象的外界实现将其所依赖的对象的引用传递给它,即依赖被注入到对象中。

2.应用场景

IOC容器系列的设计与实现:BeanFactory和ApplicationContext

BeanFactory接口设计了getBean方法,方法:

3.使用步骤:

1.创建IOC配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息。

2.创建一个BeanFactory。

3.创建一个载入BeanDefinition的读取器。

4.从定义好的资源位置读入配置信息,具体的解析过程由XMLBeanDefinitionReader来完成。

4.ApplicationContext的应用场景

  支持不同的信息源 。

  访问资源,体现在Resource中

   支持应用事件,继承了接口ApplicationEventPublisher

IOC容器的初始化过程

第一个过程是Resource定位过程,它由ResourceLoader通过统一的Resource接口来完成。

第二个过程是BeanDefinition的载入。这个载入过程是把用户定义好的Bean表示成IOC容器内部的数据结构,而这个内部的数据结构就是BeanDefinition。这个BeanDefinition实际上就是pojo对象在IOC容器中的抽象,通过这个BeanDefinition定义的数据结构,使IOC容器能够方便地对pojo对象也就是bean进行管理。

第三个过程是向IOC容器注册这些BeanDefinition的过程。在IOC容器内部将BeanDefinition注入到一个HashMap中。注意这个过程,不包括bean依赖注入的实现。

在spring IOC的设计中,Bean定义的载入和依赖注入是两个独立的过程。依赖注入一般发生在应用第一次通过getBean向容器索取Bean的时候(所以在Action中一般要调用getBean这个方法,才能依赖注入),

5.BeanDefinition的Resource定位

classPathResource    res =  new   ClassPathResource("bean.xml");

getBean是依赖注入的起点,之后会调用createBean。

IOC实现的原理,一直是通过BeanDefinition的属性值和构造函数以显示的方式对Bean的依赖关系进行管理的。


5.1.介绍FactoryBean的实现

FactoryBean的生产特性是在getBean中起作用的

bean = getObjectForBeanInstance(sharedInstance , name , beanname , mbd);

5.2.autowiring(自动依赖装配)的实现

autowirng属性进行处理,从而完成对bean属性的自动依赖装配,实在populateBean中实现的。

通过调用autowireByNameautowireByType来完成自动依赖装配。以autowireByName为例子。

他首先需要得到当前Bean的属性名,这些属性名已经在BeanWrapperBeanDefinition中封装好了,然后是对这一系列属性名进行匹配的过程。因为已经有了属性的名字,所以可以直接使用属性名作为Bean名字向容器索取Bean,这个getBean会触发当前bean的依赖bean的依赖注入,从而得到属性对应的依赖Bean。在执行完这个getBean后,把这个依赖Bean注入到当前Bean的属性中去。这样就可以了。

知识补充

注解知识补充:

@Autowired

属于Spring注解,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。通过@Autowired的使用来消除setget方法。

步骤:

1.applicationContext.xml中加入:

<!-- 该 BeanPostProcessor 将自动对标注 @Autowired 的 Bean 进行注入 -->     

  <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>  

2.修改在原来注入spirng容器中的bean的方法。 
    在域变量上加上标签@Autowired,并且去掉 相应的getset方法

例如:

public class Student {  //JavaBean   

    

    @Autowired    

    private HomeWorkhomeWork;     

    

    @Autowired    

    private Classclass;    

    

    …     

}   

3.Resource的区别

这个注解属于J2EE,默认按照名称进行装配,名称可以通过name属性进行指定。我一般使用这个注解。

@Resource(name="student")     

private Student student;    


3.AOP


1.AOP编程

从关注点中分离出横切关注点是面向切面的程序设计的核心概念

基础可以视为待增强对象或者目标对象

切面通常包含对于基础的增强应用

配置可以看成是一种编织,通过在aop体系中提供这个配置环境,可以吧基础和切面结合起来,从而完成切面对目标对象的编织实现。

2.Advice通知

Advice定义在连接点做什么,为切面增强提供织入路口。

接口定义在org.aopalliance.aop.Advice中。

比如:BeforeAdviceAfterAdviceThrowsAdvice

BeforeAdvice原理:

1.了解类层次关系。

2.回调函数before。具体参照源码,主要是使用了回调函数。

3.Pointcut切点

切点决定Advice通知应该作用于那个连接点,也就是说通过Pointcut来定义需要增强的方法的集合,通常意味着标识方法。


4.Advisor通知器

完成对目标方法的切面增强设计(Advice)和关注点的设计(Pointcut)以后,需要一个对象把它们结合起来,完成这个作用的就是Advisor(通知器)。通过Advisor,可以定义应该使用哪个通知并在那个关注点使用它,也就是说通过Advisor,把AdvicePointcut结合起来,这个结合为使用IOC容器配置aop应用。

Spring aop中,以一个Advisor的实现(DefaultPointAdvisor)为例,来了解Advisor的工作原理。在DefaultPointcutAdvisor中有两个属性,分别是AdvicePointcut

举例微博:http://blog.csdn.net/hongmeikaile/article/details/6523067点击打开链接

3.Spring  aop的设计与实现。

动态代理



0 0
原创粉丝点击