Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。


  ◆目的:解决企业应用开发的复杂性,( spring以一种非侵入式的方式来管理你的代码,  提倡最少侵入,适当的时候安装和卸载spring)
  ◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能


  ◆范围:任何Java应用


  简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。


  ◆轻量——从大小与开销两方面而言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也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

springIOC

   spring的控制反转:把对象的创建,初始化,销毁等工作交给spring容器来做,由spring容器控制对象的生命周期

   纳入spring容器的每个对象都叫bean

  applicationContext.xml spring的默认配置文件,这么写在myelipse中可以识别,图标会变

<beans>    
<!--将类纳入spring容器
id: 为bean的唯一标识,将类纳入spring容器起的名字
正规的写法:类的第一个字母变成小写,其余不变
class: 为类的类路径
-->
<bean id="" class=""></bean> </beans>

 //启动spring容器

        创建spring容器对象相当于启动spring容器

   //spring容器做的工作

   * 创建对象

ApplicationContext content=new ClassPathXmlApplicationContext("全路径");
//也可以是数组 context.getBean("配置文件中bean的id");
//获取spring容器中的bean,就是获取spring容器创建的对象

alias 别名

 在配置文件中

<!--  
alias: 给指定的bean起个别名字
name: 与bean中的id对应
注:bean的id和别名都能用
-->
<alias alias="自定义别名" name="bean的id"/>

spring如何创建对象,可以模拟spring解析原来认知

  使用构造方法检测:

    无参的构造方法执行则

 说明spring容器默认调用类的默认构造器来创建对象

如果没有无参的构造方法,spring容器在创建对象时会报错

spring实例化bean的方法:

* 用构造器来实例化

* 用静态工厂方法实例化

   工厂中使用静态方法返回类的对象

<bean id=""  factory-method="工厂中静态方法的方法名">

不写factory-method只能实例化静态工厂,写了factory-method在使spring容器纳入的静态工厂中指定的静态方法创建的对象

 spring容器做的事情:

    spring容器调用了工厂类的构造方法来创建工厂对象

真正创建对象是程序员使用静态方法创建的

public static HelloWorld createBean(){
return new HelloWorld();
}

//如果没有上面的配置那么获取到的bean就是Factory,而不是

HelloWorld hw=(HelloWorld)context.getBean("yxk");

* 使用实例工厂方法实例化

<bean id="serviceLocator" class="DefaultServiceLocator"></bean>//将工厂类纳入spring容器,
<bean id="exampleBean" factory-bean="serviceLocator" factory-method="createInstance"/> //实例化指定工厂中的方法返回的对象

 spring的配置文件中有几个bean,spring容器启动时就会创建几个对象


初始化bean的时机

  使用断点默认构造方法来判断

  在默认情况下,spring容器启动的时候,就把所有的纳入spring容器的bean创建了对象--ApplicationContext context=new ClassPathXmlApplicationContext("../applicationContext.xml");

    缺点:占用资源,用一个创建多个不划算

    如果一个对象中有属性,如果这个属性为集合,在创建这个对象的过程中,集合中有数据,这样采用默认的的启动形式,就会导致数据过早的加载到内存中

  如果在配置文件中<bean lazy-init="true">来延迟bean的创建时间,

  在context.getBean时才要创建bean的对象

  如果spring的配置文件书写错误,如果所有的spring的bean都采用lazy-init="true"这种形式,则在启动web服务器的时候,发现不了spring容器的错误,这样是不利于排错的

  lazy-init="default"等价于lazy-init="false"

bean的作用域

 spring容器默认产生的bean是单例模式

 在配置文件的bean标签中配置scope属性,默认是单例

   scope决定bean初始化的方式

 * singleton 单例 默认  注意并发问题

      对象中public的字段将成为共享的,lazy-init=true时在getbean的时候创建对象

 * prototype 原型 多列

    当spring容器中的bean是多例,则不管配置文件中的lazy-init不管是什么值,在context.getBean时才要为bean创建对象

 * request

 * session  

 在spring的配置文件中:

  如果写默认的形式(singleton单例),一个集合或者一个数据出现在了类的属性中,这个数据将成为全局的数据(共享数据),应该注意并发问题


指定spring的初始化和销毁方法

  在配置文件中bean标签的属性init-method="初始化方法名" destroy-method="销毁方法名"

    * init-method 对象的初始化方法

  当该bean为单例模式   在构造方法之后执行,构造执行后紧跟着init方法

  当该bean为多例模式  初始化方法的执行和方法的存放顺序有关

* destroy-method  对象的销毁方法

  * 当该bean为单例模式,才能调用该方法

     在spring容器销毁的时候调用,

  * 当该bean为多例时,spring容器不负责对象的销毁工作

  * 如果该bean为多例时,当不用该bean时,应该手动销毁资源文件

 ClassPathXmlApplicationContext里面有销毁方法