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,类似AutowiredAnnotationBeanPostProcessorAutowired这类注入注解是由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