Spring IoC操作

1.Spring,认为一起Java类都是资源,而资源都是Bean,容纳Bean的是Spring所提供的Ioc容器,所以Spring是一种基于Bean的编程。

2.控制反转的概念比较抽象,在生活中,人们要使用一样东西,最基本的想法就是找到这个东高西,必然要喝橙汁,在没有饮品店的日子里,最直观的做法就是,要买果汁机,橙子,开水,是自己主动创造的过程,也就是一杯橙汁需要自己创造。但是由于今天饮品店盛行,已经没有必要自己去榨橙汁。想喝的第一步,就是找到饮品店老板的联系方式,描述你的需求,地址,联系方式。下订单等待,等一会就有橙汁了。你没有主动产生果汁,但是你也得到了果汁。

因为也许你对某一领域并不精通,这个时候可以把创建对象的主动权交给别人,这就是控制反转的概念。

这是主动创造的过程

publc class Blender{

      @param water
      @param fruit
      @param sugar 
 public String mix(String water,String fruit,String sugar){

String juice="这是一杯由液体:"+water+fruir+sugar+"组成的果汁";
return juice;      

}

public class JuiceMaker{
private Blender blender;
private String water;
private String fruit;
private String sugar;
seter和getter方法


public String makeJuice(){
blender=new Blender();
return blender.mix(water,fruit,sugar);
}

下面描述的是被动创建对象

public class JuiceMaker{

private String beverageShop=null;
private Source source=null;
/*****SETTER/GETTER省略*******/

}

public  class Source{
private String fruit;
private String sugar;
private Integer size;
/*****SETTER/GETTER省略*******/
}
//显然我们不用知道果汁是如何产生的
系统采用xml对这个清单进行描述
<bean id="souce" class="com.ssm.caizhen.pojo.Source”>
<property name="fruit" value="橙汁"/>
<property name="sugar" value="少糖"/>
<property name="size" value="大杯"/>
</bean>
接着选择饮品店
<bean id="juiceMaker2" class="com.caizhen.pojo.JuiceMaker">
<property name="beverageShop" value="豆豆奶茶店"/>
<property name="source" ref="source"/>
</bean>

JuiceMaker juice=(JuiceMaker)ctx.getBean("juiceMaker2");
String juice1=juice.makeJuice();

从上面我们知道;控制反转是一种通过描述并通过第三方去产生或获取特定对象的方式。

Spring中控制反转的是Ioc容器,其方法是依赖注入。正如上面,果汁依赖果汁饮品店和订单去制造果汁。而饮品店是别人去创造的,我们只需知道他能产生果汁就行。

Spring会提供IoC容器来管理对应的资源,正如上面的例子中的饮品店和订单资源,由他们形成依赖注入的关系,其中果汁制造器用到饮品店用到饮品店和订单两个资源。

Spring Ioc容器

SPring IOC容器的主要设计是基于BeanFactory和ApplicationContext这两个接口,其中Application是BeanFactory的子接口之一。而ApplicationContext是其高级接口之一,并且对BeanFactory功能做了许多有用的扩展,所以绝大部分场景都会使用ApplicationContext作为Spring Ioc容器。

BeanFactory中有很重要的方法

1.getBean的多个方法用于获取配置给Spring IOC容器的Bean.从参数类型看可以是字符串,可以是Class类型,由于Class类型可以扩展接口也可以继承父类,所以在一定的程度上会存在使用父类类型无法准确获得实例的异常。比如获取学生类,但是学生的子类又男学生和女学生,这个时候就无法从容器中获取实例了,因为容器无法判断具体的实现类。

2.isSingleton用于判断是否是单例,如果判断为真,则意思是该Bean在容器中是作为一个唯一单例存在的。在默认情况下,Spring会为Bean创建一个单例,也就是默认情况下isSingleton返回true

3.isPrototype则与2相反,如果判断为真,意思就是如果你从容器中获取Bean,容器就为你生成一个新的实例。 默认为false.

4.ApplicationContext接口扩展了许多的接口,因此功能很强大,而WebApplicationContext也扩展了他,在实际应用中常常使用ApplicationContext接口,因为BeanFactory的方法和功能较少,而ApplicationContext的方法和功能也较多。而具体的ApplicationContext的实现类会使用在某个领域,比如Sping MVC中的Generic WebApplicationContext,就广泛使用于Java Web工程中 。

ClassPathXmlApplicationContext----ApplicationContext的子类

在上面的果汁的例子中,定义了两个Bean,

<bean id="souce" class="com.ssm.caizhen.pojo.Source”>
<property name="fruit" value="橙汁"/>
<property name="sugar" value="少糖"/>
<property name="size" value="大杯"/>
</bean>
<bean id="juiceMaker2" class="com.caizhen.pojo.JuiceMaker">
<property name="beverageShop" value="豆豆奶茶店"/>
<property name="source" ref="source"/>
</bean>

这样就会使用Application的实现类ClassPathXmlApplicationContext去初始化Spring IOC容器。

JuiceMaker2 juiceMaker2=(JuiceMaker2)ctx.getBean("juiceMaker");

Spring Ioc容器的初始化和依赖注入

Bean的定义和初始化在Spring容器中是两大步骤,他是先定义,然后初始化和依赖注入的。

Bean的定义分三步

1.Resouce定位

这步根据开发者的配置,进行资源定位,在Spring的开发中,通过Xml或者注解都是十分常见的方式,定位的内容是由开发者所提供的。

2.BeanDefination的载入。

这个过程就是根据Resouce定位到的信息,保存到Bean定义(BeanDefination)中,此时并不会产生Bean的实例。

3.BeanDefination的注册。

这个过程就是将BeanDefination的信息发布到Spring Ioc容器中,注意,注意,此时仍旧没有对应的Bean的实例

做了这三步,Bean就在IOC容器中被定义了,而没被初始化,更没有完成依赖注入,也就是没有注入其配置的资源给Bean,那么他还不能完全使用。对于初始化和依赖注入,Spring Bean还有一个配置选项lazy-int ,其含义是是否初始化Spring Bean.在没有任何配置的情况下,他的默认值为default,实际值是false,也就是Spring IOC默认的会自动初始化Bean.如果将其设置为true,那么只有我们使用Spring IOC容器的getBean方法获取时,他才会进行Bean的初始化,完成依赖注入。

Spring Bean的生命周期、

Spring IOC容器的本质目的就是为了管理Bean。对于Bean而言,在容器中存在其生命周期,他的初始化和销毁也需要一个过程,在一些自定义初始化的过程中,我们可以插入代码去改变它。

1.Spring容器执行初始化和依赖注入后,会执行一定的步骤执行来完成初始化,

1.setBeanName()

2.setBeanFactory()

3.setApplicationContext()

4.postProcessBeforeInitiatialzation()

5.afterPropertiesSet

6.自定义初始化

7.postProcessAfterInitiazation方法

8.生存期

9.destroy方法

猜你喜欢

转载自blog.csdn.net/cainame/article/details/81289515