Spring in Action读书笔记(三)——容器和依赖注入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BuquTianya/article/details/79648070

容器

java程序员都知道IOC和AOP是Spring的两大核心概念。IOC是控制反转,也就是通过注入的方式把原本由类自己完成的内部依赖对象实例化这个行为转交给Spring的容器去完成。

IOC之后的一个很大的好处就是:代码里消除了无处不在的new关键字创建对象实例,只定义一个接口的引用,从而做到了面向接口以及隔离实现,也就做到了类和类之间的解耦合。

在注入这一点上,Spring提供了注解、JavaConfig、XML多种配置方式。而且,条件注入、属性检查、选择限定符等也让Spring的注入用起来十分的灵活、便利。

IOC之后,绝大多数的对象都交给Spring的容器统一管理,统一管理有他的优势:1.实例的生命周期可控维度更多,比如可以在对象实例化前、属性注入前、属性注入后、容器销毁前执行一些特别的逻辑。2.实例的作用域可控性变大了,比如可以设置成单例类型、原型类型、请求范围、会话范围。

依赖注入

对于Spring提供的三种注入方式,原则上首选注解方式,其次javaConfig方式,再次xml方式。虽然,现在为止项目里(尤其是一些老项目)、网络的教程里,铺天盖地的多是xml注入方式。但是xml方式有他天然的缺陷,就是不能做到编译器的检查,经常会出现开发启动时发现某个地方写的不对,报错找不到某个类,或者报错找不到某个实例。

虽然注解方式是首选,但是绝大多数情况,不可能只通过注解完成一个项目里边所有内容的注入和配置,比如某个自定义类依赖于第三方jar里边的类实例,这时候就没有办法给第三方jar里的类加上@Service、或者@Component、或者@bean等。所以就无法获得一个第三方类的实例。

也就是说大多时候注解方式必然配合javaConfig方式或者xml方式,共同完成一个项目的依赖注入和配置。

javaConfig方式在写单元测试用例的时候特别方便,不需要给项目增加多余的xml配置文件,完全可以在自己的测试类里边完成所有的依赖配置以及数据初始化、测试逻辑等全套的工作。所有需要的东西都在一起,给作者的感觉是无与伦比的舒畅。

另外,在Spring4之后,可以说99%以上的配置和注入需求都可以用javaConfig完成,如果有机会请多尝试javaConfig的配置方式。

生命周期

有没有迷糊过,为什么同样的是初始化,为什么这里用的是@PostConstruct、那里用的是afterPropertiesSet、还有那里用的是init_method,他们有什么区别么?有什么先后顺序么?

其实他们都是Spring实例生命周期的一个节点,他们之间是平级的,但是有先后顺序。既然有先后顺序,如果执行类似的操作,那么后执行的就会覆盖先执行的结果。

以下是摘自知乎的一张生命周期图:

这里写图片描述

上述三者之间的顺序是:@PostConstruct ->afterPropertiesSet -> init_method

作用域

Spring的容器管理了项目的对象实例,同时赋予了对象4种不同的作用域,分别是:单例类型、原型类型、请求范围、会话范围。这里的作用域和java语言里的作用域或者是servlet里边的作用域稍微有些区别。

单例类型是整个项目里只存在一个实例,所有引用该类型的地方引用的都是相同的对象实例,Spring默认情况下所有的对象都是单例类型。使用spring的时候这一点需要特别注意,一定不要在类中定义会被方法改变值得全局属性。如果,一定要定义,就需要确定不会出现并发访问题,不会由于多线程并发访问带来数据错误(比如得到的不是我想要的值),或者并发访问异常(比如ConcurrentModificationException),或者累计值比实际目标值小等情况。这一点和struts不同,struts是所有的对象都是每次用到就会创建。

原型类型是每一次注入都会注入一个新创建的对象,也就是任何用到该对象的地方基本都是不同的对象。

请求范围和会话范围两个作用域一般用的十分少,可以说基本不会用到吧。请求范围是在一次请求中使用同一个对象实例,下一次请求就会创建一个新的对象实例。会话范围比请求范围大,多次请求只要在同一个session中,那么使用的是同一个对象实例,当另一个会话开启时,会创建一个新的对象实例。

猜你喜欢

转载自blog.csdn.net/BuquTianya/article/details/79648070