Bean
Bean的配置
bean标签表示构造一个Bean
- id
- name 表示取别名(不建议)
- class 该Bean的类型
- scope 表述Bean的作用域
- singleton(默认) 全局单例
- 表现层对象
- 业务层对象
- 数据层对象
- 工具对象
- prototype 非单例
- 封装实体的域对象(domain/pojo/entity)
- singleton(默认) 全局单例
- property 标签表示配置属性
- name 表示属性名称(与类中对应)
- ref 表示参照哪一个bean
Bean的实例化方法
使用无参构造方法
Bean的实例化使用对应类的构造函数。
public class BookDaoImpl implements BookDao{
public BookDaoImpl() {
System.out.println("BookDaoImpl 创建");
}
@Override
public void save() {
System.out.println("Book Dao Save");
}
}
<bean id="bookDao" class="com.example.dao.BookDaoImpl"/>
结果输出了BookDaoImpl 创建
使用静态工厂
这里采用工厂方法设计模式。工厂定义如下
public class OrderDaoFactory {
public static OrderDao getOrderDao() {
return new OrderDaoImpl();
}
}
在Bean中配置如下,其中注意class是对应的工厂类,factory-method指明使用哪一个静态构造方法。
<bean id="orderDao" class="com.example.factory.OrderDaoFactory" factory-method="getOrderDao"/>
使用如下,注意直接返回静态工厂的结果
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
OrderDao orderDao = context.getBean("orderDao", OrderDao.class);
System.out.println(orderDao);
使用实例化工厂
与上文不同,此处的工厂并不是静态工厂
public class OrderDaoFactory {
public OrderDao getOrderDao() {
return new OrderDaoImpl();
}
}
要想使用,则必须先构建出工厂实例
<bean id="orderFactory" class="com.example.factory.OrderDaoFactory"/>
<bean id="orderDao" factory-bean="orderFactory" factory-method="getOrderDao"/>
实例化工厂的改良(重要)
为了方便程序员,不需要每次都指定方法,Spring2.0做了改良
public class OrderDaoFactoryBean implements FactoryBean<OrderDao> {
@Override
public OrderDao getObject() throws Exception {
return new OrderDaoImpl();
}
@Override
public Class<?> getObjectType() {
return OrderDao.class;
}
}
在XML中简化了操作,不需要指定工厂方法,只需要指定工厂类
<bean id="orderDao" class="com.example.factory.OrderDaoFactoryBean"/>
Bean的生命周期
Bean的生命周期主要包括四个阶段
- 实例化: 给Bean创建对象,分配内存
- 执行构造方法
- 执行属性注入(Set Property): 进行Bean的注入和装配
- 初始化
- 初始化前置操作
- 检查Aware的相关接口并设置相关依赖
- BeanPostProcessor(Bean处理器)前置处理
- 初始化操作(使用注解 @PostConstruct 初始化 或者 使用(xml)init-method 初始化)
- 初始化后置操作
- BeanPostProcessor(Bean处理器)后置处理
- 初始化前置操作
- 销毁操作,容器关闭前才能触发bean的销毁
- 可使用close() 强制关闭
- 可使用registerShutdownHook() 注册关闭钩子
Bean的依赖注入
Setter注入
在Bean中定义引用类型属性并提供可访问的set方法。
private BookDao bookDao;
public void setBookDao(BookDaoImpl bookDao) {
this.bookDao = bookDao;
}
在配置中使用property标签ref属性注入引用对象
<bean id="bookService" class="com.example.service.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
构造器注入
public BookServiceImpl(BookDaoImpl bookDao) {
this.bookDao = bookDao;
}
以下是标准书写
<bean id="bookService" class="com.example.service.BookServiceImpl">
<!--name是形参名称,ref表示参照哪一个bean-->
<constructor-arg name="bookDao" ref="bookDao"/>
<constructor-arg name="name" value="demo"/>
</bean>
自动装配
自动装配的本质上还是通过一定的规则去寻找相适配的Bean
byType
通过Type寻找bean(推荐)
<bean id="bookService" class="com.example.service.BookServiceImpl" autowire="byType">
byName
通过Name寻找bean
<bean id="bookService" class="com.example.service.BookServiceImpl" autowire="byName">

浙公网安备 33010602011771号