读Spring官方文档的简单笔记(长期更新)

这篇博客记录了作者阅读Spring官方文档的笔记,涵盖了Spring IoC容器、Bean、依赖注入等方面。讲解了BeanFactory和ApplicationContext接口,以及不同类型的Bean Scopes。还介绍了依赖注入的原理和不同方式,包括构造器注入和setter注入,以及静态工厂方法和非静态工厂方法的使用。此外,文章提到了静态内部类、集合注入和依赖关系的管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读Spring官方文档的简单笔记

只是记述一些自己觉得重要的一些点,并不会全部翻译出来,那太费时间了。

文档地址:
https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html

版本:
Version 5.1.3.RELEASE

2019.1.5

1.1. Introduction to the Spring IoC Container and Beans & 1.2. Container Overview

1.org.springframework.beans和org.springframework.context包是Spring IoC容器的基础。
2.BeanFactory接口提供了Ioc容器的配置机制,ApplicationContext是它的子接口,提供了更多企业级功能。
3.Beans及其依赖关系体现于配置元数据中,这些元数据可以是XML文件,Java注解,或者Java代码,还有Groovy配置文件。
4.Spring框架提供的常用ApplicationContext接口实现类: ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,
GenericGroovyApplicationContext等。
5.可以通过与XmlBeanDefinitionReader这样的Reader(装饰器模式?)来完成多种类型配置元数据的读取。

1.3. Bean Overview

6.applicationContext容器不只可以管理配置元数据中的beans,还可以通过DefaultListableBeanFactory 注册外部创建的bean。
7.bean的name属性类似别名。
8.如果想配置内部类,必须使用这样的class属性:com.example.SomeThing$OtherThing。
9.Spring不只可以实例化JavaBean类型的类,实际上,它可以通过构造函数实例化任何java的普通类。
10.可以通过下面这样的配置来代用静态工厂方法(工厂方法模式?)产生实例。

<bean id="clientService"
    class="examples.ClientService"
    factory-method="createInstance"/>

一个饿汉式单例。

public class ClientService {
    private static ClientService clientService = new ClientService();
    private ClientService() {}

    public static ClientService createInstance() {
        return clientService;
    }
}

11.如果是非静态的工厂方法,则需要像下面这样指定工厂实例:

<!-- the factory bean, which contains a method called createInstance() -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
    <!-- inject any dependencies required by this locator bean -->
</bean>

<!-- the bean to be created via the factory bean -->
<bean id="clientService"
    factory-bean="serviceLocator"
    factory-method="createClientServiceInstance"/>

2019.1.6/1.11

1.4. Dependencies

1.Spring对于控制反转(IoC)的解释:先获取到对象后,再将依赖注入(DI)进去,这一过程是通常bean实例化过程的反转。对象不知道它依赖的是谁,这样更容易去耦合。同时依赖于接口或抽象基类也更易于测试(stub or mock)。
2.依赖注入主要有两种:基于构造方法的依赖注入(工厂方法类似),和基于setter方法的依赖注入。基于构造方法注入时的属性type,index,name都是可省的,但使用它们可以避免不确定性。通常用构造方法注入必须的依赖项,setter方法来注入可选的依赖项。由于setter方法重新配置和重新注入,所以通过JMX Mbean来管理是一个引人入胜的用例。
3.单例(默认)的bean将在创建容器的时候实例化,而其他scope的bean将在被需要时才实例化。我们可以覆盖这一默认行为,使单例延迟实例化。
4.依赖项间的解析不匹配可能会在第一次创建受影响的bean时才发现。
5.不要在构造方法注入中循环(互相)依赖,那将造成一个先有鸡还是先有蛋的问题,在运行时抛出BeanCurrentlyInCreationException。可以将其中一个或全部依赖项使用setter方法注入代替。
6.静态工厂方法注入与基于构造函数注入基本是相同的,只是需要指定factory-method属性。而非静态工厂方法则也类似,只是需要指定factory-bean属性,而非class。

7.静态内部类和一般的类注入差不多,但非静态内部类则需要指定一个指向外部类的默认构造方法参数。XML中的Inner Bean可以很方便的实现。
8.可以对于集合注入和合并。可以注入空字符串和空指针。
9.元素中可以使用p-namespace,使用起来很简洁,示例如下:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean name="john-classic" class="com.example.Person">
        <property name="name" value="John Doe"/>
        <property name="spouse" ref="jane"/>
    </bean>

    <bean name="john-modern"
        class="com.example.Person"
        p:name="John Doe"
        p:spouse-ref="jane"/>

    <bean name="jane" class="com.example.Person">
        <property name="name" value="Jane Doe"/>
    </bean>
</beans>

注意p:spouse-ref可能与以Ref结尾的类属性混淆。
类似,也可以使用元素属性c-namespace来替代内嵌元素constructor-arg使用。
虽然需要声明XSD schema,但它们其实没定义在其中,而是定义在了Spring core中。
如果无法获取参数名(通常是编译出的字节码没有debug信息,可由编译器参数控制),则可以使用参数索引:

<!-- c-namespace index declaration -->
<bean id="thingOne" class="x.y.ThingOne" c:_0-ref="thingTwo" c:_1-ref="thingThree"/>

10.可以直接对嵌套的属性注入值,需注意fred和bob属性不能为null:

<bean id="something" class="things.ThingOne">
    <property name="fred.bob.sammy" value="123" />
</bean>

11.如果有一些不太明显的依赖关系Spring无法判断出来,则需要我们自己通过depends-on属性来指明:

<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao">
    <property name="manager" ref="manager" />
</bean>

<bean id="manager" class="ManagerBean" />
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />

详见下面的例子:
pring中depends-on的作用是什么?
12.容器中的单例bean是在创建容器时就实例化的,叫做pre-instantiated,如果想延迟实例化,则可以使用lazy-init="true"属性。需要注意,如果懒初始化beanA的被没声明为懒初始化的beanB依赖,则A仍然会在一开始就实例化。
可以在容器级别声明默认懒初始化:

<beans default-lazy-init="true">
    <!-- no beans will be pre-instantiated... -->
</beans>

13.自动装配的优点:

  • 显著地减少属性和构造方法参数的配置;
  • 可以随着代码的变化自动更改配置,这在开发时期尤其有用;

自动装配的缺点:

  • 自动装配会被显式装配覆盖;无法自动装配基本属性(primitives, Strings, and Classes);
  • 自动装配会降低清晰度,使得对象间的关系不再明显;
  • Spring容器的工具可能会无法获取装配信息来产生文档;

当使用byType模式时,可能会由于存在两个以上匹配类型而抛出异常,这时可以用autowire-candidate="false"或primary="true"来避免模糊性。详见Spring9:Autowire(自动装配)机制
也可以使用default-autowire-candidates来限制自动装配。详见关于Spring,default-autowire-candidates属性的作用验证

1.4.6方法注入一节暂时跳过

2019.1.12

1.5 Bean Scopes

1.虽然初始化回调方法在任何生命周期情况下都会执行,但原型(prototype)Bean的销毁回调方法却不会执行。
2.如果单例Bean A依赖原型Bean B,B只在初始化A时注入。如果想使A反复地获取到新的B,参见1.4.6方法注入。
3.Request、Session、 Application、WebSocket Scopes必须在web-aware的Spring ApplicationContext实现中使用(比如XmlWebApplicationContext)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值