spring 精华知识点总结

来源:互联网 发布:应明生 软件所 编辑:程序博客网 时间:2024/04/29 23:46

1afterPropertiesSet与init-method

(1)、init-method方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。init-method需要在applicationContext.xml配置文档中bean的定义里头写明。例如:<bean id="TestBean" class="nju.software.xkxt.util.TestBean" init-method="init"></bean>
这样,当TestBean在初始化的时候会执行TestBean中定义的init方法。  
(2)、afterPropertiesSet方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。afterPropertiesSet 必须实现 InitializingBean接口。实现 InitializingBean接口必须实现afterPropertiesSet方法。 InitializingBean是一个接口,它仅仅包含一个方法:afterPropertiesSet()。spring要求init-method是一个无参数的方法,如果init-method指定的方法中有参数,那么Spring将会抛出异常init-method指定的方法可以是public、protected以及private的,并且方法也可以是final的。
(3)、BeanPostProcessor,针对所有Spring上下文中所有的bean,可以在配置文档applicationContext.xml中配置一个BeanPostProcessor,然后对所有的bean进行一个初始化方法之前和之后的代理。BeanPostProcessor接口中有两个方法: postProcessBeforeInitialization和postProcessAfterInitialization。前者postProcessBeforeInitialization在实例化及依赖注入完成后、在任何初始化代码(比如配置文件中的init-method)调用之前调用;后者postProcessAfterInitialization在初始化代码调用之后调用
 postProcessBeforeInitialization方法在bean初始化之前执行, postProcessAfterInitialization方法在bean初始化之后执行。


2 proxy-target-class 作用 该属性值默认为false,表示使用JDK动态代理织入增强;当值为true时,表示使用CGLib动态代理织入增强;但是,即使设置为false,如果目标类没有生命接口,则spring将自动使用CGLib动态代理
当要使用实现了某个接口的类让spring来生成bean时,无需在aop配置中添加proxy-target-class,因为它默认为false.

2 lazy-init详解作用 该属性值默认为false,表示ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化(也就是依赖注入),lazy-init 设置只对scop属性为singleton的bean起作用。

3 Spring bean作用域与生命周期

 参考文章:Spring BeanBean的作用域及生命周期

  • 实例化。Spring通过new关键字将一个Bean进行实例化,JavaBean都有默认的构造函数,因此不需要提供构造参数。
  • 填入属性。Spring根据xml文件中的配置通过调用Bean中的setXXX方法填入对应的属性。
  • 事件通知。Spring依次检查Bean是否实现了BeanNameAware、BeanFactoryAware、ApplicationContextAware、BeanPostProcessor、InitializingBean接口,如果有的话,依次调用这些接口。
  • 使用。应用程序可以正常使用这个Bean了。
  • 销毁。如果Bean实现了DisposableBean接口,就调用其destroy方法。

    注意:如果bean的scope设为prototype时,当ctx.close时,destroy方法不会被调用.

    原因:对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责:容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法。但对prototype而言,任何配置好的析构生命周期回调方法都将不会 被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被prototype作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。)谈及prototype作用域的bean时,在某些方面你可以将Spring容器的角色看作是Javanew 操作的替代者。任何迟于该时间点的生命周期事宜都得交由客户端来处理。
    4 BeanDefinition的载入和解析

    对IoC容器来说,这个载入过程,相当于把定义的BeanDefinition在IoC容器中转化成一个Spring内部表示的数据结构的过程。IoC容器对Bean的管理和依赖注入功能的实现,是通过对其持有的BeanDefinition进行各种相关操作来完成的。这些BeanDefinition数据在IoC容器中通过一个HashMap来保持和维护。当然这只是一种比较简单的维护方式,如果需要提高IoC容器的性能和容量,完全可以自己做一些扩展。

    IoC容器的初始化入口,也就是看一下refresh方法。这个方法的最初是在FileSystemXmlApplicationContext的构造函数中被调用的,它的调用标志着容器初始化的开始,
    这些初始化对象就是Bean. 

    4 Spring容器初始化过程

    spring的IoC容器初始化包括:Bean定义资源文件的定位、载入和注册3个基本过程。当 BeanDefinition 注册完毕以后, Spring Bean 工厂就可以随时根据需要进行实例化了。对于 XmlBeanFactory 来说,实例化默认是延迟进行的,也就是说在 getBean 的时候才会;而对于 ApplicationContext 来说,实例化会在容器启动后通过AbstractApplicationContext 中 reflash 方法自动进行,主要经过方法链: reflesh()   à finishBeanFactoryInitialization (factory) à DefaultListableBeanFactory.preInstantiateSingletons (), 在这里会根据注册的 BeanDefinition 信息依此调用 getBean(beanName) 。而真正实例化的逻辑和 BeanFactory 是“殊途同归”的,所有有关 Bean 实例化都可以从 getBean(beanName) 入手。IoC容器和上下文初始化一般不包含Bean依赖注入的实现。一般而言,依赖注入发送在应用第一次通过getBean方法向容器获取Bean时。但是有个特例是:IoC容器预实例化配置的lazyinit属性,如果某个Bean设置了lazyinit属性,则该Bean的依赖注入在IoC容器初始化时就预先完成了

    5 如何启动spring容器:在Web项目中,启动Spring容器的方式有三种,ContextLoaderListener、ContextLoadServlet、ContextLoaderPlugin。
  • 5 ApplicationContext和beanfactory区别:BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。 ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能

  • 参考文章:Spring中ApplicationContext和beanfactory区别 .

  •  6 spring如何跟struts2: struts2-spring-plugin.jar这个插件重写了struts的对象工厂,当创建一个action类时,它会根据struts的配置文件的class属性的值与spring配置文件中的id属性的值相匹配

  • 参考文章:spring与struts2结合

     7 spring如何跟mybatis:Mybatis-Spring给我们封装了一个SqlSessionFactoryBean,这个对象包含了3个必备属性,分别是数据源、扫描xml和扫描dao层用的

    [html] view plain copy
    print?在CODE上查看代码片派生到我的代码片
    1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
    2.               <property name="dataSource" ref="dataSource" />  
    3.               <property name="mapperLocations"  
    4.                      value="classpath:com/tiantian/ckeditor/mybatis/mappers/*Mapper.xml" />  
    5.               <property name="typeAliasesPackage" value="com.tiantian.ckeditor.model" />  
    6. </bean>  

    mapperLocations:它表示我们的Mapper文件存放的位置,当我们的Mapper文件跟对应的Mapper接口处于同一位置的时候可以不用指定该属性的值。

    configLocation:用于指定Mybatis的配置文件位置。如果指定了该属性,那么会以该配置文件的内容作为配置信息构建对应的SqlSessionFactoryBuilder,但是后续属性指定的内容会覆盖该配置文件里面指定的对应内容。

     typeAliasesPackage:它一般对应我们的实体类所在的包,这个时候会自动取对应包中不包括包名的简单类名作为包括包名的别名。多个package之间可以用逗号或者分号等来进行分隔。

  • 参考文章:Mybatis整合Spring

  • 0 0