一、简介
Spring是一款非常流行的轻量级开源开发框架,利用该框架的IoC和AOP机制可以实现多层的java ee应用程序开发。Spring是一款全方位的整合框架,能够实现
多个子框架的组合。Spring框架包含许多特性,并被很好地组织在下图所示的六个模块中。
二、Spring的IOC(控制反转)和DI(依赖注入)
IoC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。Spring所倡导的开发方式就是如此,所 有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给 你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是 spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
把对象的创建交给spring的管理 程序员不再关注对象的创建
对象的创建的过程:
1、写一个java类
2、写一个spring的配置文件,把该类放入到spring容器中
<bean id="helloWorld" class="cn.itheima03.spring.ioc.createobject.HelloWorld"></bean>
3、启动spring容器
4、把对象从spring容器中取出来
5、对象调用方法
说明:bean中的id值是唯一的,不能出现相同的ID值
spring创建bean的方式
1、默认的构造函数
2、利用静态工厂方法
1、提供静态工厂类
2、在spring的配置文件中提供工厂方法
<bean id="helloWorld_Factory" class="cn.itheima03.spring.ioc.create.HelloWorldFactory" factory-method="getInstance"></bean>
3、实例工厂方法
spring的scope
1、spring创建对象默认是单例模式
如果把一个list声明在该bean的属性中,这样list成了共享的数据,所以一般情况下把list声明在方法中
2、把spring创建的bean改成prototype模式,只需要写一个属性:scope为prototype
spring什么时候创建对象
1、在默认情况下,spring容器启动的时候,就创建对象了
有利于开发:
当spring容器启动的时候,如果配置文件中有错误,则会报错
2、当从spring容器中获取bean,当bean调用方法的时候创建对象
如果所有的bean按照这种模式加载,当spring容器启动的时候是不会报错的
如果一个bean中有大量的数据,需要的是用到的情况下加载
spring容器的初始化和销毁:init
前提条件:spring中的bean是单例的
1、在一个bean中可以提供init方法和destroy方法
2、当创建对象完成以后,直接执行init方法,该方法由spring容器来执行
3、当spring容器关闭的时候,执行destroy方法,该方法由spring容器来执行,由该方法释放资源
说明:
如果spring中的bean是多例的情况下,spring容器不负责对象的销毁,由程序员把该对象设置为null
如果spring中的bean是多例,这个时候,不管在配置文件中lazy-init设置成什么样的值,在context.getBean时才要创建对象,而且不负责销毁
Spring的DI:依赖注入 给属性赋值 set 构造函数赋值
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。 比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A 中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个 Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个 Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过 反射来实现注入的。