为什么一般实体类不用Spring注入呢?
- 这个是要综合考虑的问题。就拿我们在工作中的很常见的例子来说:我们会将 controller、service、dao 中的 class 交由 spring 管理并注入,是因为一般情况下在整个程序运行周期内,这些 class 只会被实例化一次,这恰好能和 spring 中的 singleton scope 相吻合。但是我们几乎很少将 entity 中的 class 交由 spring 管理,因为我们无法确定这些 class 对应的 bean 的生命周期。所以其实归结一句话:考虑是否将一个 class 交由 spring 管理,关键看这个 class 产生的 bean 是否符合 spring 提供的 scope 的生命周期规则。
- 要理解为什么不用注入,首先就清楚注入的目的是什么?如果不注入,在程序中要使用某个类对象的方法,则需要去 new 一个对象。然后我们调用其中的方法,众所周知“程序=算法+数据”。不失一般性,在面向对象开发中,类一般有两种,一种是功能类的,主要是完成一些业务操作。一种是数据类,主要是存储数据,比如 POJO。我们数据提交上来后,自己组装 PO(当然也有的框架可以帮我们组装好),然后调用功能类的方法去操作这些数据,完成相应功能。如果没有使用注入的方式注入这些功能类对象,则会有空指针的问题。
- 首先要明确 service 和 entity 的职责,对于 service 是功能的载体,类里有你自己写的大量方法,这些方法可复用。对于 entity 就只是数据的载体,类中最重要的就是各种字段了,这些字段只有在给它附值的情况才具有价值,所以不可复用。而 spring 为我们初始化实例(默认单例),new 了一次后处处使用。回到你的问题,service 中的方法无状态,可复用,所以一个程序员就一个对象就 ok,但是对于实体类,他是有有状态的,你全局使用一个对象的时候,处处都在修改里面的值,这是不合理的。所以实体类没必要注入。
- 总结:
- 1、实体类需要附上对应的数据才有意义;
- 2、由 spring 管理并注入的类是可大量重复使用的;
- 3、一个实体类可对应多条数据,如果实例化该类,则需要针对所有的数据实例化,这是不可能的,导致程序更加臃肿,还不如需要的时候再实例化。
实验环境配置
Python 3.7
PyTorch 安装 conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorch
MMCV 安装 pip install mmcv-full==1.5.1 -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.11.0/index.html
mmsegmentation 安装 pip install mmsegmentation==0.24.1
mmcls 安装 pip install mmcls==0.23.0
ever-beta 安装 pip install ever-beta==0.2.3
timm 安装 pip install timm
simplecv 安装 pip install --upgrade git+https://github.com/Z-Zheng/SimpleCV.git
markdown 中引用文件
以引用同一个文件中的二级标题为例:[取的名字](##二级标题)
如何引用不同文件的标题呢?:[取得名字](/CodeNotes/Python%E7%B3%BB%E5%88%97/Flask%E5%B1%80%E5%9F%9F%E7%BD%91.html##HelloWorld)