Spring笔记

Spring IOC 容器:

通过阅读配置元数据提供的指令,容器知道对哪些对象进行实例化、配置和组装。配置元数据可以通过XML、Java注释或Java代码来表示。

在Spring中BeanFactory是IOC容器的实际代表者。

  • Spring BeanFactory 容器

         它是最简单的容器,给DI提供了基本的支持,它用org.springframework.beans.factory.BeanFactory接口来定义。在Spring中仍然存在具有大量的与Spring整合的第三方框架的反向兼容性的目的。

  • Spring ApplicationContext容器

         该容器添加了更多的企业特定的功能,例如从一个属性文件中解析文本信息的能力,发布应用程序事件给感兴趣的事件监听器的能力。该容器是由org.springframework.context.ApplicatonContext接口定义。

     ApplicationContext容器包括BeanFactory容器的所有功能,BeanFactory仍然可以用于轻量级的应用程序,如移动设备或基于applet的应用程序。


BeanFactory容器:

   在Spring中,有大量对BeanFactory接口的实现。其中,最常被使用的是XmlBeanFactory类。这个容器从一个XML文件中读取配置元数据,由这些元数据来生成一个呗配置化的系统或者应用。

步骤:

  • 第一步利用框架提供的XmlBeanFactory()API去生成工厂 bean 以及利用 ClassPathResource()API 去加载在路径CLASSPATH下可用的bean配置文件。XmlBeanFactory()API负责创建并初始化所有的对象,即在配置文件中提到的bean。
  • 第二步利用第一步生成的 bean 工厂对象的 getBean()方法得到所需要的 bean。这个方法通过配置文件中的 beanID 来返回一个真正的对象,该对象最后可用于实际的对象。一旦得到这个对象,你就可以利用这个对象来调用任何方法。

ApplicationContext容器:

        ApplicationContext包含BeanFactory所有的功能,一般情况下,相对于BeanFactory,ApplicationContext会更加优秀。最常被使用的ApplicationContext接口实现:

  •        FileSystemXmlApplicationContext : 该容器从XML文件中加载已被定义的bean。在这里,你需要提供给构造器XML文件的完整路径。
  •        ClassPathXmlApplicationContext:该容器从XML文件中加载已被定义的bean。在这里,你不需要提供XML文件的完整路径,只需正确配置CLASSPATH环境变量即可。
  •        WebXmlApplicationContext:该容器会在一个web应用程序的范围内加载在XML文件中已被定义的bean。

Bean 定义:

       被称作bean的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的。bean是一个被实例化、组装,并通过Spring IoC容器所管理的对象。这些bean是由用容器提供的配置元数据创建的。

Bean 与 Spring 容器的关系:

  1.     Spring容器读取 Bean 配置信息
  2.     Spring容器根据 Bean 注册表实例化Bean
  3.     将实例化Bean放到Spring容器中(Bean缓存池)
  4.     应用程序使用Bean

Spring配置元数据

    Spring IOC 容器完全由实际编写的配置元数据的格式解耦。有下面三个重要的方法吧配置元数据提供给Spring容器:

  •      基于XML的配置文件
  •      基于注解的配置
  •      基于Java的配置

Spring Bean 作用域

      当在Spring中定义个bean时,你必须声明该bean的作用域的选项。例如,为了强制Spring在每次需要时都产生一个新的bean实例,你应该声明bean的作用域的属性为prototype。同理,如果你想让Spring在每次需要时都返回同一个bean实例,你应该声明bean的作用域的属性为singleton。

      Spring框架支持以下五个作用域,分别为singleton、prototype、request、session和global session。

  singleton作用域:

      Singleton是单例类型,就是在创建容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中缺省作用域。

   prototype作用域:

      Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。


Spring Bean 生命周期

      Bean的生命周期可以表达为:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁

      有两个生命周期回调方法:

      1.  声明带有init-method 和 destroy-method参数的。init-method属性指定一个方法,在实例化bean时,立即调用该方法。同样,destroy-method指定一个方法,只有从容器中移除bean之后,才能调用该方法。

      2.  执行初始化回调 、销毁回调 。初始化回调实现InitializingBean接口指定的afterPropertiesSet()方法,销毁回调实现DisposableBean接口指定的一个destroy()方法


 Spring Bean 后置处理器

    Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理。、

    BeanPostProcessor 接口定义回调方法,你可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等。


Spring Bean 定义继承

    Bean定义继承:

     bean定义可以包含很多的配置信息,包括构造函数的参数、属性值,容器的具体信息例如初始化方法,静态工厂方法名,等等。

     子bean的定义继承父定义的配置数据。子定义可以根据需要重写一些值,或者添加其他值。

     Spring Bean定义的继承与Java类的继承无关,但是继承的概念是一样的。你可以定义一个父bean的定义作为模板和其他子bean就可以从父bean中继承所需的配置。


