对应文件工程heima-bean

bean标签常用属性

工程使用基于xml文件来获取对象,使用bean标签。常用属性:

  • id:是bean的唯一标识,默认使用方法名作为id,IoC容器中bean的id标签不能重复,否则报错。
  • class:为bean的全限定类名,指向classpath下类定义所在位置,原理是利用了反射机制。
  • name:是bean的名称标识,在网上看到有的文章说name可以重复
  • factory-bean:就是生成bean的工厂对象,factory-bean属性和factory-method属性一起使用,首先要创建生成bean的工厂类和方法。
  • factory-method:通过该属性,我们可以调用一个指定的工厂方法,创建bean实例。
  • init-method:是bean的初始方法,在创建好bean后调用该方法。
  • destory-method:是bean的销毁方法,在销毁bean之前调用该方法,一般在该方法中释放资源
  • scope:属性表示bean的作用范围,scope有5个值:
  • 1.(常用)singleton 单例的(默认值)
  • 2.(常用)prototype 多例的
  • 3.request 作用于web应用的请求范围
  • 4.session 作用于web应用的会话范围
  • 5.global-session 作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session
  • autowire:表示bean的自动装配,常用来在注解中使用

spring对bean的管理细节

1.创建bean的三种方式

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

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

(补充知识:如果程序员没有给类A没有提供构造函数,则编译器会自动提供一个默认的无参数的构造函数,如果用户提供了自己的构造函数,则编译器就不在提供默认的无参数构造函数。)

<bean id="accountService" class="cn.smm.service.impl.AccountServiceImpl"></bean>

public AccountServiceImpl(String name) {
System.out.println("对象被创建了");
}
//给了参数,表示重写了,运行会报错

1.2.使用普通工厂中的方法创建对象

使用某个类中的方法创建对象,并存入spring容器。需要先创建该工厂的Bean实例,然后引用该实例工厂Bean的id创建其他Bean

//模拟一个工厂类(该类存在于jar包中,无法通过修改源码来获取默认构造函数)
public class InstanceFactory {
public IAccountService getAccountService(){
return new AccountServiceImpl();
}
}

<bean id="instanceFactory" class="cn.smm.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>

  • factory-bean属性:创建生成bean的工厂类,属性值为instanceFactory。
  • factory-method属性:调用factory-bean指定的工厂方法getAccountService,创建bean实例。

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

使用某个类中的静态方法创建对象,并存入spring容器。顾名思义,咱们把创建Bean的任务交给了静态工厂,而不是构造函数。静态工厂是一个Java类,那么该class属性指定的就是该工厂的实现类,而不再是Bean的实现类,告诉Spring这个Bean应该由哪个静态工厂创建,另外我们还需要添加factory-method属性来指定由工厂的哪个方法来创建Bean实例

//模拟一个工厂类(该类存在于jar包中,无法通过修改源码来获取默认构造
public class StaticFactory {
public static IAccountService getAccountService() {
return new AccountServiceImpl();
}
}

<bean id="accountService" class="cn.smm.factory.StaticFactory" factory-method="getAccountService"></bean>

bean标签中指定了静态工厂的java类为StaticFactory,并且实现方法是getAccountService。

2.bean对象的作用范围

内容看上面的bean标签scope属性介绍

<bean id="accountService" class="cn.smm.service.impl.AccountServiceImpl" scope="prototype"></bean>

//查看是否单例还是多例。
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountService as1 = (IAccountService) ac.getBean("accountService");
IAccountService as2 = (IAccountService) ac.getBean("accountService");
System.out.println(as1.equals(as2));

3. bean对象的生命周期

单例对象:

  • 出生:当容器创建时对象出生
  • 活着:只要容器还在,对象一直活着
  • 死亡:容器销毁,对象消亡
  • 总结:单例对象的生命周期和容器一样

多例对象:

  • 出生:当我们使用对象时spring框架为我们创建
  • 活着: 对象只要是在使用过程中就一直活着
  • 死亡:当对象长时间不用,且没有别的对象引用时,由java的垃圾回收器清理
<bean id="accountService" class="cn.smm.service.impl.AccountServiceImpl"scope="singleton" init-method="init" destroy-method="destroy"></bean>-->

public void init() {
System.out.println("对象初始化了");
}
public void destroy() {
System.out.println("对象被销毁了");
}