bean是如何创建的
bean本质上就是对象,创建bean使用构造方法完成
为什么bean默认为单例?
由于不会每次都新创建新对象所以有一下几个性能上的优势。
1、减少了新生成实例的消耗
新生成实例消耗包括两方面,第一,spring会通过反射或者cglib来生成bean实例这都是耗性能的操作,其次给对象分配内存也会涉及复杂算法。
2、减少jvm垃圾回收
由于不会给每个请求都新生成bean实例,所以自然回收的对象少了。
3、可以快速获取到bean
因为单例的获取bean操作除了第一次生成之外其余的都是从缓存里获取的所以很快。
bean的生命周期
- 生命周期:从创建到消亡的完整过程
- bean生命周期:bean从创建到销毁的整体过程
- bean生命周期控制:在bean创建后的销毁前做一些事情
在 Spring 中,Bean 的生命周期是一个很复杂的执行过程,我们可以利用 Spring 提供的方法定制 Bean 的创建过程。
当一个 Bean 被加载到 Spring 容器时,它就具有了生命,而 Spring 容器在保证一个 Bean 能够使用之前,会进行很多工作。Spring 容器中 Bean 的生命周期流程如图 1 所示。
bean生命周期:
-
初始化容器
- 创建对象(内存分配)
- 执行构造方法
- 执行属性注入(set操作)
- 执行bean初始化方法
-
使用bean
执行业务操作 -
关闭/销毁容器
执行bean销毁方法
Bean生命周期中的初始化容器
1. 简介
在Spring框架中,Bean的生命周期由Spring容器管理。在Bean的创建和销毁过程中,Spring容器提供了一系列的回调方法,用于在特定的生命周期阶段执行自定义的逻辑。其中,初始化容器是Bean生命周期的一个重要阶段,它包括了Bean的实例化、属性注入和初始化等操作。
2. 初始化容器的阶段
初始化容器的阶段包括以下几个步骤:
2.1 Bean的实例化
在初始化容器阶段,Spring容器会根据配置文件或注解等方式,创建Bean的实例。这个过程通常是通过调用Bean的构造函数来完成的。
2.2 属性注入
在Bean实例化之后,Spring容器会通过依赖注入的方式,将配置文件中或其他Bean中定义的属性值注入到Bean中。属性注入可以通过构造函数、Setter方法或字段注入的方式进行。
2.3 初始化方法的调用
在属性注入完成后,Spring容器会调用Bean的初始化方法。初始化方法可以通过实现InitializingBean接口的afterPropertiesSet()方法,或在配置文件中通过init-method属性指定。
3. 初始化容器的示例
以下是一个使用Spring框架的初始化容器的示例:
3.1 定义Bean
public class MyBean implements InitializingBean {
private String name;
public void setName(String name) {
this.name = name;
}
public void afterPropertiesSet() throws Exception {
System.out.println("Initializing Bean...");
// 执行自定义的初始化逻辑
}
}
3.2 配置文件
<bean id="myBean" class="com.example.MyBean" init-method="init">
<property name="name" value="John" />
</bean>
3.3 初始化容器
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyBean myBean = (MyBean) context.getBean("myBean");
}
}
4. 总结
初始化容器是Bean生命周期中的一个重要阶段,它包括了Bean的实例化、属性注入和初始化等操作。在Spring框架中,可以通过实现InitializingBean接口的afterPropertiesSet()方法或在配置文件中通过init-method属性指定初始化方法。通过合理使用初始化容器,可以在Bean的初始化阶段执行自定义的逻辑,例如初始化数据库连接、加载配置文件等。
Bean生命周期中的使用Bean阶段
1. 简介
在Spring框架中,Bean的生命周期由Spring容器管理。在Bean的创建和销毁过程中,Spring容器提供了一系列的回调方法,用于在特定的生命周期阶段执行自定义的逻辑。其中,使用Bean阶段是Bean生命周期的一个重要阶段,它包括了对其他Bean的引用和使用。
2. 使用Bean的阶段
使用Bean的阶段包括以下几个步骤:
2.1 Bean的实例化
在使用Bean的阶段,Spring容器会根据配置文件或注解等方式,创建Bean的实例。这个过程通常是通过调用Bean的构造函数来完成的。
2.2 属性注入
在Bean实例化之后,Spring容器会通过依赖注入的方式,将配置文件中或其他Bean中定义的属性值注入到Bean中。属性注入可以通过构造函数、Setter方法或字段注入的方式进行。
2.3 使用其他Bean
在属性注入完成后,Bean可以使用其他Bean提供的功能。通过依赖注入,Bean可以获取其他Bean的实例,并调用其方法或访问其属性。
2.4 销毁Bean
在使用Bean阶段结束后,Spring容器会调用Bean的销毁方法,进行资源的释放和清理工作。销毁方法可以通过实现DisposableBean接口的destroy()方法,或在配置文件中通过destroy-method属性指定。
3. 使用Bean的示例
以下是一个使用Spring框架的使用Bean阶段的示例:
3.1 定义Bean
public class MyBean {
private OtherBean otherBean;
public void setOtherBean(OtherBean otherBean) {
this.otherBean = otherBean;
}
public void doSomething() {
otherBean.doSomethingElse();
// 使用其他Bean提供的功能
}
}
3.2 配置文件
<bean id="myBean" class="com.example.MyBean">
<property name="otherBean" ref="otherBean" />
</bean>
<bean id="otherBean" class="com.example.OtherBean" />
3.3 使用Bean
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyBean myBean = (MyBean) context.getBean("myBean");
myBean.doSomething();
}
}
4. 总结
使用Bean阶段是Bean生命周期中的一个重要阶段,它包括了对其他Bean的引用和使用。通过依赖注入,Bean可以获取其他Bean的实例,并调用其方法或访问其属性。通过合理使用使用Bean阶段,可以实现Bean之间的协作和功能的复用,提高系统的可维护性和扩展性。在Spring框架中,使用Bean阶段可以通过配置文件或注解等方式进行。
Bean生命周期中关闭/销毁容器
1. 简介
在Spring框架中,Bean的生命周期是由Spring容器管理的。在Bean的创建和销毁过程中,Spring容器提供了一系列的回调方法,用于在特定的生命周期阶段执行自定义的逻辑。其中,关闭/销毁容器是Bean生命周期的最后一个阶段,用于释放资源和执行清理工作。
2. 关闭/销毁容器的阶段
关闭/销毁容器的阶段包括以下几个步骤:
2.1 销毁Bean
在关闭/销毁容器的阶段,Spring容器会调用所有Bean的销毁方法,进行资源的释放和清理工作。销毁方法可以通过实现DisposableBean
接口的destroy()
方法,或在配置文件中通过destroy-method
属性指定。
2.2 关闭容器
在所有Bean的销毁方法执行完毕后,Spring容器会关闭自身,释放资源。关闭容器的操作可以通过调用close()
或destroy()
方法来完成。
3. 关闭/销毁容器的示例
以下是一个使用Spring框架的关闭/销毁容器的示例:
3.1 定义Bean
public class MyBean implements DisposableBean {
@Override
public void destroy() throws Exception {
// 执行销毁操作,释放资源
}
}
3.2 配置文件
<bean id="myBean" class="com.example.MyBean" destroy-method="destroy" />
3.3 关闭/销毁容器
public class MainApp {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 使用容器中的Bean
// ...
// 关闭容器
context.close();
}
}
4. 总结
关闭/销毁容器是Bean生命周期的最后一个阶段,用于释放资源和执行清理工作。在关闭/销毁容器的阶段,Spring容器会调用所有Bean的销毁方法,进行资源的释放和清理工作。销毁方法可以通过实现DisposableBean
接口的destroy()
方法,或在配置文件中通过destroy-method
属性指定。在关闭/销毁容器之前,需要确保所有的Bean的销毁方法已经执行完毕。通过合理使用关闭/销毁容器的阶段,可以保证系统资源的释放和清理工作的完成,提高系统的可靠性和稳定性。