对应文件工程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("对象被销毁了");
}