Bean

Bean的配置

bean标签表示构造一个Bean

  • id
  • name 表示取别名(不建议)
  • class 该Bean的类型
  • scope 表述Bean的作用域
    • singleton(默认) 全局单例
      • 表现层对象
      • 业务层对象
      • 数据层对象
      • 工具对象
    • prototype 非单例
      • 封装实体的域对象(domain/pojo/entity)
  • 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">
posted @   自来人  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示