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会尝试使用
constructor
或byType
进行自动装配。
以下是一个按类型自动装配的示例:
xml
<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.example.service.impl.BookServiceImpl" autowire="byType"/>