Spring文档笔记
May 29, 2019
Ioc容器
ApplicationContext
是BeanFactory
的子接口,更好的与spring
的aop
集成,消息资源处理(用于国际化),事件发布,特定的context
,like WebApplicationContext for use in web applications.GenericApplicationContext
可以用来加载多种方式的配置,然后调用refresh
- 在
Ioc
容器中,bean
的定义被表示为BeanDefinition
,包括但不限于
1,包限定类名,一般是实现类。
2,bean
的行为配置,例如生命周期,作用域,回调等
3,所需要的其他bean
的引用
4,创建bean
的其他配置,例如对象池大小,连接等 - 可以使用
getBeanFactory::registerSingleton
动态注册bean
,甚至可以覆盖已有的bean
以及配置,但是很不推荐。 id
和name
都要去在容器中唯一,不同的是前者只能设置一个,后者可以多个;- 初始化
bean
有默认的构造方法,静态工厂,和工厂方法三种 - 依赖注入分为构造函数注入和set注入
- 构造函数注入时候,如果要使用
name
,要么使用debug,不然要在构造函数上加上@ConstructorProperties
注解,因为java形参编译后不会保留; - 推荐使用构造方法注入,1,有助于保持
immutable
;2,防止依赖项为null
;3 会返回完整初始化的对象。 - set注入应该仅用于类中可选在依赖注入,还有方便重新注入。
ApplicationContext
会预先实例化单例的bean
而不是到使用的时候,为了让错误的配置信息尽早出现。可以配置这种行为。- 推荐使用123<property name="targetName"><idref bean="theTargetBean"/></property>
而不是<property name="targetName" value="theTargetBean"/>
,第一种会去校验bean
是否存在,防止第二张名字写错了,运行时候才出现。
- 使用
<ref parent="accountService"/>
引用父容器中的bean
- 使用
<props merge="true">
可以合并父,子bean
的属性内容; - 使用
depends-on
配置bean
的依赖项; - 使用
lazy-init
延迟初始化,<beans default-lazy-init="true">
容器层级延迟初始化; - 可以通过各种方式关闭自动注入。
<bean autowire-candidate="false">
禁止自动注入,或者<beans default-autowire-candidates="*xxxx"
模式匹配禁止注入,但是不会阻止这些bean
的自动装配时候的自动注入其他bean
;- 实现
ApplicationContextAware
获取ApplicationContext
对象,进而做一些getBean
之类的操作; <lookup-method
可以解决单例bean
中含有非单例bean
无法更新问题。还可以使用ServiceLocatorFactoryBean
这个类来实现类似的功能,<replaced-method
实现任意方法的替换,本质还是aop
。singleton
用在无状态的bean
,prototype
用在有状态的bean
;prototype
的bean
的destruction
生命周期方法不会被调用。<aop:scoped-proxy
用在短生命周期bean
注入长生命周期bean
时候,可以获得短生命周期bean
的更新。Spring中的多例往单例里注入的方法InitializingBean
和DisposableBean
接口提供bean
生命周期的回调,但是不推荐直接使用,可以使用@PostConstruct
或者在xml
中<init-methond>
或者统一的<default-init-method>
和@PreDestroy
或在xml
中<destroy-method>
或者统一的<defaule-destory-method>
- 有些实现了
AutoCloseable
或者Closeable
等接口的bean
,自动调用其方法。 SmartLifecycle
可以监听整个容器的生命周期;Spring SmartLifecycle 在容器所有bean加载和初始化完毕执行- 直接在idea中点击停止是无法回调销毁方法;研究优雅停机时的一点思考
- 使用
<parent
作为bean
的模板,减少重复代码,类似继承,parent
的bean
一定要注明abstract
,否则spring
预初始化单例bean
时候会有问题。parent
的bean
可以表明class
也可以不表明; BeanFactoryPostProcessor
是自定义配置Bean
的元数据,BeanPostProcessor
是自定义配置bean
的。例如一个BeanFactoryPostProcessor
的实现PropertyPlaceholderConfigurer
就是把xml
中定义的${}
替换成在.properties
中定义的真实属性。- 使用
FactoryBean
可以自定义bean
的创建。使用getBean("&xx")
可以获得FactoryBean
自身实例,否则默认是返回FactoryBean
创建的bean
;是一种更加灵活创建bean
的方式。 <context:annotation-config/>
是隐式的注入了一些BeanPostProcessor
,类似AutowiredAnnotationBeanPostProcessor
Autowired
这类注入注解是由BeanPostProcessor
实现,因为无法在自定义的BeanPostProcessor
中使用,可以使用XML
的方式。@Autowired
是按照类型注入,是spring
的注解。@Resource
是按照name注入,找不到再按照类型注入,是jdk
提供的。@Primary
和@Qualifier("main")
来指定需要注入的bean
。- 还可以使用
@Qualifier
自定义注入注解; - 加了
<context:component-scan>
就不用再加<context:annotation-config>
,前者已经隐式开启了。 - 使用
includeFilters
和excludeFilters
去控制ComponentScan
扫码范围和条件; - 可以使用
InjectionPoint
或者DependencyDescriptor
来获取注入点的信息,一般用在@Scope("prototype")
; - 使用
BeanNameGenerator
接口自定义bean
名称的生成规则 @bean
在@Configuration
和@Component
是有些不一样的,简单说带有@Configuration
的是被spring
代理增强的类,里面带有@bean
调用其他带有@bean
的方法,会返回和容器中同样的实例。Spring @Configuration 和 @Component 区别- 使用
ImportResource
将xml
配置的bean
到@Configuration
中使用。 - 使用
@Profile
区分不同的环境,使用不同的配置,bean 或者方法。 - 使用
spring.profiles.active
指定使用的环境 - 使用
spring.profiles.default
指定缺省的环境; System.getProperties()
获取系统 jvm 配置System.getenv()
获取当前系统配置@PropertySource
指定配置文件- 在配置类上使用
@EnableLoadTimeWeaving
开启动态转换类?
- 使用
https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#context-introduction