配置说明
类别 | 描述 |
---|---|
名称 | bean |
类型 | 标签 |
所属 | beans标签 |
功能 | 定义Spring核心容器管理的对象 |
格式 | |
属性 列表 | id:bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id是唯一的 class:bean的类型,即配置的bean的全路径类名 |
范例 |
1、Bean别名配置
配置说明
类别 | 描述 |
---|---|
名称 | name |
类型 | 属性 |
所属 | bean标签 |
功能 | 定义bean的别名,可定义多个,使用逗号,分号,空格分隔 |
范例 |
代码演示
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--name属性:可以设置多个别名,别名之间使用逗号,空格,分号等分隔注意:id只能设置一个,并且id的值要唯一。name可以设置多个给BookDao取别名--><bean class="com.demo.dao.impl.BookDaoImpl" id="bookDao" name="bookDao2,bookDao3"></bean></beans>
@Test
public void test01(){//创建IOC容器,加载xml文件创建文件中的对象到IOC容器中ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application-bean-base.xml");//使用IOC容器获取name = bookDao2对象BookDao bean = (BookDao) ctx.getBean("bookDao2");//对象调用方法bean.save();//关闭容器ctx.close();
}
**注意事项:**获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常NoSuchBeanDefinitionException
2、Bean作用范围配置
配置说明
类别 | 描述 |
---|---|
名称 | scope |
类型 | 属性 |
所属 | bean标签 |
功能 | 定义bean的作用范围,可选范围如下: singleton 单例(默认)在IOC容器创建时创建,只创建一次 prototype 非单例 每次从IOC容器获取的时候都会创建新的对象,获取多次创建多次。 |
范例 |
scope的取值不仅仅只有singleton和prototype,还有request、session、application、 websocket ,表示创建出的对象放置在web容器(tomcat)对应的位置。
- request:仅适用于Web环境下的ApplicationContext,每一个Http请求都会拥有一个单独的实例。
- session:仅适用于Web环境下的ApplicationContext,即每一个用户都将拥有一个单独的实例。
- globalSession:仅适用于Web环境下的ApplicationContext,表示每一个全局的Http Session下都会拥有一个单独的实例。
为什么bean默认为单例?
适合交给容器进行管理的bean
- 控制器对象 (以前用的Servlet做为控制器)
- 业务层对象 (如:BookService)
- 数据层对象 (如:BookDao或BookMapper)
- 工具对象 (如:CartUtils对象)
以上对象都只需要创建一个就够了
不适合交给容器进行管理的bean
- 封装实体的域对象(实体类对象 Book 包名:pojo,entity, domain)
- 实体类对象一般是mybatis查询数据库得到结果,需要根据每一次结果创建对象
3、bean的生命周期
生命周期相关概念介绍
- 生命周期:从创建到消亡的完整过程
- bean生命周期:bean从创建到销毁的整体过程
- bean生命周期控制:在bean创建后到销毁前做一些事情
代码演示
- 提供生命周期控制方法
public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save ...");}//表示bean初始化对应的操作public void init(){System.out.println("init...");}//表示bean销毁前对应的操作public void destory(){System.out.println("destory...");}
}
- applicationContext.xml配置
<bean id="bookDao" class="com.demo.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
- 测试类
public class AppForLifeCycle {public static void main( String[] args ) {//此处需要使用实现类类型,接口类型没有close方法ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();//关闭容器,执行销毁的方法ctx.close();}
}
- 容器关闭前触发bean的销毁
- 关闭容器方式:
- 手工关闭容器
调用容器的close()
操作 - 注册关闭钩子(类似于注册一个事件),在虚拟机退出前先关闭容器再退出虚拟机
调用容器的registerShutdownHook()
操作
- 手工关闭容器
public class AppForLifeCycle {public static void main( String[] args ) {//此处需要使用实现类类型,接口类型没有close方法ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();//注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器ctx.registerShutdownHook();//关闭容器//ctx.close();}
}
4、Bean对象的创造方式
构造方法方式
- BookDaoImpl实现类
public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("book dao constructor is running ....");}public void save() {System.out.println("book dao save ...");}
}
- applicationContext.xml配置
<!--方式一:构造方法实例化bean-->
<bean id="bookDao" class="com.demo.dao.impl.BookDaoImpl"/>
- AppForInstanceBook测试类
public class AppForInstanceBook {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();}
}
**注意:**无参构造方法如果不存在,将抛出异常BeanCreationException
静态工厂方式
- OrderDao接口和OrderDaoImpl实现类
public interface OrderDao {public void save();
}
public class OrderDaoImpl implements OrderDao {public void save() {System.out.println("order dao save ...");}
}
- OrderDaoFatory工厂类
//静态工厂创建对象
public class OrderDaoFactory {public static OrderDao getOrderDao(){System.out.println("factory setup....");return new OrderDaoImpl();}
}
- applicationContext.xml配置
<!--方式二:使用静态工厂实例化bean-->
<bean id="orderDao" class="com.demo.factory.OrderDaoFactory" factory-method="getOrderDao"/>
- AppForInstanceOrder测试类
public class AppForInstanceOrder {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");orderDao.save();}
}
实例工厂方式
- UserDao接口和UserDaoImpl实现类
public interface UserDao {public void save();
}
public class UserDaoImpl implements UserDao {public void save() {System.out.println("user dao save ...");}
}
- UserDaoFactory工厂类
//实例工厂创建对象
public class UserDaoFactory {public UserDao getUserDao(){return new UserDaoImpl();}
}
- applicationContext.xml配置
<!--方式三:使用实例工厂实例化bean-->
<bean id="userFactory" class="com.demo.factory.UserDaoFactory"/><bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
- AppForInstanceUser测试类
public class AppForInstanceUser {public static void main(String[] args) {// //创建实例工厂对象// UserDaoFactory userDaoFactory = new UserDaoFactory();// //通过实例工厂对象创建对象// UserDao userDao = userDaoFactory.getUserDao();// userDao.save();ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");UserDao userDao = (UserDao) ctx.getBean("userDao");userDao.save();}
}