gpt4 book ai didi

java - Spring 的 Bean 列表

转载 作者:行者123 更新时间:2023-12-02 04:13:57 25 4
gpt4 key购买 nike

我在其中放置了一个用户详细信息类,其中放置了地址类来存储每个用户详细信息类的多个地址。我正在使用 Spring 4.0。下面给出代码:

用户详细信息类:

@Component("userDetails")

public class UserDetails {

@Resource(name="address")
@Autowired
private List<Address> address;
public List<Address> getAddress() {
return address;
}
@Autowired
public void setAddress(List<Address> address) {
this.address = address;
}
}

地址类别:

@Component("address")

public class Address {

private String area;

public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
}

在这个例子中,Address.area值需要在运行时传递,然后我需要为Address类创建一个对象。然后需要添加 UserDetails 类中存在的 List 地址变量。同样,我需要在 arrayList 中添加 n 个数字对象,然后我需要为 UserDetails 类创建一个对象。

我尝试了以下代码:

public class AppMain {

public static void main(String args[]){
AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

Address address = (Address)context.getBean("address");
//setting first value:
address.setArea("XXX");

Address address1 = (Address)context.getBean("address");
//setting second value
address1.setArea("YYY");

UserDetails userDetails = (UserDetails)context.getBean("userDetails");
System.out.println("User Size: "+application.getAddress().size());
System.out.println("User Details : "+application.getAddress().get(0).getArea());
System.out.println("User Details : "+application.getAddress().get(1).getArea()); // getting ArrayIndexOutOfBoundException in this line
}
}

部分输出:用户规模:1用户详细信息:YYY

预期输出:用户规模:2用户详细信息:XXX用户详细信息:YYY

您能帮忙解决一下吗?

最佳答案

我并不完全清楚为什么您想要使用 Spring 创建看似域对象的内容,但看起来这就是您在代码中所做的事情。

Spring有Scope的概念它控制当您从 ApplicationContext 检索 bean 时发生的情况。默认Scopesingleton,这意味着您只能在ApplicationContext 中获得该bean 的一个实例。这意味着您的调用 context.getBean("address") 始终返回相同的对象。

至于您使用@Component注释执行的连接;当扫描类路径时(通常在应用程序启动时)会发生这种情况。此时,Spring 实例化每个用 @Component 标记的类的单个实例,即一个 Address 和一个 UserDetails。 Spring 足够聪明,可以在设置 address 字段之前将单个 Address 添加到 List 中,但仅此而已。

然后,您的代码会从 ApplicationContext 中检索此对象,并在同一对象上设置两次区域,这就是调试语句按其方式打印的原因。

这解释了您的代码发生了什么情况,但没有回答如何修复它的问题。

正如我所说,我不明白为什么您要使用 Spring 来构建看似域模型的东西。就每个类的实例而言,领域模型通常无法提前获知,因此 Spring 不是用于创建此类模型的合适工具(Spring 通常用于将应用程序本身连接在一起)。

您应该像这样修改域类的构造函数:

public Address
{
private String area;

public Address(String area)
{
this.area = area;
}

...
}

public UserDetails
{
private List<Address> addresses;

public UserDetails(Address... addresses)
{
this.addresses = Arrays.asList(addresses);
}

...
}

然后可以重写main方法:

public static void main(String[] args)
{
UserDetails userDetails = new UserDetails(
new Address("XXX"),
new Address("YYY"),
);

System.out.println("User Size: " + application.getAddress().size());
System.out.println("User Details: " + application.getAddress().get(0).getArea());
System.out.println("User Details: " + application.getAddress().get(1).getArea());
}

关于java - Spring 的 Bean 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33517441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com