spring总结

1.spring的话(轻量级框架,用户需要什么功能就自己添加相应的功能模块,其中自带的两大核心模块:springaop和springioc)

  spring框架给项目带来的好处:

    1,动态解耦,方便开发

      将对象之间的依赖关系交给spring进行管理,避免代码与代码之间的过度耦合

    2,方便集成各种优秀的框架

    3,支持aop编程

    4,spring是一个模块化的项目,可以根据自己的需要定制功能模块

    5,默认为单例模式创建,节省开销

  

spring框架下的核心功能模块 

  core(spring的核心容器):Core包是框架的最基础部分,并提供依赖注入(Dependency Injection)管理Bean容器功能,即提供IOC和依赖注入。

  Spring ORM:Spring与所有的主要的ORM映射框架都集成的很好,包括Hibernate、MyBatis等

  Spring AOP(面向切面编程):Spring AOP模块将面向切面编程的功能集成了


  SpringAOP指的是spring中的面向切面编程
  它的核心原理是通过动态代理实现的

  动态代理又分为
    1.jdk自带的动态代理(默认的):通过反射来接收被代理的类,要求被代理的类必须实现一个接口,生成的代理对象的方法调用都会委托到Invocation.invoke()方法中(当我们调用被代理类的方法时,这个调用都是传送进invoke方法中调用,在通过Proxy类反射出代理类对象
    2.cglib代理(用于没有实现接口的类,通过生成子类,在子类中加入需求,得到代理类)

  aop编程的具体过程为:
    将需求变成切面类(aspect),委托类中的方法变成连接点(joinpoint)
    (通知)拦截器(advice)控制织入(wave)到方法执行的位置
    增强器(adivsor用来删选哪些方法为连接点,默认委托类所有的方法为连接点),一组连接点即为切入点(JoinPoint)

  SpringIoc核心是控制反转和依赖注入,控制反转将对象的依赖关系交给ioc容器,实现了对象的解耦合,通过xml文件的配置相应的bean,spring容器进行管理
而依赖注入,则有三种注入方式(这只是单纯的手动装配):
  1.构造方法注入
  2.注解注入   使用autowired注解配置
  3.set方法注入

      <!--property 对于所有用set方式来注入的必须使用该标签-->
           <!--value 是对于基本类型,都用value(标签/属性)来注入,可以实现自动的数据类型转换-->

  4.静态工厂的方法注入

      让spring来生成和管理静态工厂(类的静态方法)产生的对象

      public class DaoFactory { //静态工厂
        public static final FactoryDao getStaticFactoryDaoImpl(){
          return new StaticFacotryDaoImpl();
        }
      }
      public class SpringAction {
        private FactoryDao staticFactoryDao; //注入对象
        //注入对象的 set 方法
        public void setStaticFactoryDao(FactoryDao staticFactoryDao) {
          this.staticFactoryDao = staticFactoryDao;
        }
      }
      //factory-method="getStaticFactoryDaoImpl"指定调用哪个工厂方法
      <bean name="springAction" class=" SpringAction" >
        <!--使用静态工厂的方法注入对象,对应下面的配置文件-->
        <property name="staticFactoryDao" ref="staticFactoryDao"></property>
      </bean>
      <!--此处获取对象的方式是从工厂类中获取静态方法-->
      <bean name="staticFactoryDao" class="DaoFactory"
        factory-method="getStaticFactoryDaoImpl"></bean>

  5.实例工厂的方法注入

   实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先 先管理 工厂类,在使用工厂类生成的对象

  <bean name="springAction" class="SpringAction">
    <!--使用实例工厂的方法注入对象,对应下面的配置文件-->
    <property name="factoryDao" ref="factoryDao"></property>
  </bean>
    <!--此处获取对象的方式是从工厂类中获取实例方法-->
  <bean name="daoFactory" class="com.DaoFactory"></bean>
  <bean name="factoryDao" factory-bean="daoFactory"   factory-method="getFactoryDaoImpl"></bean>

  spring提供了bean单例模式开发,但不保证是线程安全的
  spring用ThreadLocal处理线程并发
  Spring五种自动装配模式的区别
    1.默认配置:需自行用标签设置依赖关系(ref标签设置)
    2.byName:根据bean的name来查询一个匹配的bean(id属性)
    3.byType:根据bean的类型来查询一个匹配的bean(class属性)
    4.constructor:根据bean的构造器来查询一个匹配的bean,首先找合适带参数的
    5.autodetect:先探测构造器装配(如果有默认构造函数则选择构造注入不然选择byType注入),在选择byType的自动装配.

  spring中的bean五种作用域:

    singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例

    prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例

    request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效

    session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效

    globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效

    其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为;如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean,Spring都会新建一个Bean实例,然后返回给程序。在这种情况下,Spring容器仅仅使用new 关键字创建Bean实例,一旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态。

    如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。

原文地址:https://www.cnblogs.com/nyhhd/p/12547469.html