Spring IOC和DI
-
IOC:
是控制反转,是一种思想,不是技术,即创建对象的控制权的反转。在不使用Spring的情况下,我们是在程序中根据需要来new出对象,创建对象的控制权由程序本身来控制。在spring中,不再是我们自己去new对象,而是通过注解或者xml配置的方式,让spring去帮我们创建需要的对象,然后放在spring容器里面,把创建对象的控制权交给了spring,在我们需要这个对象的时候去spring容器里面去取。
-
DI:
是依赖注入,本质上跟IOC说的是同一个思想,DI侧重于实现方式,是大牛马丁-福洛研究了springIOC之后提出的新名词。这里的依赖是指当前程序依赖spring容器,注入是指spring容器把程序所需要的对象注入程序之中。
-
IOC的作用:
我们通过IOC把Bean都交给spring容器去管理,同时也相当于把Bean之间的依赖关系也交给了spring容器,这样一来可以在一定程度上减少Bean之间的耦合,但是并不能完全消除耦合。
-
DI的三种注入方式:
- setter方法:程序提供需要注入的属性的set方法,spring根据setter方法进行注入。
- 构造函数:程序提供自己的带参构造方法,spring根据构造方法进行注入。
- 接口:程序提供所需对象的接口,spring根据接口方法进行注入。(不常用)
spring中Bean的生命周期和作用域
-
ApplicationContext创建容器的三个常用实现类:
- ClassPathXmlApplicationCOntext:它可以加载类路径下的配置文件,所以要求配置文件必须在类路径下,不然无法创建容器。
- FileSystemXmlApplicationContext:它可以加载任意磁盘路径下的配置文件,要求必须有访问权限
- AnnotationConfigApplicationContext:它用于读取配置文件创建容器
-
ApplicationContext和BeanFactory两个接口创建容器的区别:
- ApplicationContext:它采用立即构建的方式,一旦读取完配置文件立马创建配置文件中配置的对象
- BeanFactory:它采用延迟加载的方式,什么时候程序要根据id或者类型获取对象了,再创建。该接口属于比较老的经典接口,不能支持spring的许多插件,比如AOP,Web应用等。
- FactoryBean:在IOC容器的基础上给Bean的实现增加了一个简单地工厂模式和装饰模式,能上产或者修饰Bean
-
Spring容器创建Bean的三种方式:
- 在spring的配置文件中使用Bean标签,并配置id和class属性且没有其他属性标签时,spring采用的就是这种默认的构造方法来创建Bean。一般用于自定义类的实例化。
- 使用工厂中的非静态方法创建对象,需要在配置文件中配置工厂类和创建对象的非静态方法。一般用于jar包中类的实例化。
- 使用工厂中的静态方法创建对象,需要在配置文件中配置工厂类和创建对象的静态方法。一般用于jar包中类的实例化。
-
Spring中Bean的作用范围:
- singleton:(默认)单例,IOC容仅创建一个实例,每次返回的都是同一个实例
- prototype:多例,IOC容器可以创建多个实例,每次返回的都是一个新的实例
- request:仅用于HTTP请求,每次HTTP请求都会创建一个新的Bean
- session:仅用于HTTP Session,同一个Session共享一个Bean实例,不同Session使用不同的
- global-session:仅用于HTTP Session,所有的Session共享一个Bean
-
Spring中Bean的生命周期:
-
单例对象:
-
出生:当容器创建时对象就出生
-
活着:只要容器还在,对象一直活着
-
死亡:容器销毁,对象消亡(容器需正常触发destroy方法)
-
-
多例对象:
-
出生:当我们使用对象时创建
-
活着:只要对象一直在使用过程中就一直活着
-
死亡:当对象长时间不用,且没有别的对象引用时,由Java的垃圾回收器回收
-
-