当前位置: 首页 > news >正文

柳州最新消息西安关键词seo

柳州最新消息,西安关键词seo,web前端工资怎么样,济南网站建设方案托管文章目录 一、背景二、AutowireCapableBeanFactory 方法 autowireBean 分析三、Spring 容器中 scope 为 prototype 类型 Bean 的回收机制四、总结 一、背景 最近做 DDD 实践时,遇到业务对象需要交给 Spring 管理才能做一些职责内事情。假设账号注册邮箱应用层代码流…

文章目录

        • 一、背景
        • 二、AutowireCapableBeanFactory 方法 autowireBean 分析
        • 三、Spring 容器中 scope 为 prototype 类型 Bean 的回收机制
        • 四、总结

一、背景

最近做 DDD 实践时,遇到业务对象需要交给 Spring 管理才能做一些职责内事情。假设账号注册邮箱应用层代码流程:

public void registerEmail(Long id) {Account account = accountRepository.findById(id);account.registerEmail();
}

其中业务对象 Account 表示账号聚合:

@Component
@Scope(value = BeanDefinition.SCOPE_PROTOTYPE)
public class Account {@Autowireprivate EmailService emailService;private String id;private String name;// 其他账号属性// 注册邮箱public void registerEmail() {//....emailService.register();}
}

负责 Account 的仓储服务 AccountRepository:

@Repository
public class AccountRepository {@Autowireprivate AutowireCapableBeanFactory beanFactory;public Account findById(Long id) {// 1. 从 DB 查询AccountDO accountDO = accountMapper.findById(id);// 2. 转换成业务对象Account account = convert(accountDO);// 3. 交给 Spring 管理beanFactory.autowireBean(account);return account;}
}

有个疑问:账号每次注册邮箱后,Account 实例对象即然交给 Spring 来管理,那么会不会常驻在内存而引发内存溢出呢?

二、AutowireCapableBeanFactory 方法 autowireBean 分析

在这里插入图片描述

直接看方法签名:

Populate the given bean instance through applying after-instantiation callbacks and bean property post-processing (e.g. for annotation-driven injection). (翻译:通过实例化后回调和 bean 属性后处理来填充指定 bean 实例)

Note: This is essentially intended for (re-)populating annotated fields and methods, either for new instances or for deserialized instances. It does not imply traditional by-name or by-type autowiring of properties;(翻译:无论是新实例还是反序列化实例,本质上是为了(重新)填充带注解的字段和方法。 它并不意味着传统的按名称或按类型自动装配属性。)

从翻译字面意思上:该方法作用只是对指定对象进行属性填充,尤其是使用注解标注的属性。 再深入到源码:

在这里插入图片描述

可以看出,只做了三件事情,创建 Spring 标准 Bean 对象,并创建 BeanWrapper,最后进行 Bean 属性填充,其中 populateBean 方法并不陌生,Spring Bean 进行属性填充的标准方法。上述源码中创建 existingBean 的 BeanDefinition 时,同时设置了属性为原型(BeanDefinition.SCOPE_PROTOTYPE),也即意味着 Spring 对 existingBean 的管理同原型 Bean 的方式一样(从这里也可以看出 Account 类标记的 @Component 和 @Scope 注解可以去除,笔者已验证)。

三、Spring 容器中 scope 为 prototype 类型 Bean 的回收机制

想要弄明白 Spring Bean 会不会被 JVM 正常回收,要看是否会被 Spring 容器持有,所以要从 Bean 创建流程入手。直接看org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean 方法(源码比较简单,不做深入分析,直接说结论)可知,如果 Bean 实例是 singleton 的,会从 DefaultSingletonBeanRegistry 的 singletonObjects 属性中获取,如果获取不到,就会创建 Bean 实例存放到 singletonObjects 属性中:

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {/** Logger available to subclasses */protected final Log logger = LogFactory.getLog(getClass());/** Cache of singleton objects: bean name --> bean instance */private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);//......}

DefaultListableBeanFactory 是 Spring IOC 容器的实现,归 Spring 容器管理,自然单例 Bean 也归 Spring 容器管理,所以说正常作用域为 singleton 的 Bean,其生命周期会长期被 Spring 容器管理,直到 Spring 容器被销毁。而作用域为 prototype 的 Bean 和正常 Java 对象一样 new 出来,使用完就会被 JVM 回收。

在这里插入图片描述

四、总结

通过 AutowireCapableBeanFactory 方法 autowireBean 可以将对象装配成 Spring 管理的标准 Bean 对象,主要是用于来填充有注解的属性,这样才可以使用 Spring 的 DI 特性。通过代码 new 出来的对象使用 AutowireCapableBeanFactory 方法 autowireBean 填充属性成为标准 Spring Bean 后不用担心内存溢出的问题,本质上和 Spring prototype Bean 的回收机制一样,使用完就有可能被 JVM 回收掉。

http://www.15wanjia.com/news/36775.html

相关文章:

  • 网站推广发票税率成都seo服务
  • 鲅鱼圈做网站网工资页多少钱一个月营销手段和营销方式
  • 电商网站建设电话关键词搜索排名查询
  • 网站空间ip是一个域名广告策划案优秀案例
  • 凡科网站怎么做友情链接店铺推广怎么做
  • 上海做网站优化哪家好如何写推广软文
  • 阿坝州网站制作保定seo网络推广
  • 什么样的网站可以做外链品牌词优化
  • 怎样才可以知道网站是否优化全网推广系统
  • 网站建设宣传psd站长工具排名分析
  • 在建立网站站点的过程中优化seo厂家
  • 今日头条网站推广怎么做重庆企业seo
  • 盘锦做网站选哪家好推广app的营销方案
  • 小学网站建设情况说明附近广告公司联系电话
  • 柳州学校网站建设网站推广的工作内容
  • 芜湖酒店网站建设网站域名注册查询
  • 自己做销售独立网站合肥seo网站排名
  • 中企动力营销平台合肥seo排名扣费
  • 旅游网站推荐91关键词
  • 江西医疗网站建设google关键词分析
  • 可以不花钱做网站吗互联网运营自学课程
  • 新网站改关键词南阳本地网络推广优化公司
  • wordpress 即将跳转seo发帖论坛
  • 网站起名字大全网站seo搜索
  • 网站建设计划方案万能引流软件
  • 佛山品牌网站建设网络营销步骤
  • 开发一个商城网站需要多少钱打广告
  • 怎样建自己的网站赚钱免费h5制作网站
  • 怎么做联盟网站企业网站seo服务
  • 页面紧急更新自动转跳直播网站推广优化教程