spring bean和类的new

简述

spring bean和jave new类的都是对java对象的创建、使用、销毁,本文主要讲述spring bean对比new类有那些改动而产生的优势

一.new对象会有那些问题

1.类的循环依赖

        由于类在实例化的时候会对类的成员变量进行默认赋值,当A类成员变量是另一个B类的时候,在进行成员变量默认复制的时候,就会去创建一个B类对象,但是B类对象的成员变量里有A类,那这样A类由于填充不了B类默认对象,B类填充不了A类对象,就会出现A,B两个类循环创建对方,但都创建不了

从错误日志中可以看到,A,B两个类在循环构造创建,导致出现StackOverFlowError一场,因为循环创建,导致线程内存溢出

2.默认属性值填充

比如在A类中有成员变量B类,当我成功初始化A类之后,A中的成员变量B对象值,只能是B对象的默认值,只有在获取A对象之后,setB()才能对B进行其他赋值

3.GC引起的问题

        当我们在用A  a = new A()的时候,会在堆区申请A对象的内存空间,当索引a的作用域消失之后,由于new A()这个对象的堆内存没有在被引用,就会被GC回收掉,如果我在多个方法中都需要使用A对象,那就会面临A对象的频繁创建和回收,于是我们可以创建一个静态索引指向A对象,也就是static A a = new A()这样就将索引设置为全局变量,不受作用域的影响,但是如果都将对象索引设置为静态索引,那堆区可能会溢出,所以我们可以将A对象设置为单例模式,全局只有一个A对象和一个静态索引a。

        另外还有一些对象是需要多例实例化的,比如request请求等,单例接口类,会导致对象线程安全问题,如果对对象加锁,会导致请求慢等问题

        所以我们要为每个对象应该是单例,还是多例,加锁,还是不加锁在编码阶段进行详细完整的考虑

4.AOP

当我们在很多个类的方法中需要执行同一段业务逻辑的时候,一种是我们自定义注解,另外一种是将这个业务逻辑抽象成一个工具方法,并一一卸载每个需要的方法中,这些代码有些时候并不是那么容易维护

二.spring bean的处理

1.解决循环依赖问题

        spring使用三级缓存解决循环依赖问题,spring三级缓存具体的实现原理会单独写一篇文章详细解释

2.解决默认属性填充问题

 实现InitializingBean接口中的afterPropertiesSet方法,这个方法会在spring bean基础属性注入后,去再执行一段自定义逻辑,这个逻辑就是我们对bean属性值的修改,相当于将jvm实例化对象之后,对对象成员变量的修改抽象出一个方法,加入spring bean初始化的过程中

3.划分spring bean的作用域

再spring实例化bean的过程中,无法将类修改为单例模式,但是可以通过工程学的业务处理实现类似类的单例模式的场景,比如默认的单例模式,我们将单例bean放到一个concurrenthashmap类型的单例池中,key是bean的名字,v是bean,这样我们在根据bean名字获取bean的时候就可以只能获取同一个bean,这样就实现了业务上的单例,spring的单例模式和jvm的单例模式是不一样的,jvm的单例是保证在jvm内存中只能存在一个根据java.lang.class映射出来的对象,而spring的单例是保证在整个spring容器内同名bean指向同一个对象,属于对bean的管理上的一种模式

4.对AOP的自动处理

当我们将bean实例化并且注入属性后,spring会自动去关联AOP注解,并实现注解功能,这也是spring工程学的内容,

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伤何123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值