zoukankan      html  css  js  c++  java
  • spring(一)IOC & AOP

    参考文档:

    spring详解:http://www.cnblogs.com/ysocean/p/7466191.html (可以说非常详细了)

    aop源码详解:https://www.cnblogs.com/xrq730/p/6753160.html

    spring bean的作用域和生命周期:https://www.cnblogs.com/zhanglei93/p/6231882.html

    spring 解决循环依赖:https://blog.csdn.net/u010644448/article/details/59108799

    spring中的设计模式:https://www.cnblogs.com/hwaggLee/p/4510687.html

    什么是 Spring

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)
    简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架
    计精妙、结构清晰、匠心独运,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果

    Spring 框架结构

    核心容器:核心容器提供 Spring 框架的基本功能(Spring Core)。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
    Spring 上下文:Spring 上下文是一个配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
    Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
    Spring DAO:JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
    Spring ORM:Spring 框架插入了若干个ORM框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
    Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
    Spring MVC 框架:MVC框架是一个全功能的构建 Web应用程序的 MVC 实现。通过策略接口,MVC框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。模型由javabean构成,存放于Map;视图是一个接口,负责显示模型;控制器表示逻辑代码,是Controller的实现。Spring框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同J2EE 环境(Web 或EJB)、独立应用程序、测试环境之间重用

    Spring 框架特征

    轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
    控制反转——Spring通过一种称作控制反转(IoC)的技术促进了低耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
    面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
    容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
    框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
    MVC——Spring的作用是整合,但不仅仅限于整合,Spring 框架可以被看做是一个企业解决方案级别的框架。客户端发送请求,服务器控制器(由DispatcherServlet实现的)完成请求的转发,控制器调用一个用于映射的类HandlerMapping,该类用于将请求映射到对应的处理器来处理请求。HandlerMapping 将请求映射到对应的处理器Controller(相当于Action)在Spring 当中如果写一些处理器组件,一般实现Controller 接口,在Controller 中就可以调用一些Service 或DAO 来进行数据操作 ModelAndView 用于存放从DAO 中取出的数据,还可以存放响应视图的一些数据。 如果想将处理结果返回给用户,那么在Spring 框架中还提供一个视图组件ViewResolver,该组件根据Controller 返回的标示,找到对应的视图,将响应response 返回给用户

    Spring 优点

    1.低侵入式设计,代码污染极低
    2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
    3.Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
    4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用
    5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
    6.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部

    什么是 IOC

    IOC-Inversion of Control,即控制反转。它不是什么技术,而是一种设计思想
    传统的创建对象的方法是直接通过 new 关键字,而 spring 则是通过 IOC 容器来创建对象,也就是说我们将创建对象的控制权交给了 IOC 容器。我们可以用一句话来概括
    IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建、初始化、销毁等工作交给spring容器来做
    基于单例+反射实现
    spring单例源码:

        public abstract class AbstractBeanFactory implements ConfigurableBeanFactory{    
           /**  
            * 充当了Bean实例的缓存,实现方式和单例注册表相同  
            */    
           private final Map singletonCache=new HashMap();    
           public Object getBean(String name)throws BeansException{    
               return getBean(name,null,null);    
           }    
        ...    
           public Object getBean(String name,Class requiredType,Object[] args)throws BeansException{    
              //对传入的Bean name稍做处理,防止传入的Bean name名有非法字符(或则做转码)    
              String beanName=transformedBeanName(name);    
              Object bean=null;    
              //手工检测单例注册表    
              Object sharedInstance=null;    
              //使用了代码锁定同步块,原理和同步方法相似,但是这种写法效率更高    
              synchronized(this.singletonCache){    
                 sharedInstance=this.singletonCache.get(beanName);    
               }    
              if(sharedInstance!=null){    
                 ...    
                 //返回合适的缓存Bean实例    
                 bean=getObjectForSharedInstance(name,sharedInstance);    
              }else{    
                ...    
                //取得Bean的定义    
                RootBeanDefinition mergedBeanDefinition=getMergedBeanDefinition(beanName,false);    
                 ...    
                //根据Bean定义判断,此判断依据通常来自于组件配置文件的单例属性开关    
                //<bean id="date" class="java.util.Date" scope="singleton"/>    
                //如果是单例,做如下处理    
                if(mergedBeanDefinition.isSingleton()){    
                   synchronized(this.singletonCache){    
                    //再次检测单例注册表    
                     sharedInstance=this.singletonCache.get(beanName);    
                     if(sharedInstance==null){    
                        ...    
                       try {    
                          //真正创建Bean实例    
                          sharedInstance=createBean(beanName,mergedBeanDefinition,args);    
                          //向单例注册表注册Bean实例    
                           addSingleton(beanName,sharedInstance);    
                       }catch (Exception ex) {    
                          ...    
                       }finally{    
                          ...    
                      }    
                     }    
                   }    
                  bean=getObjectForSharedInstance(name,sharedInstance);    
                }    
               //如果是非单例,即prototpye,每次都要新创建一个Bean实例    
               //<bean id="date" class="java.util.Date" scope="prototype"/>    
               else{    
                  bean=createBean(beanName,mergedBeanDefinition,args);    
               }    
        }    
        ...    
           return bean;    
        }    
        }     
    View Code

    什么是AOP

    AOP(Aspect Oriented Programming),通常称为面向切面编程。它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。基于动态代理实现。

    什么是DI依赖注入

    spring动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的
    简单来说什么是依赖注入,就是给属性赋值(包括基本数据类型和引用数据类型)


  • 相关阅读:
    赫尔维茨公式
    从解析几何的角度分析二次型
    Struts 1 Struts 2
    记一次服务器被入侵的调查取证
    契约式设计 契约式编程 Design by contract
    lsblk df
    Linux Find Out Last System Reboot Time and Date Command 登录安全 开关机 记录 帐号审计 历史记录命令条数
    Infrastructure for container projects.
    更新文档 版本控制 多版本并发控制
    Building Microservices: Using an API Gateway
  • 原文地址:https://www.cnblogs.com/amei0/p/4673344.html
Copyright © 2011-2022 走看看