【发布时间】:2017-08-11 10:38:37
【问题描述】:
我是 Spring 框架的新手,只是在用它做一些有趣的事情。在那期间,我遇到了一个奇怪的输出。我试图调试。但没有得到答案(虽然我没有深入研究框架代码)。
我想做的事:我只是想创建一个User 类的实例。带有值{city = 'Sirsa2', i1 = 12}。
我有以下四个代码文件:
IntTest.java
package Task4;
import org.springframework.stereotype.Service;
//Just creating an integer. Since Integer class is final so, I have to extend Number class. So I also needed to override abstract metods.
@Service
public class IntTest extends Number {
Integer i1;
public Integer getI1() {
return i1;
}
public void setI1(Integer i1) {
this.i1 = i1;
}
public IntTest() {
i1 = 90;
}
@Override
public double doubleValue() {
return i1.doubleValue();
}
@Override
public float floatValue() {
return i1.floatValue();
}
@Override
public int intValue() {
return i1.intValue();
}
@Override
public long longValue() {
return i1.longValue();
}
}
Address.java
package Task4;
import org.springframework.stereotype.Service;
@Service
public class Address {
private String city;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
User.java
package Task4;
import org.springframework.stereotype.Service;
@Service
public class User {
Address address;
Integer i1;
User(Address address, IntTest t1)
{
this.address= address;
i1 = t1.getI1();
System.out.println("1. Point " + t1.getI1());
}
public void getInfo() {
System.out.println(address.getCity() + " | "+i1.intValue());
}
}
Config.java
package Task4;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("Task3")
public class Config {}
MainClass.java
package Task4;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainClass {
public static void main(String args[]) {
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();
context.register(Config.class);
context.refresh();
Address address1=(Address)context.getBean(Address.class);
address1.setCity("Sirsa");
Address address2=(Address)context.getBean(Address.class);
address2.setCity("Sirsa2");
IntTest intTest=(IntTest)context.getBean(IntTest.class);
System.out.println("2. Point " + intTest.getI1());
intTest.setI1(12);
System.out.println("3. Point " + intTest.getI1());
User user=(User) context.getBean(User.class);
user.getInfo();
}
}
当我将 MainClass.java 作为 JavaApplication 运行时,我会得到以下输出:
1. Point 90
2. Point 90
3. Point 12
Sirsa2 | 90
但期待:
2. Point 90
3. Point 12
1. Point 12
Sirsa2 | 12
我不确定对象是如何创建的。但我认为:
- 要创建
User类的对象,正在调用构造函数User(Address address, IntTest t1)。 - 由于在构造函数中传递的
Address类的对象是address1变量(因为它的值被打印为'Sirsa2',而不是'Sirsa')。所以我期待IntTest类的对象应该是i1变量。 - 另外,我希望
User类的构造函数应该最后调用。但根据输出情况并非如此。 - 当我调试它时,我才知道它是在
context.refresh();中的MainClass.java中创建对象。但是如何将 City 的值设置为Sirsa2而不是将i1的值设置为 12。
我正在使用 Eclipse(Oxygen)、Java 1.8.0_121、spring-framework-4.3.9.RELEASE 和 commons-logging-1.2
【问题讨论】:
-
默认情况下,Spring bean 是单例的,这意味着只创建一个 bean 实例,该实例在任何使用它的地方都可以重用。请参阅 Spring Framework 文档中的 Bean scopes。
-
@Jesper 感谢您提供此信息。但是为什么没有按照我的期望设置值。我知道我的例外很奇怪。但是spring框架的行为也是如此;)(因为它选择
Address的值而不是IntTest的值) -
请注意,由于它们是单例,所以只有一个
Address对象,address1和address2都引用同一个对象。你可以做address1.setCity("Sirsa");但address2.setCity("Sirsa2");行会覆盖它,因为它是同一个对象。同样只有一个IntTest对象。 -
由于 spring 在 spring 容器中创建了所有对象。它们首先在应用程序启动期间初始化。之后它将继续注入对象。默认情况下,对象是单例范围,因此它将是整个应用程序都一样,但这没关系。是的,你是对的,它只会像这样工作。
标签: spring