Spring依赖注入

   Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系。

   依赖注入:

        每个基于应用程序的java都有几个对象,这些对象一起工作来呈现出终端用户所看到的工作的应用程序。当编写一个复杂的Java应用程序时,应用程序类应该尽可能独立于其他Java类来增加这些类重用的可能性,并且在做单元测试时,测试独立于其他类的独立性。

基于类构造函数的依赖注入    基于setter方法的依赖注入


Spring 基于构造函数的依赖注入:

      构造函数参数解析:

          如果存在不止一个参数时,当把参数传递给构造函数时,可能会存在歧义。要解决这个问题,那么构造函数的参数在bean定义中的顺序就是把这些参数提供给适当的构造函数的顺序就可以了。

         如果你使用 type 属性显式的制定了构造函数参数的类型,容器也可以使用与简单类型匹配的类型。

< constructor-arg type = "int" value ="2001"/>

          最后并且也是最好的传递构造函数参数的方式,使用index属性来显式的指定构造函数参数的索引。下面是基于索引为0的例子,如下所示:

<constructor-arg index ="0" value ="2001"/>

         最后,如果你想要向一个对象传递一个引用,你需要使用标签的 ref 属性,如果你想要直接传递值,那么你应该使用如上所示的value属性。


Spring基于设值函数的依赖注入

      定义在基于构造函数注入和基于设值函数注入中的Beans.xml文件的区别。唯一的区别就是在基于构造函数注入中,我们使用的是<bean> 标签中的<constructor-arg>元素,而在基于设值函数的注入中,我们使用的是<bean>标签中的<property>元素。

      -ref部分表明这不是一个直接的值,而是对另一个bean的引用。


Spring注入内部Beans:

        inner beans 是在其他bean的范围内定义的bean。因此在或元素内元素被称为内部bean。

<bean id = "textEditor" class = "com.tutorialspoint.TextEditor">
   <property name = "spellChecker">
       <bean id = "spellChecker"  class = ""/>
   </property>
</bean>

Spring 注入集合

    Spring提供了四种类型的集合的配置元素:

         <list>  <set>  <map>  <props>

    存在两种情况:1.传递集合中直接的值     2.传递一个bean的引用作为集合的元素

     注入null和空字符串的值:

      a.空字符串

<bean id ="" class ="">
   <property name = "email" value=""/>
</bean>

     b.NULL值。

<bean id = " " class = " ">
   <property name = ""><null/></property>
</bean>

Spring Beans 自动装配

      Spring 容器可以在不使用<constructor - arg><property> 元素的情况下自动装配相互协作的 bean 之间的关系,这有助于减少编写一个大的基于Spring的应用程序的XML配置的数量。

      可以使用 <bean> 元素的autowire属性为一个bean定义指定自动装配模式。

     自动装配的局限性

      当自动装配始终在同一个项目中使用时,它的效果最好。如果通常不使用自动装配,它可能会使开发人员混淆的使用它来连接只有一个或两个bean定义。不过,自动装配可以显著减少需要指定的属性或构造器参数,但你应该在使用它们之前考虑到自动装配的局限性和缺点。


Spring自动装配 ‘byName’

Spring自动装配‘byType’

 Spring由构造函数自动装配


Spring 基于注解的配置

   @Required 注解

       @Required注释 应用于bean属性的setter方法,它表明受影响的bean属性在配置时必须放在XML配置文件中,否则容器就会抛出一个BeanInitializationException异常。

    @Autowired注解

        @Autowired注释对在哪里和如何完成自动连接提供了更多的细微的控制。

    @Qualifier注解

         @Qualifier注释和@Autowired注释通过指定哪一个真正的bean将会被装配来消除混乱。


 Spring基于Java的配置

       @Configuration 和 @Bean注解

         HelloWorldConfig.java:配置类

         HelloWorld.java: 基本类

         MainApp.java:  主类

      @Import 注解:

           @Import注解允许从另一个配置类中加载@Bean定义。


 Spring框架的AOP

       Spring框架的一个关键组件是面向方面的编程(AOP)框架。面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点。跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。有各种各样的常见的很好的方面的例子,如日志记录、审计、声明式事务、安全性和缓存等

 AOP术语

      Aspect   Join point    Advice   Pointcut   Introduction   Target object     Weaving


Spring JDBC 框架

     sqlsessionFactory


 Spring 事务管理

      ACID

      局部事务   VS   全局事务

      局部事务是特定于一个单一的事务资源,如一个JDBC连接,而全局事务可以跨多个事务资源事务,如在一个分布式系统中的事务。

       局部事务管理在一个集中的计算环境中,全局事务管理需要在分布式计算环境中,所有的资源都分布在多个系统中。

      编程式   VS   声明式

  •       编程式事务管理   :   这意味着你在编程的帮助下有管理事务。这给了你极大的灵活性,但却很难维护 。
  •       声明式事务管理   :   这意味着你从业务代码中分离事务管理。你仅仅使用注释或 XML 配置来管理事务。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值