当前位置: 首页 > 知识库问答 >
问题:

Spring bean执行顺序

孙帅
2023-03-14
public abstract class ClassA {
    private String text;

    public ClassA(){
        System.out.println("- new -");
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

}
public class ClassB extends ClassA {
    public void settings(){
        System.out.println("Constructing ClassB object");
    }
}
public class ClassC {
    private List<ClassA> items = new ArrayList<>();

    public List<ClassA> getItems(){
        return items;
    }

    public void setItems(List<ClassA> items) {
        this.items = items;
    }

    public void print(){
        String s = "This object contains: ";
        for(ClassA item : items){
            s+= item.getText();
        }
        System.out.println(s);
    }
}

类D

public class ClassD extends ClassA {
    public void settings(){
        System.out.println("Constructing ClassD Object");
    }
}

主要方法是

public class Question1Application {

    public static void main(String[] args) {
        //SpringApplication.run(Question1Application.class, args);
        System.out.println("PREPARE");
        ConfigurableApplicationContext context = new      ClassPathXmlApplicationContext("springconfig.xml");
        System.out.println("BEGIN");
        ClassB classB = context.getBean("objectB",ClassB.class);
        ClassC classC = context.getBean("objectF",ClassC.class);
        System.out.println("END");
        context.close();
    }
}

Bean配置文件是

?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="objectA" class="com.example.ClassA" abstract="true">
    <property name="text" value="Things!"></property>
</bean>

<bean id="objectB" class="com.example.ClassB" scope="prototype" parent="objectA"
    init-method="settings">
</bean>

<bean id="objectC" class="com.example.ClassD" scope="prototype" parent="objectA"
    init-method="settings">
</bean>

<bean id="objectD" class="com.example.ClassD" lazy-init="true" parent="objectA"
    init-method="settings">
</bean>

<bean id="objectE" class="com.example.ClassD" parent="objectA" init-method="settings"></bean>

<bean id="objectF" class="com.example.ClassC" init-method="print">
    <property name="items">
        <list>
            <ref bean="objectB"></ref>
            <bean class="com.example.ClassB">
                <property name="text" value="lot of things!"></property>
            </bean>
        </list>
    </property>
</bean>

程序的输出为:

PREPARE
-new-
constructing classD object
-new-
constructing classB object
-new-
This object contains : lots of things!
BEGIN
-new-
constructing classB object
END

共有1个答案

帅彦
2023-03-14

该示例很好地演示了单例范围和原型范围之间的区别。

第一个实例将在上下文启动时立即创建,并且IOC控制器应该支持它们的整个生命周期。

与单例相比,对于原型范围,容器将根据我们的需求创建一个实例。一个请求-从上下文创建一个新的配置良好的对象。一个容器是不会处理这种类型的豆子的,在送人之后就不再去想它们了。

    null
 类似资料:
  • 有没有办法在刷新Spring上下文后找出bean创建顺序(或至少依赖顺序)? 只要简单的bean定义顺序就可以了。我不想要他们注册的顺序。我想要创建它们的顺序(依赖关系树)

  • 问题内容: 我试图理解这段代码,不确定为什么第二遍在第一遍之前执行。如果有人真的可以帮助我,那就太好了! 输出: 问题答案: 您没有任何内容可以显式同步两个goroutine的顺序。如果运行足够的时间,您将看到调用以不同的顺序进行打印。当执行goroutine时,由于它们是并发操作,因此无法保证它们将何时执行和/或完成。您需要使用各种标准库程序包或通道本身来同步并发运行的goroutine的执行。

  • 我正在比较算法(前n个数之和)的顺序和并行性能(使用ForkJoinPool): 我试着用不同的NumLoop来获得不同的值,但顺序法总是表现得更好,而且也是按3-4的顺序。 考虑到阵列大小并不是那么小,并行版本在这里的性能不应该更好吗。

  • 我无法确定spring security在何时何地执行身份验证管理器。我的意思是,certian过滤器按如下顺序执行: 但是当身份验证提供者对提供的用户名和密码进行身份验证时,我的意思是问下面这些过滤器是身份验证提供者执行的。 问候贾延德拉

  • 问题内容: 我们有一个基于石英的调度程序应用程序,该应用程序每分钟运行约1000个作业,每分钟的秒数均匀分布,即每秒约16-17个作业。理想情况下,这16-17个作业应同时触发,但是该作业的execute方法的第一个语句(仅记录执行时间)非常晚。例如,假设我们从05:00到05:04每分钟安排1000个作业。因此,理想情况下,计划在05:03:50进行的作业应该在05:03:50记录了execut

  • 我试图理解java中完整期货的非阻塞回调性质 有了上面的代码,我总是看到下面看到的输出 线程名称ForkJoinPool.common池工人-1 thenApply Thread name main thenApply Thread name main thenAcceptThread name main Thread name main 这个顺序似乎建议主线程等待所有Futures线程的执行。