Spring的Bean生命周期主要分为以下5个阶段:
-
实例化Bean:Spring容器创建Bean的实例,通过Java的反射机制实现对象的创建。
-
设置Bean属性值:Spring容器通过Spring配置文件或注解设置Bean的属性值。
-
调用Bean的初始化方法:Spring容器调用Bean的初始化方法,初始化方法可以通过注解方式和配置文件方式进行声明。
-
Bean已经可以使用:Bean已经完全初始化,可以使用了。
-
调用Bean的销毁方法:Spring容器关闭时,会调用Bean的销毁方法,销毁方法可以通过注解方式和配置文件方式进行声明。
下面分别进行详细讲解:
1. 实例化Bean
Spring容器根据配置文件或注解创建Bean的实例,实例化的方式有两种:构造器方式和静态工厂方式。其中构造器方式又分为默认构造器和有参数构造器。示例代码如下:
public class User {
private String name;
private int age;
public User() {
System.out.println("User的构造器被调用");
}
public User(String name, int age) {
this.name = name;
this.age = age;
System.out.println("User的有参数构造器被调用");
}
// 省略getter和setter方法
}
<bean id="user" class="com.xxx.User">
<constructor-arg name="name" value="张三"/>
<constructor-arg name="age" value="18"/>
</bean>
@Configuration
public class AppConfig {
@Bean
public User user() {
return new User("李四", 20);
}
}
2. 设置Bean属性值
Spring容器会调用Bean的setter方法或直接使用反射注入属性值。示例代码如下:
public class User {
private String name;
private int age;
public void setName(String name) {
this.name = name;
System.out.println("User的setName方法被调用");
}
public void setAge(int age) {
this.age = age;
System.out.println("User的setAge方法被调用");
}
// 省略getter和setter方法
}
<bean id="user" class="com.xxx.User">
<property name="name" value="张三"/>
<property name="age" value="18"/>
</bean>
@Configuration
public class AppConfig {
@Bean
public User user() {
User user = new User();
user.setName("李四");
user.setAge(20);
return user;
}
}
3. 调用Bean的初始化方法
当Bean实例化和属性注入完成后,Spring容器会去调用Bean的初始化方法。初始化方法可以通过@PostConstruct
注解和init-method
属性进行声明。示例代码如下:
public class User {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@PostConstruct
public void init() {
System.out.println("User的初始化方法被调用");
}
// 省略getter和setter方法
}
<bean id="user" class="com.xxx.User" init-method="init">
<property name="name" value="张三"/>
<property name="age" value="18"/>
</bean>
@Configuration
public class AppConfig {
@Bean(initMethod = "init")
public User user() {
User user = new User();
user.setName("李四");
user.setAge(20);
return user;
}
}
4. Bean已经可以使用
Bean实例化、属性注入和初始化方法执行完成后,Bean可以被应用程序调用。示例代码如下:
public class UserService {
private User user;
public UserService(User user) {
this.user = user;
}
public void hello() {
System.out.println("Hello, " + user.getName());
}
}
@Configuration
public class AppConfig {
@Bean(initMethod = "init")
public User user() {
User user = new User();
user.setName("李四");
user.setAge(20);
return user;
}
@Bean
public UserService userService(User user) {
return new UserService(user);
}
}
5. 调用Bean的销毁方法
当Spring容器关闭时,会调用Bean的销毁方法。销毁方法可以通过@PreDestroy
注解和destroy-method
属性进行声明。示例代码如下:
public class User {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@PostConstruct
public void init() {
System.out.println("User的初始化方法被调用");
}
@PreDestroy
public void destroy() {
System.out.println("User的销毁方法被调用");
}
// 省略getter和setter方法
}
<bean id="user" class="com.xxx.User" init-method="init" destroy-method="destroy">
<property name="name" value="张三"/>
<property name="age" value="18"/>
</bean>
@Configuration
public class AppConfig {
@Bean(initMethod = "init", destroyMethod = "destroy")
public User user() {
User user = new User();
user.setName("李四");
user.setAge(20);
return user;
}
}
通过以上内容,我们已经深入了解了Spring的Bean生命周期。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入了解Spring的Bean生命周期 - Python技术站