bean配置
bean基本配置
<bean id="" class=""/>
bean标签的id和class属性的使用
bean别名配置
bean配置别名操作步骤:
1、在配置文件中,配置别名
<?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:为bean指定别名,别名可以有多个,使用逗号,分号,空格进行分隔-->
<bean id="bookService" name="service service4 bookEbi" class="com.itheima.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
<!--scope:为bean设置作用范围,可选值为单例singloton,非单例prototype-->
<bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl"/>
</beans>
2、根据名称容器中获取bean对象
public class AppForName {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//此处根据bean标签的id属性和name属性的任意一个值来获取bean对象
BookService bookService = (BookService) ctx.getBean("service4");
bookService.save();
}
}
3、运行程序
测试结果正常,则配置成功
注意事项
- bean依赖注入的ref属性指定bean,必须在容器中是存在的
- 获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常
NoSuchBeanDefinitionException
bean作用范围配置
Spring默认创造的的bean是单例的
我们可以给他设置属性 scope
这个属性的作用是修改bean的作用范围
有两个属性
scope="prototype"
非单例模式scope="singleton"
单例模式(默认模式)
bean作用范围说明
- 为什么bean默认为单例的?
spring管理的就是复用的对象,效率更高 - 适合交给容器管理的bean?
- 表现层对象
- 业务层对象
- 数据层对象
- 工具对象
- 不适合交给容器管理的bean?
- 封装实体的域对象
Bean的实例化——构造方法
bean本质上就是对象,创建bean使用构造方法完成
实例化bean的三种方式,构造方法,静态工厂和实例工厂
构造方法实例化
1、首先在XML文件中将类配置到Spring容器中
2、编写运行程序
3、在类中提供构造函数测试(无参构造函数)
public class BookDaoImpl implements BookDao {
// 构建一个 无参构造函数
public BookDaoImpl() {
System.out.println("book dao constructor is running ....");
}
public void save() {
System.out.println("book dao save ...");
}
}
静态工厂实例化
1、创建工厂类 并提供一个静态方法
//静态工厂创建对象
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
return new OrderDaoImpl();
}
}
2、编写运行类,并在类中通过工厂获取对象
public class AppForInstanceOrder {
public static void main(String[] args) {
//通过静态工厂创建对象
OrderDao orderDao = OrderDaoFactory.getOrderDao();
orderDao.save();
}
}
3、运行,查看结果
静态工厂实例化:
在spring的配置文件application.properties中添加以下内容:
<bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>
class:工厂类的类全名
factory-mehod:具体工厂类中创建对象的方法名
然后在运行类里面,使用IoC容器中获取bean
然后运行
静态工厂实例化 一般是用来兼容早期的一些老系统 了解即可
实例工厂与FactoryBean
1、创建工厂类,并提供一个普通方法
public class UserDaoFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}
2、编写运行类,在类中通过工厂获取对象
public class AppForInstanceUser {
public static void main(String[] args) {
//创建实例工厂对象
UserDaoFactory userDaoFactory = new UserDaoFactory();
//通过实例工厂对象创建对象
UserDao userDao = userDaoFactory.getUserDao();
userDao.save();
}
3、运行启动,查看结果
实例工程实例化
操作步骤:
1、在spring的配置文件中添加内容
<bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
2、实例化工厂运行的顺序是:
1.创建实例化工厂对象,对应的是第一行配置
2.调用对象中的方法来创建bean,对应的是第二行配置
factory-bean
:工厂的实例对象
factory-method
:工厂对象中的具体创建对象的方法名
factory-mehod
:具体工厂类中创建对象的方法名
对应关系如下:
3、在运行类中使用IoC容器获取bean的方法进行测试
public class AppForInstanceUser {
public static void main(String[] args) {
ApplicationContext ctx = new
ClassPathXmlApplicationContext("applicationContext.xml");
// 获取bean方法
UserDao userDao = (UserDao) ctx.getBean("userDao");
userDao.save();
}
}
4、运行查看结果
FactoryBean
使用步骤:
1、创建按一个FactoryBean的类,实现FactoryBean接口,重写接口方法
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
//代替原始实例工厂中创建对象的方法
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
//返回所创建类的Class对象
public Class<?> getObjectType() {
return UserDao.class;
}
}
2、在spring配置文件中进行配置
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
3、运行类一样,直接运行,查看结果
bean的生命周期
bean的生命周期详解
1、什么是生命周期
从创建到消亡的完整过程,例如人从出生到死亡的整个过程就是一个生命周期
2、bean生命周期是什么
bean对象从创建到销毁的整体过程
3、bean的生命周期控制是什么
在bean创建后到销毁前做一些事情
bean生命周期设置
bean创建之后,想要添加内容,比如用来初始化需要用到资源
bean销毁之前,想要添加内容,比如用来释放用到的资源