Ioc容器

  • ApplicationContextBeanFactory的子接口,更好的与springaop集成,消息资源处理(用于国际化),事件发布,特定的context,like WebApplicationContext for use in web applications.
  • GenericApplicationContext可以用来加载多种方式的配置,然后调用refresh
  • Ioc容器中,bean的定义被表示为BeanDefinition,包括但不限于
    1,包限定类名,一般是实现类。
    2,bean的行为配置,例如生命周期,作用域,回调等
    3,所需要的其他bean的引用
    4,创建bean的其他配置,例如对象池大小,连接等
  • 可以使用getBeanFactory::registerSingleton动态注册bean,甚至可以覆盖已有的bean以及配置,但是很不推荐。
  • idname都要去在容器中唯一,不同的是前者只能设置一个,后者可以多个;
  • 初始化bean有默认的构造方法,静态工厂,和工厂方法三种
  • 依赖注入分为构造函数注入和set注入
  • 构造函数注入时候,如果要使用name,要么使用debug,不然要在构造函数上加上@ConstructorProperties注解,因为java形参编译后不会保留;
  • 推荐使用构造方法注入,1,有助于保持immutable;2,防止依赖项为null;3 会返回完整初始化的对象。
  • set注入应该仅用于类中可选在依赖注入,还有方便重新注入。
  • ApplicationContext会预先实例化单例的bean而不是到使用的时候,为了让错误的配置信息尽早出现。可以配置这种行为。
  • 推荐使用
    1
    2
    3
    <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用在无状态的beanprototype用在有状态的bean;
  • prototypebeandestruction生命周期方法不会被调用。
  • <aop:scoped-proxy用在短生命周期bean注入长生命周期bean时候,可以获得短生命周期bean的更新。Spring中的多例往单例里注入的方法
  • InitializingBeanDisposableBean接口提供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的模板,减少重复代码,类似继承,parentbean一定要注明abstract,否则spring预初始化单例bean时候会有问题。parentbean可以表明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>,前者已经隐式开启了。
  • 使用includeFiltersexcludeFilters去控制ComponentScan扫码范围和条件;
  • 可以使用InjectionPoint或者DependencyDescriptor来获取注入点的信息,一般用在@Scope("prototype")
  • 使用BeanNameGenerator接口自定义bean名称的生成规则
  • @bean@Configuration@Component是有些不一样的,简单说带有@Configuration的是被spring代理增强的类,里面带有@bean调用其他带有@bean的方法,会返回和容器中同样的实例。Spring @Configuration 和 @Component 区别
    • 使用ImportResourcexml配置的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