Spring Bean的基础配置与实例化详解

Spring Bean的基础配置与实例化详解

文章目录

    • [Spring Bean的基础配置与实例化详解](#Spring Bean的基础配置与实例化详解)
      • 一、Bean的基础配置
        • [1. Bean基础配置](#1. Bean基础配置)
        • [2. Bean别名配置](#2. Bean别名配置)
        • [3. Bean作用范围配置](#3. Bean作用范围配置)
      • 二、Bean的实例化
        • [1. 构造方法实例化Bean](#1. 构造方法实例化Bean)
        • [2. 静态工厂实例化Bean](#2. 静态工厂实例化Bean)
        • [3. 实例工厂实例化Bean](#3. 实例工厂实例化Bean)
      • 三、Bean的生命周期
        • [1. Bean生命周期控制](#1. Bean生命周期控制)
        • [2. Bean销毁时机](#2. Bean销毁时机)
      • 四、依赖注入(DI配置)
        • [1. 依赖注入方式](#1. 依赖注入方式)
          • [1.1 Setter方式注入](#1.1 Setter方式注入)
          • [1.2 构造器方式注入](#1.2 构造器方式注入)
        • [2. 依赖自动装配](#2. 依赖自动装配)

一、Bean的基础配置

1. Bean基础配置

在Spring中,Bean的基础配置是通过XML文件或Java注解来完成的。以下是通过XML文件配置Bean的示例:

xml 复制代码
<beans>
    <bean id="myBean" class="com.example.MyClass">
        <property name="propertyName" value="propertyValue"/>
    </bean>
</beans>

在Java注解方式中,可以使用@Component@Service@Repository@Controller注解来定义Bean:

java 复制代码
@Component
public class MyClass {
    @Value("propertyValue")
    private String propertyName;
}
2. Bean别名配置

为了方便管理和引用Bean,Spring允许为Bean配置别名。配置别名可以通过alias标签来实现:

xml 复制代码
<bean id="myBean" class="com.example.MyClass"/>
<alias name="myBean" alias="myBeanAlias"/>

在代码中,可以通过别名获取Bean实例:

java 复制代码
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
MyClass myBean = (MyClass) ctx.getBean("myBeanAlias");
3. Bean作用范围配置

Spring提供了多种Bean作用范围(Scope)配置,决定了Bean的生命周期和可见性。常见的作用范围包括:

  • singleton(默认):整个Spring IoC容器中只有一个Bean实例。
  • prototype:每次请求都会创建一个新的Bean实例。
  • request:每个HTTP请求都会创建一个新的Bean实例,仅适用于Web应用。
  • session:每个HTTP会话都会创建一个新的Bean实例,仅适用于Web应用。
  • globalSession:全局HTTP会话,通常仅在Portlet应用中使用。
  • application:在ServletContext范围内创建一个单例Bean。
  • websocket:在WebSocket范围内创建一个单例Bean。

以下是一些示例配置:

xml 复制代码
<!-- 单例Bean -->
<bean id="singletonBean" class="com.example.SingletonBean" scope="singleton"/>

<!-- 多例Bean -->
<bean id="prototypeBean" class="com.example.PrototypeBean" scope="prototype"/>

<!-- Request作用域 -->
<bean id="requestBean" class="com.example.RequestBean" scope="request"/>

<!-- Session作用域 -->
<bean id="sessionBean" class="com.example.SessionBean" scope="session"/>

二、Bean的实例化

Spring提供了多种实例化Bean的方式,包括构造方法、静态工厂方法和实例工厂方法。

1. 构造方法实例化Bean

通过构造方法实例化Bean是最常见的方式。以下是通过构造方法实例化Bean的示例:

java 复制代码
public class BookDaoImpl implements BookDao {
    public BookDaoImpl() {
        System.out.println("book dao constructor is running ....");
    }
    public void save() {
        System.out.println("book dao save ...");
    }
}

在XML配置文件中:

xml 复制代码
<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl"/>
2. 静态工厂实例化Bean

通过静态工厂方法实例化Bean也是一种常见的方式。以下是通过静态工厂方法实例化Bean的示例:

java 复制代码
public class OrderDaoFactory {
    public static OrderDao getOrderDao() {
        System.out.println("factory setup....");
        return new OrderDaoImpl();
    }
}

在XML配置文件中:

xml 复制代码
<bean id="orderDao" class="com.example.factory.OrderDaoFactory" factory-method="getOrderDao"/>
3. 实例工厂实例化Bean

通过实例工厂方法实例化Bean也是一种常见的方式。以下是通过实例工厂方法实例化Bean的示例:

java 复制代码
public class UserDaoFactory {
    public UserDao getUserDao() {
        return new UserDaoImpl();
    }
}

在XML配置文件中:

xml 复制代码
<bean id="userFactory" class="com.example.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>

三、Bean的生命周期

1. Bean生命周期控制

在Spring中,可以通过配置初始化方法和销毁方法来控制Bean的生命周期。以下是一个示例:

java 复制代码
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
    // 表示bean初始化对应的操作
    public void init() {
        System.out.println("init...");
    }
    // 表示bean销毁前对应的操作
    public void destroy() {
        System.out.println("destroy...");
    }
}

在XML配置文件中:

xml 复制代码
<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
2. Bean销毁时机

Bean的销毁通常在Spring容器关闭时发生,可以通过手动关闭容器或注册关闭钩子来触发销毁方法:

java 复制代码
public class AppForLifeCycle {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
        // 注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
        ctx.registerShutdownHook();
        // 手动关闭容器
        // ctx.close();
    }
}

四、依赖注入(DI配置)

1. 依赖注入方式

Spring支持两种主要的依赖注入方式:Setter注入和构造器注入。

1.1 Setter方式注入

Setter方式注入可以用于注入简单类型和引用类型:

java 复制代码
public class BookDaoImpl implements BookDao {
    private int connectionNumber;

    public void setConnectionNumber(int connectionNumber) {
        this.connectionNumber = connectionNumber;
    }

    // 其他方法...
}

在XML配置文件中:

xml 复制代码
<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl">
    <property name="connectionNumber" value="10"/>
</bean>
1.2 构造器方式注入

构造器方式注入也可以用于注入简单类型和引用类型:

java 复制代码
public class BookDaoImpl implements BookDao {
    private int connectionNumber;

    public BookDaoImpl(int connectionNumber) {
        this.connectionNumber = connectionNumber;
    }

    // 其他方法...
}

在XML配置文件中:

xml 复制代码
<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl">
    <constructor-arg name="connectionNumber" value="10"/>
</bean>
2. 依赖自动装配

Spring支持自动装配Bean的依赖,可以通过autowire属性配置自动装配类型:

  • byName:根据属性名自动装配。
  • byType:根据属性类型自动装配。
  • constructor:通过构造器自动装配。
  • autodetect :Spring会尝试使用constructorbyType进行自动装配。

以下是一个按类型自动装配的示例:

xml 复制代码
<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.example.service.impl.BookServiceImpl" autowire="byType"/>
相关推荐
小灰灰要减肥1 小时前
装饰者模式
java
张铁铁是个小胖子1 小时前
MyBatis学习
java·学习·mybatis
0zxm1 小时前
06 - Django 视图view
网络·后端·python·django
m0_748257181 小时前
Spring Boot FileUpLoad and Interceptor(文件上传和拦截器,Web入门知识)
前端·spring boot·后端
Yan.love2 小时前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶2 小时前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥2 小时前
java提高正则处理效率
java·开发语言
小_太_阳2 小时前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
智慧老师2 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm2 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23