1.springioc循环依赖
如果主要使用构造函数注入,则可能会创建无法解决的循环依赖方案。
例如:A类通过构造函数注入需要B类的实例,而B类通过构造函数注入需要A类的实例。如果您将A类和B类的bean配置为相互注入,则Spring IoC容器会在运行时检测到此循环引用,并抛出 BeanCurrentlyInCreationException。
一种可能的解决方案是编辑某些类的源代码,这些类的源代码由设置者而不是构造函数来配置。或者,避免构造函数注入,而仅使用setter注入。换句话说,尽管不建议这样做,但是您可以使用setter注入配置循环依赖关系。
与典型情况(没有循环依赖项)不同,bean A和bean B之间的循环依赖关系迫使其中一个bean在完全初始化之前被注入另一个bean(经典的“养鸡和鸡蛋”场景)。
2.ApplicationContext默认情况下,实现会实例化单例bean。
3.第一种形式优于第二种形式,因为使用idref标记可以使容器在部署时验证所引用的命名Bean实际上是否存在。在第二个变体中,不对传递给bean targetName属性的值进行验证client。拼写错误仅在client实际实例化bean 时才发现(可能会导致致命的结果)。如果该client bean是原型 bean,则只能在部署容器后很长时间才能发现此错字和所产生的异常。
<bean id="theTargetBean" class="..."/>
<bean id="theClientBean" class="...">
<property name="targetName">
<idref bean="theTargetBean"/>
</property>
</bean>
<bean id="theTargetBean" class="..." />
<bean id="client" class="...">
<property name="targetName" value="theTargetBean"/>
</bean>
4.内部bean定义不需要定义的ID或名称。如果指定,则容器不使用该值作为标识符。容器还会忽略scope创建时的标志,因为内部Bean始终是匿名的,并且始终与外部Bean一起创建。不可能独立地访问内部bean或将其注入到协作bean中而不是封装到封闭bean中。
5.注意,在bean定义的merge=true属性的元素 上使用了属性。当bean解析并由容器实例化时,结果实例具有一个集合,该集合包含将子项的集合与父项的集合合并的结果 。
6.bean的作用域,默认为单例
名称 | 描述 |
---|---|
singleton | (默认)将每个Spring IoC容器的单个bean定义范围限定为单个对象实例。 |
prototype | 将单个bean定义的作用域限定为任意数量的对象实例。 |
request | 将单个bean定义的范围限定为单个HTTP请求的生命周期。也就是说,每个HTTP请求都有一个在单个bean定义后面创建的bean实例。仅在可感知网络的Spring上下文中有效ApplicationContext。 |
session | 将单个bean定义的范围限定为HTTP的生命周期Session。仅在可感知网络的Spring上下文中有效ApplicationContext。 |
application | 将单个bean定义的作用域限定为的生命周期ServletContext。仅在可感知网络的Spring上下文中有效ApplicationContext。 |
websocket | 将单个bean定义的作用域限定为的生命周期WebSocket。仅在可感知网络的Spring上下文中有效ApplicationContext。 |
7.当单例bean依赖注入原型bean时,每次调用单例bean所引用的原型bean为同一个bean。该注入仅发生一次。如果在运行时不止一次需要原型bean的新实例,请参见方法注入(通过applicationContext的getBean方法获取)。