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里面有销毁方法
文章评论