场景应用:什么样的类适合注入SpringBean?

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了场景应用:什么样的类适合注入SpringBean?相关的知识,希望对你有一定的参考价值。

文章目录

什么样的类适合注入SpringBean?

为什么要注入成SpringBean

不得不说,这是一个有价值,并且也曾一度困惑我的问题。我也曾经一度怀疑,注入的目的是什么,为什么要注入,这样的问题。

首先,你需要先问这样一个问题:Spring 实现了什么,解决了什么问题?众所周知,Spring 做的两个事情:IOC,AOP。

这两个特性里面,其实就是两个事; 如果A类有成员变量B类,B有成员变量C类。就是A依赖B,B依赖C。

实际上,就是A依赖BCD,D依赖EFGH…更复杂的依赖。如果全部成员变量都需要自己手动去new的话,管理依赖实在太复杂。所以,把ABCDEFGH…这些组件全部交由Spring管理,然后用依赖注入。

就省了自己new对象的这些过程。AOP,AOP其实只是一个特性。

我觉得,总体来讲就是,对象交由Spring管理的话,因为对象由Spring的动态代理。从而可以做相应的增强

AOP只是其中一个,其余还包括,注解Spring缓存,Spring的事物,甚至是监听器等等。Spring都有其便利的实现方式。但是实现的前提就是,注册为Spring的组件。也就是Service,Controller这些。我觉得这两个,就是把Bean交由Spring管理,使用时再注入的主要原因。

有哪些类需要注入,哪些类不需要呢?

再回到最原始的问题:有哪些类需要注入,哪些类不需要呢?

假如,一个对象需要依赖Spring的其他依赖,或者Spring的特性,包括但不限于 AOP,事务,缓存等。甚至,如果你要读取Spring等配置文件里的内容,也需要将其交由Spring管理。在我来看其他情况,就没有必要交由Spring管理。

再举个需要交由Spring管理的例子:比如,我要在本地上传一个文件,需要一个文件路径,然而我的路径配置信息存放在配置文件中,这时该属性通过 @Value 注解从配置文件获取。这种情况,就需要将Consts(常量类)注册为Bean。然后通过 @Autowired注入。

我们要再弄明白另一个问题

为什么Spring中实体类为什么不需要注册成bean?

要理解为什么不用注入,首先就清楚注入的目的是什么?

如果不注入,在程序中要使用某个类对象的方法,则需要去new一个对象。然后我们调用其中的方法进行业务处理。

不失一般性,在面向对象开发中,类一般有两种

  • 一种是功能类的,主要是完成一些业务操作。
  • 一种是数据类,主要是存储数据,比如POJO、DTO。

我们数据提交上来后,自己组装POJO(当然也有的框架可以帮我们组装好),然后调用功能类的方法去操作这些数据,完成相应功能。如果没有使用注入的方式注入这些功能类对象,则会有空指针的问题。

spring只需要注入需要注入的,有些实体业务上是从其它地方获得的,何必spring注入?
比如你说的例子一看就知道ssh框架,其中user实例应该是用户录入的,从页面表单传来的,是struts2帮你注入的。

UserService是个工具类,你需要获取(也就是new)他的对象实例才能调用类内部的方法。

而User只是个POJO,是个存放数据的载体,并不需要获取(也就是new)他的对象实例,而是从外面传进来的。

所以UserService需要new一个,而User并不需。

而Spring的注入机制其实就是代替了new的这个过程(称为解耦),所以UserService需要注入,而User并不需要注入。

以上是关于场景应用:什么样的类适合注入SpringBean?的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot脚手架项目002-004.Spring IOC_权限管理系统_Spring:什么是IOCSpring Bean注入SpringBean的注解bean的加载流程

什么依赖策略适合这个小应用

装配SpringBean--依赖注入

JAVA WEB 过滤器(Filter)中向容器 Spring 注入 bean

使用spring后,哪些类该用实例注入(DI),哪些类该用new来创建实例?

SpringBean注入方试