Spirng学习四-SpringBean的作用域

Bean注入的三种方式

1:使用默认的构造函数

在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时采用的就是默认的构造函数常见bean对象,此时如果没有默认构造函数则对象无法创建。

<bean name="car" class="impl.Car"/> 

2.使用普通工厂的方法创建对象(使用某个类中的方法创建对象,交给spring管理)

比如jar包中的class中某个方法创建了一个对象现在希望通过它来获得对象交给spring管理

public class BeanFactory2 {
    public Car getCar(){
        return new Car();
    }
}

首先将该类交给Spring管理,之后通过beanName指定该类通过factory-method指定通过该类中getCar方法获得对象。

 <bean name="factory" class="com.factory.BeanFactory2"></bean>
<bean name="factoryCar" factory-bean="factory" factory-method="getCar"></bean>

3.使用工厂中的静态方法创建对象

基于上面的工厂方法获得对象,在工厂类的方法是static修饰的静态方法的时候可以直接通过如下配置加载。

<bean name="factoryCar" class="com.factory.BeanFactory2" factory-method="getCar"></bean>

Bean的作用域

在Spring容器中一共提供了五种作用域类型,在配置文件中通过属性scope来设置bean的作用域范围。

1.默认 singleton:单例

<bean name="car" class="impl.Car" scope="singleton"/> 

在对scope没有设置的时候bean默认就是单例的,多次获取同一个id都是一个bean的实例。

     //此时容器初始化完毕后可以取里面的bean了.
        Car car1  = (Car)bf.getBean("car");
        Car car2 = (Car)bf.getBean("car");
        System.out.println(car1 == car2);

执行结果:

小汽车被加载了
true

2. prototype:多例

xml <bean name="car" class="impl.Car" scope="prototype"/>
每次通过id获取bean的时候IOC都会创建一个新的作用域。
同样执行执行上面的代码
执行结果:

小汽车被加载了
小汽车被加载了
false

###以下三种针对web项目
在使用Spring的WebApplicationContext时,可以使用的作用域。
###3.request:HTTP请求

<bean name="car" class="impl.Car" scope="request"/>

request针对每次Http请求,Spring都会针对相关的bean来创建一个新的实例。而bean只在当前request请求中有效

4.session

<bean name="car" class="impl.Car" scope="session "/>

针对http session起作用,Spring容器会根据该Bean的定义来创建一个全新的Bean的实例。而且该Bean只在当前http session内是有效的。
Session中所有http请求共享同一个请求的bean实例。Session结束后就销毁bean。

5.global session:

<bean name="car" class="impl.Car" scope="globalSession"/>

类似标准的http session作用域,不过仅仅在基于portlet的web应用当中才有意义。Portlet规范定义了全局的Session的概念。他被所有构成某个portlet外部应用中的各种不同的portlet所共享。在global session作用域中所定义的bean被限定于全局的portlet session的生命周期范围之内。

Bean的生命周期

bean对象的生命周期分为创建、生存、死亡
单例:

<bean  name="car" class="com.pojo.Car" init-method="init" destroy-method="destroy"></bean>

为bean配置加入init-method 属性和destroy-method属性,分别在对象加载和容器销毁时执行该类中的init方法和destroy方法。

 ClassPathXmlApplicationContext ap = new ClassPathXmlApplicationContext("applicationContext.xml");
ap.getBean("car");

//手动关闭容器
ap.close();

执行结果:

加载小汽车
执行对象初始化方法
六月 08, 2019 10:41:25 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
执行对象销毁方法

多例:

<bean  name="car" class="com.pojo.Car" init-method="init" destroy-method="destroy" scope="prototype"></bean>

执行结果:

加载小汽车
执行对象初始化方法

可见调用close并没有调用destroy方法,这就是与单例模式的区别,多例模式bean的生命周期交给了JVM管理。
总结:
单例对象
出生:容器创建时对象加载
存活:容器还在对象就一直存在
死亡:对象的声明周期和容器相同
多例对象
出生:当使用对象时由bean工厂创建
存活:对象在使用过程中就一直存活
死亡:交给JVM管理对象生命周期

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值