当前位置: 首页 > news >正文

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就是通过反射来实现注入的
简单来说什么是依赖注入,就是给属性赋值(包括基本数据类型和引用数据类型)


转载于:https://www.cnblogs.com/amei0/p/4673344.html

相关文章:

  • 深入分析Flex [Bindable] 以及使用方法
  • indy10 学习2
  • 一个网页设计需求方眼中的网页设计
  • 正则表达式入门以及记录
  • 谈谈网页设计师的成长之路
  • 07.常用的SQL语句
  • 初步接触html心得
  • AS3所有类的接口实现一览表
  • 分页查询中绑定变量
  • Oracle11g字符集AL32UTF8修改为ZHS16GBK详解
  • 我参加了“2010年度十大杰出IT博客”大赛,请朋友们支持!
  • 使用jQuery开发一个响应式超酷整合RSS信息阅读杂志
  • MeeGo handset 1.1开发环境[6]:封装*.src.rpm和*.rpm
  • 使用Windows Service Wrapper快速创建一个Windows Service
  • [IE9] 解决了傲游、搜狗浏览器在IE9下网页截图的问题
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【面试系列】之二:关于js原型
  • Angular 4.x 动态创建组件
  • CentOS 7 防火墙操作
  • java2019面试题北京
  • javascript面向对象之创建对象
  • jdbc就是这么简单
  • Next.js之基础概念(二)
  • React16时代,该用什么姿势写 React ?
  • webpack4 一点通
  • 仿天猫超市收藏抛物线动画工具库
  • 搞机器学习要哪些技能
  • 基于遗传算法的优化问题求解
  • 记一次用 NodeJs 实现模拟登录的思路
  • 目录与文件属性:编写ls
  • 用jQuery怎么做到前后端分离
  • 智能合约Solidity教程-事件和日志(一)
  • PostgreSQL之连接数修改
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 移动端高清、多屏适配方案
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • #WEB前端(HTML属性)
  • (12)Hive调优——count distinct去重优化
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (5)STL算法之复制
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (安卓)跳转应用市场APP详情页的方式
  • (层次遍历)104. 二叉树的最大深度
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (七)Knockout 创建自定义绑定
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET 5种线程安全集合
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net framework profiles /.net framework 配置
  • .NET gRPC 和RESTful简单对比
  • .Net Web项目创建比较不错的参考文章