目录
bean基本配置
bean基础配置
类别 描述 名称 bean 类型 标签 所属 beans标签 功能 定义Spring核心容器管理的对象<beans> 格式
<beans>
<bean/>
<bean>< / bean></beans>
属性列表 id : bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id值唯一
class : bean的类型,即配置的bean的全路径类名
范例 <bean id="Dao" class="dao.impl.DaoImpl"/>
<bean id="Service" class="service.impl.ServiceImpl"></bean>
bean别名配置
类别 描述 名称 name 类型 属性 所属 bean标签 功能 定义bean的别名,可定义多个,使用逗号(,)分号( ;)空格()分隔 范例 <bean id="Dao" name="dao DaoImpl" class="dao.impl.DaoImpl" />
<bean id="Service" name="service,ServiceImpl" class="service.impl.ServiceImpl" />
注意事项:
获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常NoSuchBeanDefinitionExceptionNoSuchBeanDefinitionException: No bean named 'XXX' available
bean作用范围配置
类别 描述 名称 scope 类型 属性 所属 bean标签
功能
定义bean的作用范围,可选范围如下:
singleton:单例(默认)
prototype : 非单例范例 <bean id="Dao" class=" dao.impl.DaoImpl" scope=" prototype" /> bean作用范围说明:
(1)为什么bean默认为单例?
①为了提高性能
②少创建实例
③减少垃圾回收
④缓存快速获取
(2)适合交给容器进行管理的bean表
①现层对象
②业务层对象
③数据层对象
④工具对象
(3)不适合交给容器进行管理的bean
①封装实体的域对象
bean实例化
bean本质上就是对象,创建bean使用构造方法完成。
实例化bean的三种方式:①构造方法②静态工厂③实例工厂
第一种:构造方法(常用)
①提供可访问的构造方法
public class DaoImpl1 implements Dao1 { public DaoImpl1(){ System.out.println("Dao初始化.."); } public void show() { System.out.println("Dao..."); } }
②配置
<bean id="Dao1" class="Dao.impl.DaoImpl1"/>
注意:
①共有私有都可以访问到
②无参构造方法如果不存在,将抛出异常BeanCreationException
第二种:静态工厂
①静态工厂
public class DaoFactory { public static Dao1 getDao1(){ System.out.println("Factory setup..."); return new DaoImpl1(); } }
②配置
<!--使用静态工厂实例化bean--> <bean id="Dao1" class="Factory.DaoFactory" factory-method="getDao1"/>
第三种:实例工厂
①实例工厂
public class DaoFactory2 { public Dao1 getDao1(){ return new DaoImpl1(); } }
②配置
<!--使用实例工厂实例化bean--> <bean id="DaoFactory2" class="Factory.DaoFactory2"/> <bean id="Dao1" factory-bean="DaoFactory2" factory-method="getDao1"/>
第三种改良(掌握)
①FactoryBean
public class DaoFactoryBean implements FactoryBean<Dao1> { //代替原始实例工厂中创建对象的方法 public Dao1 getObject() throws Exception { return new DaoImpl1(); } public Class<?> getObjectType() { return Dao1.class; } //构建bean是否为单例,true就为单例 @Override public boolean isSingleton() { return true; } }
②配置
<!--使用实例工厂实例化bean改良--> <bean id="Dao1" class="Factory.DaoFactoryBean"/>
bean生命周期
生命周期:从创建到消亡的完整过程
bean生命周期: bean从创建到销毁的整体过程bean生命周期分段:
①初始化容器
1.创建对象(内存分配)2.执行构造方法
3.执行属性注入( set操作)4.执行bean初始化方法
②使用bean
1.执行业务操作③关闭/销毁容器
1.执行bean销毁方法
bean生命周期控制︰在bean创建后到销毁前做一些事情
生命周期控制方法
第一种:
①提供生命周期控制方法
public class DaoImpl1 implements Dao1 { public DaoImpl1(){ System.out.println("Dao初始化.."); } public void show() { System.out.println("Dao..."); } //表示bean初始化进行的操作 public void init(){ System.out.println("init.."); } public void save(){ } //表示bean被销毁前对应的操作 public void destory(){ System.out.println("destory..."); } }
②配置生命周期控制方法
<bean id="Dao1" class="Dao.impl.DaoImpl1" init-method="init" destroy-method="destory"/>
第二种(接口控制,不需再配置):
①实现InitializingBean, DisposableBean接口
public class ServiceImpl1 implements Service1, InitializingBean, DisposableBean { //删除业务层中使用new方式创建的dao对象 private Dao1 dao1; @Override public void show() { System.out.println("Service..."); dao1.show(); } //提供对应的set方法 public void setDao1(Dao1 dao1) { System.out.println("set..."); this.dao1 = dao1; } @Override public void destroy() throws Exception { System.out.println("service destroy..."); } //属性配置之后运行 @Override public void afterPropertiesSet() throws Exception { System.out.println("service init..."); } }
bean销毁时机
容器关闭前触发bean的销毁
关闭容器方式:
①手工关闭容器
ConfigurableApplicationcontext接口close()操作public class App{ public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Dao1 dao1 = (Dao1) context.getBean("Dao1"); dao1.show(); context.close(); //close()放在最后 } }
②注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机
ConfigurableApplicationContext接口registerShutdownHook()操作public class App4 { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); context.registerShutdownHook(); //registerShutdownHook()方法放前放后都不影响使用 Dao1 dao1 = (Dao1) context.getBean("Dao1"); dao1.show(); //context.registerShutdownHook(); } }