bean的范围
bean的实例化和依赖注入不同方式的优劣
实例化
无参构造
静态工厂
实例化工厂
依赖注入
构造方法
可以让您将应用程序组件实现为不可变对象,并确保所需的依赖项不是null。此外,注入构造函数的组件始终以完全初始化的状态返回到 Client 端(调用)代码。
使用构造器注入的缺点是,当我们构造器需要注入的对象比较多时,会显得我们的构造器,冗余,不美观,可读性差,也不易维护。
setter
Setter 注入主要应仅用于可以在类中分配合理的默认值的可选依赖项。否则,必须在代码使用依赖项的任何地方执行非空检查。 setter 注入的一个好处是,setter 方法使该类的对象在以后可以重新配置或重新注入。
当我们选择setter方法来注入的时候,我们不能将对象设为final的;
p命名空间
循环依赖
B 依赖 C C 依赖 A A 依赖 B
这种情况下,Spring将产生异常BeanCurrentlyInCreationException。
一些地方后续用到再写
多个bean的创建顺序
在创建容器时,Spring 容器会验证每个 bean 的配置。但是,在实际创建 Bean 之前,不会设置 Bean 属性本身。创建容器时,将创建具有单例作用域并设置为预先实例化(默认)的 Bean。范围在Bean Scopes中定义。否则,仅在请求时才创建 Bean。创建和分配 bean 的依赖关系及其依赖关系(依此类推)时,创建 bean 可能会导致创建一个 bean 图。请注意,这些依赖项之间的分辨率不匹配可能会在后期出现,即在第一次创建受影响的 bean 时。
bean的属性
Inner Beans
Collections
ref
工厂
懒初始化
延迟singleton bean 的加载
<bean id="lazy" class="com.something.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.something.AnotherBean"/>
自动装配
byName
byTyepe
但是不建议使用,可能会因为类型或名称相同出错
bean的继承
<bean id="inheritedTestBeanWithoutClass" abstract="true">
<property name="name" value="parent"/>
<property name="age" value="1"/>
</bean>
<bean id="inheritsWithClass" class="org.springframework.beans.DerivedTestBean"
parent="inheritedTestBeanWithoutClass" init-method="initialize">
<property name="name" value="override"/>
<!-- age will inherit the value of 1 from the parent bean definition-->
</bean>
ApplicationContext默认情况下预先实例化所有单例。因此,重要的是(至少对于单例 bean),如果您有一个(父)bean 定义仅打算用作模板,并且此定义指定了一个类,则必须确保设置* abstract 属性为 true *,否则应用程序上下文将实际(尝试)预先实例化abstract bean。
集装箱延伸点
通常,应用程序开发人员不需要将ApplicationContext实现类作为子类。相反,可以通过插入特殊集成接口的实现来扩展 Spring IoC 容器。接下来的几节描述了这些集成接口。
使用 BeanPostProcessor 自定义 Bean
使用 BeanFactoryPostProcessor 自定义配置元数据
使用 FactoryBean 自定义实例化逻辑
基于注解配置
注意:使用注解开发时,需要配置组件扫描,作用是指定哪个包及其子包下的bean需要扫描。
在实际开发中常使用BeanPostProcessor 自定义 Bean 配和注解