问题来源:
有一个bean为A,一个bean为B。想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值。
如果只是在A里单纯的写着:
private B b;
private String name = b.funb();
会报错说nullpointException,因为这个时候b还没被set进来,所以为null。
解决办法为如下代码,同时学习下spring中 InitializingBean ,对象构造方法 , init-method 的执行顺序。
- public class A implements InitializingBean {
-
- private B b;
- private String name;
-
- public void setB(B b) {
- System.out.println("A.setB initialed");
- this.b = b;
- }
-
- public A() {
- System.out.println("A initialed");
- }
-
- public void init() {
- System.out.println("init");
- this.name = b.funb();
- }
-
- @Override
- public String toString() {
- return super.toString() + this.name;
- }
-
- public void afterPropertiesSet() throws Exception {
-
-
-
-
- System.out.println("afterPropertiesSet");
-
- }
-
- }
-
- public class B {
-
- public String funb() {
- System.out.println("funb");
- return "B.funb";
- }
-
- public B() {
- System.out.println("B initialed");
- }
- }
spring配置文件
<beans default-autowire="byName">
<bean id="a" class="testspring.A" init-method="init">
</bean>
<bean id="b" class="testspring.B">
</bean>
</beans>
测试代码:
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext(
"src/testspring/bean.xml");
A a = (A) context.getBean("a");
System.out.println(a);
}
程序输出为:
A initialed
B initialed
A.setB initialed
afterPropertiesSet
init
funb
testspring.A@50d89cB.funb
从这里看到A的name属性在bean加载完成的时候也被成功设置为B的funB方法的返回值了,要点就是用init-method来实现。
加载顺序也可以看到为:
先构造函数——>然后是b的set方法注入——>InitializingBean 的afterPropertiesSet方法——>init-method方法
总结为:
以下内容是从书中摘录来的,但是我发现即使摘录一遍,对其内容的理解也会更加深入!
一、Spring装配Bean的过程
1. 实例化;
2. 设置属性值;
3. 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name;
4. 如果实现BeanFactoryAware接口,调用setBeanFactory 设置BeanFactory;
5. 如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext
6. 调用BeanPostProcessor的预先初始化方法;
7. 调用InitializingBean的afterPropertiesSet()方法;
8. 调用定制init-method方法;
9. 调用BeanPostProcessor的后初始化方法;
Spring容器关闭过程
1. 调用DisposableBean的destroy();
2. 调用定制的destroy-method方法;
一,单一Bean
1. 实例化;
2. 设置属性值;
3. 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name;
4. 如果实现BeanFactoryAware接口,调用setBeanFactory 设置BeanFactory;
5. 如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext
6. 调用BeanPostProcessor的预先初始化方法;
7. 调用InitializingBean的afterPropertiesSet()方法;
8. 调用定制init-method方法;
9. 调用BeanPostProcessor的后初始化方法;
1. 调用DisposableBean的destroy();
2. 调用定制的destroy-method方法;
二,多个Bean的先后顺序
- 优先加载BeanPostProcessor的实现Bean
- 按Bean文件和Bean的定义顺序按bean的装载顺序(即使加载多个spring文件时存在id覆盖)
- “设置属性值”(第2步)时,遇到ref,则在“实例化”(第1步)之后先加载ref的id对应的bean
- AbstractFactoryBean的子类,在第6步之后,会调用createInstance方法,之后会调用getObjectType方法
- BeanFactoryUtils类也会改变Bean的加载顺序
三,附近
测试代码
http://guoliangqi.iteye.com/blog/632697
分享到:
相关推荐
在Spring框架中,Bean的加载顺序是一个重要的概念,它涉及到Spring容器如何管理和初始化Bean的过程。在"spring的bean加载顺序样例项目"中,我们可以通过分析和实验来深入理解这一主题。下面将详细阐述Spring Bean的...
在Spring框架中,Bean的加载顺序是理解Spring IoC(Inversion of Control,控制反转)容器工作原理的关键部分。这个过程涉及到Bean定义的解析、实例化、初始化等多个步骤。让我们详细探讨Spring Bean加载顺序的各个...
Spring 中控制 2 个 bean 的初始化顺序 在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 ...
本文将详细探讨Spring加载顺序,并结合`@PostConstruct`、`构造方法`以及`@Autowired`等关键注解进行深入解析。 首先,Spring容器在启动时会读取配置文件(如XML或Java配置类),根据配置信息创建Bean的定义。Bean...
在Spring Boot应用中,控制Bean的加载顺序是一个关键的议题,尤其是在处理复杂依赖关系或需要在特定时刻执行初始化操作的场景。Spring Boot遵循"约定优于配置"的理念,简化了配置,但同时也带来了需要手动干预Bean...
Spring多种加载Bean方式解析 本篇文章主要介绍了Spring多种加载Bean方式解析,通过对Bean加载方式...通过对Spring加载Bean方式的了解,我们可以更好地理解Spring中的Bean加载机制,从而更好地使用Spring框架进行开发。
Spring bean 加载执行顺序实例解析 在 Spring 框架中,Bean 的加载和执行顺序是一个非常重要的概念。今天,我们将通过一个实例来解析 Spring bean 加载执行顺序,了解 Spring 中 Bean 的生命周期。 首先,让我们来...
这里,`order`属性定义了配置文件的加载顺序,数值越小优先级越高;`ignoreUnresolvablePlaceholders`属性则用于控制当占位符无法解析时的行为,默认为`false`(抛出异常),设置为`true`则会忽略这些未解析的占位符...
Spring 和 SpringMVC 的配置加载顺序是理解这两个框架协同工作的重要方面。首先,DispatcherServlet 是 SpringMVC 的核心组件,它扮演着请求分发者的角色,确保请求被正确地路由到相应的处理器。DispatcherServlet ...
### web.xml文件中配置(servlet, spring, filter, listener)的加载顺序 在Java Web应用开发中,`web.xml`文件是整个Web应用程序的核心配置文件之一,它定义了Servlet容器如何启动、初始化以及配置各个组件如...
Spring Boot 配置加载顺序及属性加载顺序详解 Spring Boot 是一个流行的 Java 框架,用于快速构建基于 Spring 的应用程序。在 Spring Boot 中,配置加载顺序及属性加载顺序是一个非常重要的概念。我们可以通过多种...
例如,我们可以创建一个`ApplicationContext`实例,如`ClassPathXmlApplicationContext`,并传入包含配置信息的XML文件路径,如`"spring.xml"`和`"spring1.xml"`,来启动容器并加载Bean的定义。 Spring提供了多种...
3、import用于导入其他配置文件的Bean定义,这是为了加载多个配置文件,当然也可以把这些配置文件构造为一个数组(new String[] {“config1.xml”, config2.xml})传给ApplicationContext实现进行加载多个配置文件,...
2. Bean 的懒加载机制:Spring 的懒加载机制可以导致 Bean 的创建顺序不确定,从而形成循环依赖。 3. Bean 的依赖关系复杂性:当 Bean 之间的依赖关系变得越来越复杂时,循环依赖的问题就会变得越来越严重。 二、...
通过"beandemo.rar"的实践,我们可以直观地看到这些步骤如何在代码中体现,从而加深对Spring加载流程的理解。此外,这也为我们提供了扩展研究的基础,比如可以尝试自定义`BeanPostProcessor`,实现更复杂的Bean生命...
在Spring Boot应用中,正确控制Bean的加载顺序是解决依赖问题和确保系统稳定运行的关键。Spring Boot遵循“约定优于配置”的原则,简化了许多配置工作,但在特定情况下,我们需要手动干预Bean的加载顺序,以避免因...
2. **初始化**:当Spring IoC容器加载时,会根据配置文件中的信息创建Bean实例,并执行任何指定的初始化方法。 3. **使用**:开发者可以通过Spring容器获取Bean的实例并进行使用。 4. **销毁**:在某些情况下,...
10. IOC容器的加载过程:通过读取配置文件和注解来加载BeanDefinition,然后实例化Bean并建立依赖关系。 11. Spring的扩展点:包括BeanFactoryPostProcessor、BeanPostProcessor、...
例如,如果Filter中需要使用到Bean,但是加载顺序是先加载Filter后加载Bean,则Filter中初始化操作中的Bean将为null。 通过对web.xml文件的分析,我们可以得出结论:Listener的加载顺序在最前面,接着是Filter,...