我们这一节学习的bean.xml配置参数,主要用于bean对象的创建,控制bean对象的作用范围以及生命周期。

创建Bean的三种方式

1.使用默认构造函数创建

我们在之前的使用的bean创建方式为下面:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id = "accountService" class="com.lujuan.service.impl.AccountService"> </bean>
</beans>

这就是bean创建但第一种方式,使用默认构造函数进行创建。方法是在spring但配置文件中使用bean标签,配以id和class属性,切没有其他但属性和标签。(id属性来定义我们使用时所需要使用的名称,class为本项目中的类文件)。使用这中创建方式创建时,如果类没有默认构造函数,那么bean对象将无法创建。

2.使用工厂中的普通方法创建

这种方法其实是使用类中的普通方法创建对象,并放入spring容器中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id = "accountService" class="com.lujuan.service.impl.AccountService"> </bean>
    <bean id = "ordinaryFactory" class="com.lujuan.factory.OrdinaryFactory"> </bean>
    <bean id = "accountService2" factory-bean="ordinaryFactory" factory-method="init"> </bean>
    <bean id = "accountService3" class="com.lujuan.factory.StaticFactory" factory-method="init"> </bean>

</beans>

3.使用工厂中的静态方法进行创建

这种方法其实是使用类中的static方法创建对象,并放入Spring容器中

<bean id = "accountService3" class="com.lujuan.factory.StaticFactory" factory-method="init"> </bean>

在方法2和方法3中,主要是factory-bean,factory-method这两个bean属性起到了作用,多用于使用外部的jar包进行bean对象创建的场景下。

Bean 对象的作用范围

在这里主要是bean标签下的scope起到了作用。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id = "accountService" class="com.lujuan.service.impl.AccountService" scope="prototype"> </bean>

</beans>

scope的取值有5种类:

  1. singleton 单例的(也是默认值),每次获取bean对象时,是同一个对象
  2. prototype 多例的,每次获取bean对象时,获取的是不同的对象
  3. request 作用于web应用的请求范围
  4. session 作用于web请求的一次会话
  5. global-session 作用于集群环境下的会话范围,非集群环境时会变为session

Bean 对象的生命周期

在这一部分我们要学习bean标签中的两个行的属性:init-method和destroy-method,主要用来指定bean对象创建和销毁时,调用的类中的方法的名称,可以让我们当需要的时候执行特定的创建方法和销毁方法。

<bean id = "accountService" class="com.lujuan.service.impl.AccountService" scope="singleton"
init-method="saveAccount" destroy-method="saveAccount"> </bean>
对于单例和多例的bean对象具有不同的生命周期,我们主要关注的是对象的出生、存活和死亡。
  • 单例bean:在容器创建的时候出生,容器存在她就存在,容器销毁的时候,他就被销毁。
  • 多例bean:在对象被使用的时候由spring帮我们创建,对象一直使用就一直存在,随后由jvm垃圾回收的时候被销毁。(但不再使用且不被其他对象引用时)

总结

截止目前我们学习了bean标签中 factory-bean,factory-method;scope;init-method,destroy-method这些属性使用,分别用于bean对象的创建,bean作用范围控制,以及bean对象生命周期管理。