把类改为springboot注入后引发了什么有趣的现象?
|
@Component
public class CompanyManager {
List<CompanyAbstract> companyIterms = new ArrayList<>();
public CompanyManager setCompanyManager() {
User user = new User("1", "琳琳");
user.setIndex("1");
Body body = new Body("2", "180", "110");
body.setIndex("2");
Address address = new Address("3", "开发区");
companyIterms.add(user);
companyIterms.add(body);
companyIterms.add(address);
return this;
}
}
@Service
public class CompanyServiceImpl {
private CompanyManager setCompanyManager() {
return new CompanyManager().setCompanyManager();
}
}
输出结果
: size:3
: data:User(userId=1, name=琳琳)
: data:Body(id=2, weight=180, height=110)
: data:Address(id=3, addres=开发区)
改造前
改造后
将setCompanyManager()方法中获取CompanyManager改成如下方式
@Service
public class CompanyServiceImpl {
@Resource
private CompanyManager userManager;
// 使用spring容器管理
public CompanyManager setCompanyManager() {
return userManager.setCompanyManager();
}
}
输出结果:
: size:3
: data:User(userId=1, name=琳琳)
: data:Body(id=2, weight=180, height=110)
: data:Address(id=3, addres=开发区)
: size:6
: data:User(userId=1, name=琳琳)
: data:Body(id=2, weight=180, height=110)
: data:Address(id=3, addres=开发区)
: data:User(userId=1, name=琳琳)
: data:Body(id=2, weight=180, height=110)
: data:Address(id=3, addres=开发区)
结论:改造后size就变成6了且数据也重复了。
|
最初setCompanyManager()使用new来得到companyIterms数据,因为new关键字每次执行一次都要开辟一个新的内存空间。jvm 规定遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初
始化,则需要先触发其初始化。所以原来的写法不管调用多少次数据都不会重复。
|
参考:本文关于jvm知识参考《深入理解虚拟机》中文版