在上面的学习中,不止一次提到了,如果实现的依赖有多个,那么该怎么来指定需要的依赖。就比如国王依赖将军,将军有多个,该怎么来进行配置,来得到指定将军,这是本节要学习的。
回到国王将军的例子,假设有两个将军,一个国王类,国王类依赖将军,如下:
假设我这里要指定GenealA进行注入,配置如下:
这里通过给GeneralA添加注解@Primary来告知spring在对国王类进行注入的时候在两个将军类中首选GeneralA类。这是基于自动装载的情况,如果使用XML的配置方式,则可以通过以下方式实现:
除此之外,还可以通过注解@Qualifier在自动注入或者在Java配置类中进行设置指定的bean进行加载。以下使用自动装配时的设置方式:
注解里面的参数是指定的bean的ID(基于自动装配,设置@Component之后,生成的ID默认为类的后字母小写)
下面是Java配置类的方式:
以上就是关于spring如何处理多个依赖的方式。
bean的作用域
在默认的情况下,spring生成的bean是单例的,每次注入bean实际上是第一次就创建好的,并不会进行多次创建。这样做的好处是减少内存的占用、有利于JVM的垃圾回收。但是单例模式不是通用的,在某些场景下单例模式并不适用,比如说对于用户来说,每个用户注入的信息是不一样的,如果使用单例bean,很容易造成混乱,出现一些未知、安全的问题。
针对这个问题,spring也提供了不是单例bean的实现方式,spring目前支四种范围的bean定义创建,分别是:
单例(Singleton):默认的方式,整个个应用中只创建一个bean
原型(Prototype):每次使用springContext上下文进行加载和注入的时候,创建一个bean(spring中可能存在多个上下文,有些场景可能存在针对与不同的模块可使用不同的上下文)
会话:(Session):在基于Web的应用中,为每一个session实例化一个bean
请求(Request):基于Web的应用中,为每一次的请求都实例化一次bean
设置作用域的方法时通过设置Scope参数,在基于注解的配置方法中设置为;
通过添加@Scope注解,并设置相应的作用于范围。基于Java配置类的也是同样设置方式:
基于XML的配置方式;
这里我们单独讲一下基于Session和Request作用域的bean,这两种作用在对于Web的应用中有很大的作用,因为基于Web的应用基本都是面向用户的,区别于不同用户要用不同的bean,就比如说购物车,首先不可能是单例,不然每个用户的购物车都是同一个,然后他也不可能是request的,不然你第一次购物车添加物品后,再次访问打开时,会发现购物车空了,因为request默认创建了一个新的购物车实例,所以针对于购物车来说,应该是一个session作用域的bean。