5.bean配置
bean基础配置:id来定义bean名称,class指定bean的类型
bean别名配置:可以通过name属性,添加多个别名,使用逗号,分号,空格分隔
<bean id="bookDao" name="dao bookDaoImpl" class="com.itheima.dao.impl.BookDaoImpl"/> <bean name="service,bookServiceImpl" class="com.itheima.service.impl.BookServiceImpl">
bean的作用范围:spring创建的bean默认是单例的,想要非单例的,可以将bean中的scope换成property
<bean id-"bookDao" class="com.itheima.dao.impl.BookDaoImpl" scope="property"/>
Q:为什么bean默认单例:若为非单例,则bean会无穷多,容器压力大,单例可以复用,效率高
单例可以提高效率,例如在表现层、业务层、数据层和工具对象,但是封装实体的域对象不适合
6.bean实例化
spring报错,最先看最下面的报错信息
方法一:构造方法(常用)
提供可访问的构造方法
public class BookDaoImpl implements BookDao { public void save() { System.out.println("book dao save ...") } }
配置
<bean id="bookDao" class="com.itheima.impl.BookDaoImpl"/>
无参构造方法如果不存在,将会抛出异常BeanCreationException
方法二:静态工厂(了解)
静态工厂
public class OrderDaoFactory public static OrderDao getOrderDao(){ return new OrderDaoImpl(); }
配置
<\<bean id="bookDao" factory-method="getOrderDao" class="com.itheima.factory.OrderDaoFactory"/>
方法三:实例工厂(了解)
实例工厂
public class UserDaoFactory { public UserDao getUserDao(){ return new UserDaoImpl(); } }
配置
<bean id="userDaoFactory" class="com.itheima.factory.UserDaoFactory"/> <bean id="userDao" factory-method="getUserDao" factory-bean="userDaoFactory"/>
方式四:使用FactoryBean实例化Bean(实用)
FactoryBean
public class UserDaoFactoryBean implements FactoryBean<UserDao> { public UserDao getObject() throws Exception { return new UserDaoImpl(); } public Class<?> getObjectType() { return UserDao.class; } }
配置
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/> //注意,此class造出来的对象是FacotryBean接口中的getObject()造出来的对象
7.bean生命周期
提供生命周期控制方法
public class BookDaoImpl implements BookDao { public void save() { System.out.println("book dao save ..."); } public void init() { System.out.println("book init ..."); } public void destory() { System.out.println("book destory ..."); } }
配置生命周期控制方法
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destory-method="destory"/>
接口控制(了解)
实现InitializingBean,DisposableBean接口
public class BookServiceImpl implements BookService,InitializingBean,DisposableBean { public void save() { System.out.println("book service save ..."); } public void afterPropertiesSet() throws Exception { System.out.println("afterPropertiesSet"); } public void destory() throws Exception { System.out.println("destory"); } }
经历阶段
-
初始化容器
-
创建对象(内存分配)
-
执行构造方法
-
执行属性注入(set操作)
-
执行bean初始化方法
-
-
使用bean
-
执行业务操作
-
-
关闭/销毁容器
-
执行bean销毁方法
-
bean销毁时机
-
容器关闭前触发bean的销毁
-
关闭容器方式:
-
手工关闭容器
ConfigurableApplicationContext接口close()操作
-
注册关闭钩子,在虚拟机推出前先关闭容器再退出虚拟机
ConfigurableApplicationContext接口registerShutdownHook()操作
-
public class AppForLifeCycle { public static void main( String[] args ) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); ctx.close(); } }