类别 | 描述 |
---|---|
名称 | bean |
功能 | 定义Spring核心容器管理的对象 |
列表属性 | id:容器通过id值获取对应的bean(在一个容器中id值唯一) class:bean的类型,配置bean的全路径类名 |
<beans>
<bean id="bookDao" class="com.my.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.my.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
bean>
beans>
类别 | 描述 |
---|---|
名称 | name |
功能 | 定义bean的别名,可以定义多个,使用逗号、分号或者空格分隔 |
<bean id="bookDao" name="bookDao bookDao1" class="com.my.dao.impl.BookDaoImpl"/>
类别 | 描述 |
---|---|
名称 | scope |
功能 | 定义bean的作用范围( singleton:单例(默认),prototype:非单例 ) |
<bean id="userDao" class="com.my.factory.UserDaoFactoryBean" scope="prototype"/>
在实现类中添加无参构造方法(将类配置到Spring容器(xml配置文件))
public class BookDaoImpl implements BookDao {
public BookDaoImpl(){
System.out.println("book constructor is running");
}
@Override
public void save() {
System.out.println("book dao save......");
}
}
配置文件
<bean id="bookDao" class="com.my.dao.impl.BookDaoImpl"/>
测试运行结果
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationConfig.xml");
BookDao bookDao = (BookDao) context.getBean("bookDao");
bookDao.save();
//运行结果为:book constructor is running
//book dao save......
}
准备实现类
public class OrderDaoImpl implements OrderDao {
@Override
public void save() {
System.out.println("order dao save ......");
}
}
创建工厂类,添加一个静态方法
public class OrderDaoFactory {
public static OrderDao getOrderDaoImpl(){
System.out.println("order dao factory start......");
return new OrderDaoImpl();
}
}
配置文件
<bean id="orderDao" class="com.my.factory.OrderDaoFactory" factory-method="getOrderDaoImpl"/>
测试运行结果
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationConfig.xml");
OrderDao orderDao = (OrderDao) context.getBean("orderDao");
orderDao.save();
//输出结果为:book constructor is running
//order dao factory start......
//order dao save ......
}
实现类
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("user dao save ......");
}
}
创建工厂类,添加方法(非静态方法)
public class UserDaoFactory {
public UserDao getUserDaoImpl(){
return new UserDaoImpl();
}
}
配置文件
<bean id="userDaoFactory" class="com.my.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDaoImpl" factory-bean="userDaoFactory"/>
测试运行结果
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationConfig.xml");
UserDao userDao = (UserDao) context.getBean("userDao");
userDao.save();
//输出结果为:user dao save ......
}
实现类(同2.3)
创建一个类实现 FactoryBean 接口
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
//创建对象
@Override
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
//对象类型
@Override
public Class<?> getObjectType() {
return UserDao.class;
}
}
配置文件
<bean id="userDao" class="com.my.factory.UserDaoFactoryBean"/>
测试运行结果(同2.3)
初始化容器
使用bean
关闭、销毁容器
例如:
准备接口和实现类,添加 init 和 destroy 两个方法
public class BookDaoImpl implements BookDao {
@Override
public void save() {
System.out.println("book dao save......");
}
public void init(){
System.out.println("init ......");
}
public void destroy(){
System.out.println("destroy ......");
}
}
配置文件
<bean id="bookDao" class="com.my.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
测试运行结果
Spring 的 IoC 容器是运行在 JVM 中的,main 方法执行完后,JVM
退出,但 IoC 容器中的 bean 并没有来得及销毁
所以要在 JVM 退出前关闭容器
public static void main(String[] args) {
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationConfig.xml");
//虚拟机关闭前,将容器关闭
context.registerShutdownHook();
BookDao bookDao = (BookDao) context.getBean("bookDao");
bookDao.save();
//context.close();
//输出结果:init ......
//book dao save......
//destroy ......
}
ApplicationContext 没有 close 方法, ConfigurableApplicationContext 接口有 close 方法,所以使用实现类 ClassPathXmlApplicationContext
实现类可以改为
public class BookDaoImpl implements BookDao, InitializingBean, DisposableBean {
@Override
public void save() {
System.out.println("book dao save......");
}
@Override
public void destroy() throws Exception {
System.out.println("destroy ......");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("init ......");
}
}
配置文件
<bean id="bookDao" class="com.my.dao.impl.BookDaoImpl"/>
测试运行结果(同3.1)