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">
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现