今日事项:
bean实例化:
bean是如何创建的构造方法
工厂和实现类的方法和该类的无参构造方法执行顺序:工厂>该类无参构造方法>实现类方法
在实现接口类中可以添加该类无参的构造方法,在获取到bean时,运行时会最先运行无参构造方法
1.构造方法实例化:(常用)
1.将该类的构造方法访问权限改成private,运行程序,能执行成功,说明内部走的依然是构造函数,能访问到类中的私有构造方法,显而易见Spring底层用的是反射
2.在构造函数中添加形参,运行程序,程序会报错,说明Spring底层使用的是类的无参构造方法。
2.静态工厂实例化(了解)
1首先先写接口和实现类,创建静态工厂(DaoFactory),并创建静态无参有返回(数据类型为接口类)的方法返回实现的接口实现类(new 接口实现类),
2在spring配置文件中添加bean
<bean id="bean的唯一标识"
class="bean的类全名"
name="为bean取的别名"
factory-method=”创建工厂中的方法“
init-method="bean初始化对应的操作"
destory-method="bean销毁前对应的操作"
scope=bean的作用范围,默认为单例(singleton)和多例(prototype)/>
3.实例工厂(了解)与FactoryBean(常用)
1.实例工厂和静态工厂一样,接口类
,实现类
,工厂
,bean
不同之处在于:
1.实例工厂内的方法不是静态的
2.实例工厂还要比静态方法多加一个bean坐标:
<!--创建实例化工厂对象,对应的是第一行配置-->
<!--调用对象中的方法来创建bean,对应的是第二行配置-->
<bean id="工厂唯一标识名称" class="工厂的全限定名"/>
<bean id="getBean要获取的名字:"
factory-method="创建工厂中的方法"
factory-bean="对应上面第一行配置的id名"/>
2.FactoryBean
这里是为了去简化实例工厂添加bean操作的,把上方的第二行配置给写到代码里:
在建造FactoryBean
工厂时去继承FactoryBean
后面加尖括号里面写上接口类,
在实现后要生成三个方法
举例:
public class UserDaoFactoryBean implements FactoryBean<UserDao>
代替原始实例工厂中的创建对象的方法:
T getObject() throws Exception(){
return 接口实现类
}
返回所创建类的Class对象
Class<?> getObjectType(){
return 接口类
}
设置多例或者单例(true 单例,false 多例)
default boolean isSingleton() {
return true;
}
bean的生命周期:
实现bean初始化操作和销毁操作
1.bean配置
bean
生命周期:bean对象从创建到销毁的整体过程
bean
生命周期控制:在bean创建后到销毁前做的事情
这里只讨论bean生命周期控制
在上面介绍了在添加bean时有bean
的初始化(创造前)操作
init-method
还有destroy-method
销毁前的操作
只需要加上这两个属性即可,其他东西不需要动。
2.类配置
简化bean配置直接在接口实现类中继承
InitializingBean
,DisposableBean
,并实现方法
关闭容器:
当我们在执行后再结果中init
方法执行了,但是destroy
销毁方法没有执行:
因为Spring的IOC容器是运行在JVM中的,运行main方法后,JVM启动,Spring加载配置文件生成IOC容器,从容器获取bean对象,然后调用方法执行,main方法执行完后,JVM退出,这个时候IOC容器中的bean还没来得及销毁就结束了。
所以我们现在需要做的是需要在JVM关闭之前执行destroy
销毁方法
ClassPathXmlApplicationContext ctx = new
ClassPathXmlApplicationContext("resources资源文件中的Spring配置文件通常都设为application.xml");
//close()关闭容器:
ctx.close();
//注册钩子关闭容器:
ctx.registerShutdownHook();
两种关闭容器方法的同和不同:
同:两种都能用来关闭容器
不同:
close
方法是在调用的时候关闭
registerShutdownHook
方法是在JVM退出前调用关闭