把类改为springboot注入后引发了什么有趣的现象?

把类改为springboot注入后引发了什么有趣的现象?


前言
    最近改造一个老项目,把它改成springboot的方式,其中发现一个类使用new的方式来获得类对象于是就把它改成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了且数据也重复了。

为什么size变成6了?

    最初setCompanyManager()使用new来得到companyIterms数据,因为new关键字每次执行一次都要开辟一个新的内存空间。jvm 规定遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初
始化,则需要先触发其初始化。所以原来的写法不管调用多少次数据都不会重复。

为什么用springboot方式来获取companyIterms数据时有重复呢?
    因为springboot使用spring容器来管理类,在项目启动时就已经将类注入到容器中。只实例化一次,也只初始化一次,当多次访问setCompanyManager()方法时,又添加了数据3条,加上原来的3条数据所以就变成6条数据从而导致数据重复。


参考:本文关于jvm知识参考《深入理解虚拟机》中文版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值