zoukankan      html  css  js  c++  java
  • Spring学习

    Spring是什么?

    Spring是一个开源的,控制反转(Inversion of Control)和面向切面的容器框架

    IOC:应用程序本身不负责依赖对象的创建和维护,对象的依赖和维护交给外部容器负责,这样控制权就由应用程转移到了外部容器,控制权的转移就是所谓的反转。

    依赖注入(Dependency Injection):在运行时由外部容器将依赖对象注入到组件中。

    为什么使用Spring?

    1、降低组件之间的耦合度,实现各层之间的解耦

    2、可以使用容器提供的众多服务,将业务逻辑和系统服务分开,如:事务管理,日志管理,持久化等服务

    3、提供了单例模式支持,开发人员不需要自己编写实现代码

    4、提供了AOP技术,实现如:权限拦截,运行监控等功能

    5、对主流的应用框架提供集成支持,如:可以集成Struts,JPA,Hibernate

    Spring的7个模块?

    spring核心容器(Core)

    是spring的核心模块,spring的所有功能都依赖于该类库,Core主要实现IOC功能,spring 的其他功能都是借助IOC实现的

    spring上下文(Application Context)

    提供框架式的Bean访问方式,其他程序可以通过Context访问Spring的bean资源,相当于资源注入

    springAop(Aspect-Oriented Programming)

    是spring的AOP库,提供了AOP(拦截器)机制,并提供常用的拦截器,供用户自定义和配置

    springDAO(Data Access Object)

    Spring提供对JDBC的支持,对JDBC进行封装,允许在JDBC上使用对象封装,允许JDBC使用Spring资源,并能统一管理JDBC事务,并不对JDBC进行实现

    springORM(Object Relational Mapping)

    提供常用的ORM框架的管理和辅助支持,Spring支持常用的hibernate,ibtas,jdao等框架的支持,Spring本身并不对ORM进行实现,仅对常见的ORM框架进行封装,并对其进行管理。

    springWeb支持Struts集成

    提供对常见框架如struts1,struts2(WEBWORK),jsf的支持,Spring能够管理这些框架,将spring的资源注入,也能在这些框架的前后插入拦截器

    spingMVC自带MVC框架

    此模块为spring本身提供了一个轻量的MVC框架,可以使用struts也可以使用自己的,相对于struts自己的MVC框架更简洁

    spring实现的2种设计模式?

    单态模式:接受容器管理的bean,默认采用单态模式管理

    工厂模式:spring就是实例化和管理全部bean的工厂,spring的上下文就是工厂,也被设计成单态的

    工厂模式可将java对象的调用者从被调用着的实现逻辑中分离出来,调用者只需关系被调用者必须满足的规则,而不必关系实例的具体实现过程,这是面向接口编程的优势,提高解耦,避免所有的类以硬编码方式耦合在一起。

      如果所有的类直接耦合,极易形成"骨牌效应",假如B 类调用了A 类,一旦A 类需要修改,则B 类也需要修改;假如C 类调用了B 类,则C 类也需要修改......依次类推,从而导致整个系统都需要改写。造成"牵一发而动全身",而系统重构的代价是相当高的。

     Spring 倡导”面向接口编程“,可以避免上述的问题,使设计良好的架构可保证系统重构的工作被封闭在重构的层内,绝不会影响其他层。

    spring容器是实例化和管理全部bean的工厂,spring默认将所有的bean设置成单态模式,无须自己完成单态模式,即堆所有相同的id的bean请求都将返回同一个共享实例,因此,单态模式可大大降低java对象在创建和销毁是的系统开销

         单态模式限制了类实例的创建,但采用这种模式设计的类,可以保证仅有一个实例,并可提供访问该实例的全局访问点。J2EE应用的大量组件,都需要保证一个类只有一个实例。比如数据库引擎访问点只能有一个。

            更多的时候,为了提高性能,程序应尽量减少Java 对象的创建和销毁时的开销。使用单态模式可避免Java 类被多次实例化,让相同类的全部实例共享同一内存区。

            为了防止单态模式的类被多次实例化,应将类的构造器设成私有,这样就保证了只能通过静态方法获得类实例。而该静态方法则保证每次返回的实例

    都是同一个,这就需将该类的实例设置成类属性,由于该属性需要被静态方法访问,因此该属性应设成静态属性。

    http://blog.csdn.net/titilover/article/details/6729058

    spring实现依赖注入有三种方式?

    依赖注入,设置点注入,构造点注入

    IOC容器优缺点?

    优点:实现对象的热插拔。

    缺点:步骤复杂、利用反射使效率损耗、缺少IDE重构支持。

    spring容器:BeanFactory和ApplicationContext

    之间是父子的关系

    Spring实例化bean的三种方式 1:默认使用类加载器 2:使用静态工厂方法实例化bean对象 
    <bean id="名称" class="工厂类" factory-method="工厂类中创建bean实例的方法"/> 
    3:使用实例工厂方法实例化bena对象 <bean id="实例工厂名称" class="工厂类的路径"/> 
    <bean id="名称"  factory-bean="实例工厂名称" method="实例工厂里边的创建bena对象的方法"/>

    Spring管理的bean的作用域 Spring生成的bean默认为单实例。singleton。 
    如果需要每次调用Spring的getBean方法就创建一个 bean的实例,可指定bean的属性scope="prototype"

    还有:request、session、global session 这3个一般基于web的spring ApplicationContext情形下有效。

    Spring的生命周期 bean的实例化: 
    1:当作用域范围为singleton时,在初始化Spring容器的时候实例化bean实例。 
    ---1:如果lazy-init的值为true,则为延迟bean的实例化,即在Spring容器启动时不实例化bean的对象 
    2:当作用域范围为prototype时,在调用Spring的getBean的方法时实例化bean对象

    注入依赖对象可以采用手工装配或者自动装配,在实际应用中建议采用手工装配。因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。

    bean的属性

    id                       命名bean

    class                  实例化的类

    factory-method  指定工厂方法

    factory-bean     指定工厂类

    scope                指定bean的作用域

    depends-on      指定依赖bean

    lazy-init             延迟初始化bean

    init-method        初始化回调

    destory-method  析构回调

    parent              继承bean

    bean的子元素

    <property>子元素

    直接value属性、使用子<value>、使用<ref>子元素指向另一个bean

    此外property还可以包含集合:<list> <set>  <map>  <props>他们分别对应List Set  Map  Properties的值

    <constructor-arg>子元素

    用type指定参数类型、value指定输入参数的值

    用ref属性指定其他的bean

    使用<ref>子元素指向另一个bean

    springAOP

    AOP 是一个概念,一个规范,本身并没有设定具体语言的实现,这实际上提供了非常广阔的发展的空间。AspectJ是AOP的一个很悠久的实现,它能够和 Java 配合起来使用。

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。   

          AspectJ 中几个必须要了解的概念:

      Aspect: Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。

      Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。

      Pointcut(切入点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。

      Advice(通知):Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。

    注:如果没有实现接口,需要引入cglib

  • 相关阅读:
    spring-boot 参考链接
    Java中所涉及到的设计模式小记
    C# Xamarin开发 GenyMotion adb List of devices attached
    Java中的instanceof关键字
    Struts2文件下载
    Spring3基础原理解析
    JSP和Struts2、Hibernate、Spring3基础内容和原理
    Struts2多文件上传原理和示例
    Struts2单文件上传原理及示例
    Struts2国际化学习笔记
  • 原文地址:https://www.cnblogs.com/yw-ah/p/5801483.html
Copyright © 2011-2022 走看看