十天8000字,我总结了这一篇Spring容器管理知识大全

天下代码一大抄, 抄来抄去有提高, 看你会抄不会抄!

一、前言

Springjava 开发者,永远绕不开的结。Spring 是非常值得开发者来学习的, 以目前 Springjava 领域的统治性地位, 可以说学 java 就是在学 Spring。但是作为新入门的开发人员,甚至说是有一定工作经验的同学,面对如此庞大的框架,都不一定是充分掌握了所有的知识点。因为大多数人的学习,都不是系统的学习,都是片面的。以经验为主。本系列专题的主要目的就是,一起系统的来学习一下Spring这个框架, 以一个六年经验的老鸟的视角里,来重学Spring。通过直接阅读 Spring的官方文档来获取一手知识。

因为内容较多,建议收藏学习。

二、BeanFactory 工厂

2.1 什么是Bean ?

平时我们来创建对象, 一般都是 new。如果这个对象里有一个属性, 那么就需要我来进行set,赋值。但是如果要有10个属性呢? 你也要自己来赋值吗? 那不累死个人嘛。Spring的解决方案就是, 这么重的活, 开发者不用关心了,都交给我来处理吧。那么Spring是如何来处理的呢? 对,就是BeanFactory,Spring通过 BeanFactory的方式帮实现对象的实例化。那么所有被Spring管理的对象,我们就可以理解成Bean对象。

凡是有属性和方法的对象都是Bean对象,凡是被Spring管理的Bean对象就是Spring Bean对象。

2.2 如何使用Bean工厂

  • 方式一直接使用代码自动注入
  • @Componentpublic class SpringIocTest{    @Autowired    private BeanFactory beanFactory;}    
  • 方式二使用BeanFactoryAware注入
  • @Componentpublic class SpringIocTest implements BeanFactoryAware {    private BeanFactory beanFactory;    @Override    public void setBeanFactory(BeanFactory beanFactory) {        this.beanFactory = beanFactory;    }}    

    2.3 BeanFactory的体系

    SpringBeanFactory 是一个非常重要的组件, 要想搞清楚 Spring, 一定要先搞清楚 BeanFactory 的体系,这里我们详细来解释下 BeanFactory的体系。

    看这张图,密密麻麻的都是,但是我们不要担心,实际我们不用关心这么多。大部分人都是因为看到了这里,给劝退了, 下面给大家精简一下。希望对你有所帮助。

    我们只关心上面这张图就好了,但是看类还是比较多,为什么呢? 因为Spring定义BeanFactory接口比较细,每个接口的维度都很细维度。但是我们能看到最底层的实现,是实现了所有接口的功能。下面我们以此来解释每个接口的功能。来窥探一下Spring中BeanFactory的体系。非常的全,建议大家可以收藏一下,没必要死记硬背。如果不理解的话,背下来也没有什么的用。

    下面分享,希望对大家有点用。

    2.3.1 BeanFactory

    最顶层的接口,提供了根据Bean名称获取Bean的最基础的能力。详细可以看下面的注释说明。接口没有任何实现,只是做定义。

    public interface BeanFactory { // 如果要获取FactoryBean,那么要的Bean的名称前加 & String FACTORY_BEAN_PREFIX = "&"; // 根据名称获取实例,如果没有就抛异常,结果是Object类型 Object getBean(String name) throws BeansException; // 跟前者一样,不同是结果是泛型类型,会自动帮我们转换类型 <T> T getBean(String name, Class<T> requiredType) throws BeansException; // 允许指定显式构造函数参数,很少会用 Object getBean(String name, Object... args) throws BeansException; // 根据类型获取Bean实例,如果找到了多个类型,则会 错 <T> T getBean(Class<T> requiredType) throws BeansException; // 根据类型获取实例,并显式构造函数参数 <T> T getBean(Class<T> requiredType, Object... args) throws BeansException; // 根据类型获取Bean的生成对象,这里并不是直接获取了Bean的实例 <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType); // 跟前者大同小异 <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType); // 判断是否保存这个名字的实例 boolean containsBean(String name); // 判断是否单例 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; // 判断是否是原型模式 boolean isPrototype(String name) throws NoSuchBeanDefinitionException; // bean名称和类型是否匹配 boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; // bean名称和类型是否匹配 boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException; // 获取名称的类型 @Nullable Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 根据名称获取类型,FactoryBean比较特殊,allowFactoryBeanIn   // it是说,是否也要算FactoryBean,一般情况用true @Nullable Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException; // bean声明的别名,如果没有则为空数组 String[] getAliases(String name);}

    2.3.2 HierarchicalBeanFactory

    Hierarchical翻译: 分层

    HierarchicalBeanFactory的意思是具有层次关系,这个BeanFactory可以创建一个BeanFactory,那么是否可以根据这个BeanFactory知道是谁创建他的呢? 这个接口就是干这个事情的。

    public interface HierarchicalBeanFactory extends BeanFactory { // 返回当前工厂的父工厂 @Nullable BeanFactory getParentBeanFactory(); // 返回当工厂是否包含这个bean,不从父工厂中去获取 boolean containsLocalBean(String name);}

    2.3.3 ListableBeanFactory

  • 一个接口可能会有多个实现,每个实现都是一个Bean。所以根据一个类型可能会获取多个Bean的实例。
  • 一个工厂会有很多的Bean,能不能一下获取工厂所有的Bean呢?
  • 这个工厂名字定义的很有意思,Listable, List 所以大多接口是返回集合。你不信,你看下面展示。

    public interface ListableBeanFactory extends BeanFactory { // 是否包含BeanDefinition,BeanDefinition是bean实例化的基   // 本信息。 boolean containsBeanDefinition(String beanName); // 获取BeanDefinition的数量 int getBeanDefinitionCount(); // 获取BeanDefinition的名称 String[] getBeanDefinitionNames(); // 根据类型,获取这个类型的所有Bean的名称 String[] getBeanNamesForType(ResolvableType type); // 根据类型获取bean的名称,包含非单例的,允许初始化 String[] getBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit); // 根据类型,获取这个类型的所有Bean的名称 String[] getBeanNamesForType(@Nullable Class<?> type); // 根据类型获取bean的名称,包含非单例的,允许初始化 String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit); // 根据类型获取Bean的字典,key是名称 value是实例 <T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException; // 根据类型获取Bean的字典(包含非单例),key是名称 value是实例 <T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)   throws BeansException; // 获取被当前注解修饰的Bean的名称,只获取名称不实例化,支持注解派   // 生的方式 String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType); // 获取被该注解修饰的bean,key是名称,value是实例。 Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException; // 获取当前名称Bean的,当前注解的信息 @Nullable <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)   throws NoSuchBeanDefinitionException;}

    2.3.4 ConfigurableBeanFactory

    这个工厂,是最容易看出他的用途的,名字一个看就是跟配置相关的。

    2.3.5 AutowireCapableBeanFactory

    Autowire是不是看着很熟,提供自动注入的方法。

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年8月7日
    下一篇 2022年8月7日

    相关推荐