目录
1、Bean的基础配置
对于Bean的配置中,主要是Bean基础配置,Bean的别名配置,Bean的作用范围配置。
1.1、Bean的基础配置(id和class)
注意:class属性不能写接口,因为接口是没办法创建对象的
1.2 、Bean的name属性
注意:Bean依赖注入的ref属性指定Bean,必须在容器中存在
1.3、Bean的作用范围scope属性
1、为什么bean默认为单例?
- bean为单例的意思是在Spring的IOC容器中只会有该类的一个对象
- bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高
- 如果对象是有状态对象(即该对象有成员变量可以用来存储数据的),因为所有请求线程共用一个bean对象,所以会存在线程安全问题。
- 如果对象是无状态对象(即该对象没有成员变量没有进行数据存储的),因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。
1.4、Bean基本配置小结
2、Bean实例化
实例化Bean的三种方法:构造方法、静态工厂和实例工厂。
Bean的本质上就是对象,对象在new的时候会使用构造方法完成,那么在创建Bean时也是使用构造方法完成的。
2.1、构造方法实例化
为类提供一个无参构方法
public class BookDaoImpl implements BookDao {
public BookDaoImpl() {
System.out.println("BookDaoImpl is running.......");
}
}
- 当将public改为private时,依旧运行成功,说明内部走的依旧是构造方法,能访问到类中的私有构造方法,显而易见Spring底层用的是反射。
- Spring底层使用的时类 的误餐构造方法
2.2、静态工厂
步骤1:创建一个工厂类bookDaoFactory并提供一个静态方法
public class BookDaoFactory {
public static BookDao getBookDai(){
return new BookDaoImpl();
}
}
步骤2:在Spring配置文件中applicationContext.xml中添加以下内容:
<bean id="bookDao" class="com.AT.utility.BookDaoFactory" factory-method="getBookDao"></bean>
class:工厂类的类全名
factory-mothod:具体工厂类中创建对象的方法名
静态工厂的意义:在工厂的静态方法中,我们除了new对象还可以做其他的一些业务操作,这些操作必不可少。
2.3、实力工厂与FactoryBean
步骤1:创建一个工厂类bookDaoFactory并提供一个普通方法
public class BookDaoFactory {
public BookDao getBookDao(){
return new BookDaoImpl();
}
}
步骤2:在Spring配置文件中配置以下内容。
//factory-bean:工厂的实例对象
//factory-method:工厂对象中的具体创建对象的方法名
<bean id="BookDaoFactory" class="com.AT.utility.BookDaoFactory"></bean>
<bean id="bookDao" factory-method="getBookDao" factory-bean="BookDaoFactory"></bean>
实例化工厂的运行顺序:
- 创建实例化工厂对象,对应第一行的配置
- 调用对象中的方法来创建Bean,对应的是第二行配置
2.4、FactoryBean的使用
步骤1:创建一个工厂类bookDaoFactoryBean的类,实现FactoryBean接口,重写接口的方法。
public class BookDaoFactoryBean implements FactoryBean<BookDao> {
public BookDao getObject() throws Exception {
return new BookDaoImpl();
}
public Class<?> getObjectType() {
return BookDao.class;
}
}
步骤2:在Spring配置文件中进行配置
<bean id="bookDao" class="com.AT.utility.BookDaoFactoryBean"></bean>
factoryBean接口的三个方法:
- 方法一:getObject(),被重写后,在方法中进行对象的创建并返回
- 方法二:getObjectType(),被重写后,主要返回的是被创建类的Class对象
- 方法三:没有被重写,因为它已经给了默认值,从方法名中可以看出其作用是设置对象是否为单例,默认true。
2.5、bean实例化小结
(1)bean实际上都是构造方法(无参)创建的。
(2)重点掌握构造方法和factoryBean即可。
3、bean的生命周期
(1)什么是生命周期
- 由创建到消亡的整个过程
(2)bean生命周期控制是什么
- 在bean创建后到销毁前做一些事情
3.1、生命周期设置
具体的控制有两个阶段:
- bean创建之后,想要添加内容,比如用来初始化需要用到资源
- bean销毁之前,想要添加内容,比如用来释放用到的资源
实现方法也有两种。一种是通过编码加配置进行实现,另一种通过接口实现
方法一:编码加配置
步骤1:添加初始化和销毁方法
在bookDaoImpl类中分别添加两个方法,方法名任意
public class BookDaoImpl implements BookDao {
public BookDaoImpl() {
System.out.println("BookDaoImpl is running.......");
}
public void init(){
System.out.println("init.......");
}
public void destory(){
System.out.println("destory.......");
}
}
步骤2:配置生命周期
在配置文件中,如下:
<bean id="bookDao" class="com.AT.dao.Impl.BookDaoImpl" init-method="init" destroy-method="destory"></bean>
方法二:接口方法
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void destroy() throws Exception {
System.out.println("service destory");
}
public void afterPropertiesSet() throws Exception {
System.out.println("service init");
}
}
小细节:
- 对于InitializingBean接口中的afterPropertiesSet方法,翻译过来为属性设置之后。
- 对于BookServiceImpl来说,bookDao是它的一个属性
- setBookDao方法是Spring的IOC容器为其注入属性的方法
3.2、bean生命周期小结
- 在配置文件中的bean标签中添加init-method和destroy-method属性
- 类实现InitializingBean与DisposableBean接口,这种方式了解下即可。
- 初始化容器
- 创建对象(内存分配)
- 执行构造方法
- 执行属性注入(set操作)
- 执行bean初始化方法
- 使用bean
- 执行业务操作
- 关闭/销毁容器
- 执行bean销毁方法