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

通过init方法的Spring bean属性种群

邰伟彦
2023-03-14

我有一个关于spring beans初始化的问题。当我们通过init方法填充bean属性时,scneario是什么。看看下面给出的代码片段。这里我通过init方法填充超类bean属性列表。

1) 超级类Bean:

public class Super  {
    private List<String> list = new ArrayList<String>();
    public void setList(List<String> list) {
        this.list = list;
    }
    public void init(){
     System.out.println("Super init called");
     populateList();
     System.out.println("Super list"+list.size());
    }
    public void populateList(){
        list.add("A");
        list.add("B");
    }
    public List<String> getList() {
        return list;
    }
}

2)豆子2:

public class Sub extends Super {
    public static void main(String[] args) {
        ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appXml/init-test.xml");
        Sub utils = (Sub)ctx.getBean("sub");

        System.out.println("Sub list:::"+utils.getList().size());
        for(String s : utils.getList()){
            System.out.println("Value::::" +s);
        }
    }
}

3) Spring上下文xml:

<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-3.0.xsd">
    <bean id = "super" class = "com.hitesh.springtest.Super" init-method="init">
    </bean>
    <bean id = "sub" class = "com.hitesh.springtest.Sub"></bean>    
    </beans>

4) 输出:名为Super list2子列表的Super init::0

我的问题是当超级类被容器初始化时,调用init()。在这个方法中,列表对象被填充。现在,当子类实例化完成时,为什么我们得到的列表大小为0,因为我们指的是在超级bean初始化中填充的非常相同的列表对象。有人能解释一下吗?

共有3个答案

百里光熙
2023-03-14

您会看到“Super list2”,因为Spring正在使用id=“Super”创建bean,并且当它按照Spring上下文中的定义创建它时,会调用init方法。xml

当Spring创建bean id="sub"时,它不会调用init-method,因为没有指定一个。如果您将init-method添加到subbean的定义中,您应该会看到您期望的行为。

钮轩昂
2023-03-14

比方说,您不是在初始化spring,而是在初始化对象(松散地在spring容器的行上),代码如下所示

Super super = new Super();
super.init();

Sub sub = new Sub();

//now if you say 
sub.getList().size();
//This will always print size zero as you never initialized the super class collection.

所以有两个不同的对象。如果超类被定义为另一个bean,Spring不会继承它的属性。

艾焱
2023-03-14

它不是完全相同的列表对象。上下文中有两个对象:supersub。由于list是一个实例字段,因此存在list对象的两个实例,一个用于super,另一个用于subsub的方法从未初始化,因为没有为该bean设置init方法。

 类似资料:
  • 我有豆子,例如 服务(特定服务)是使用抽象方法初始化()扩展抽象类MyService并使用方法特定的Logic()实现接口MyInterface的类。 因此,管理器在服务对象上调用方法init(),如下所示: 但当bean初始化时,我有以下问题: 无法转换“java.util”类型的属性值。将LinkedHashSet设置为所需类型“java.util”。设置“for property”“serv

  • 本文向大家介绍JavaScript对象的属性可以通过几种方式访问​​?,包括了JavaScript对象的属性可以通过几种方式访问​​?的使用技巧和注意事项,需要的朋友参考一下  可以通过两种方式访问对象属性。一个是.property,另一个是[property]。 语法1 语法2 为了更好地理解,让我们看下面的示例。 在下面的示例中,定义了一个名为“ person”的对象,并以点符号访问其属性。

  • 谁能帮帮我吗。我有一个物品清单——在我的例子中有啤酒厂。每个酿酒厂都有一些属性(字段),如姓名、地址、id、省份(所在州)等。。。一家酿酒厂(名称)可以位于多个省份。现在我需要解决的问题是:如何计算每个州的啤酒厂数量?所以,按省份分组。所有数据都是从csv文件读取的。我已经创建了返回啤酒厂列表的阅读器。当我尝试这个: 这将返回我键(省)和整个对象作为值。 我已经坐了几个小时了。我没有主意了。

  • 问题内容: 我有一个这样的html代码段: html中此元素的唯一唯一标识是attribute ,因此我想使用 某种 Pythonselenium 方法 来定位它,如下所示: 我已经检查了selenium(python)文档以查找元素, 但是没有获得关于如何通过attr 定位此elem的线索。有没有在pythonselenium中找到该元素的明确方法? 问题答案: 您可以 通过xpath 获取它并

  • 本文向大家介绍jquery操作checked属性以及disabled属性的多种方法,包括了jquery操作checked属性以及disabled属性的多种方法的使用技巧和注意事项,需要的朋友参考一下 下边两种写法没有任何区别 只是少了些代码而已... jquery判断checked的三种方法: jquery赋值checked的几种写法: 所有的jquery版本都可以这样赋值: jquery1.6+

  • 问题内容: 如您所知,可以如下初始化对象: 是否可以通过函数定义类似这样的对象: 我的目标实际上是从API中获取对象,并通过ng-repeat将它们显示在列表中 问题答案: 该文件说将采用任何表达方式。因此,是的,只要关联的作用域定义了一个称为的函数,您就可以做上面的事情(我也为乐趣进行了验证)。 请注意,该文档说,这实际上仅旨在用于别名: ngInit用于别名化ngRepeat的特殊属性的唯一适