文章目录
- 一、Spring Ioc容器的继承层次
- 1.BeanFactory
- 2.ListableBeanFactory
- 3.HierarchicalBeanFactory
- 4.ApplicationContext
- 二、常用的ApplicationContext的实现类
- 1.ClassPathXmlApplicationContext(基于XML配置)
- 2.AnnotationConfigApplicationContext(基于注解)
- 三、Spring Boot执行IoC的工作流程
一、Spring Ioc容器的继承层次
Spring Ioc容器的继承层次如下:
1.BeanFactory
BeanFactory是Spring Framework提供的一个接口,它是Spring容器的基础接口。BeanFactory接口定义了Spring容器中Bean对象的基本操作,例如获取Bean对象、销毁Bean对象等。BeanFactory接口的实现类包括:DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。
BeanFactory接口定义了以下方法:
- getBean(String name):根据Bean的名称获取Bean对象。
- getBean(String name, Class<T> requiredType):根据Bean的名称和类型获取Bean对象。
- getBean(Class<T> requiredType):根据类型获取Bean对象。
- containsBean(String name):判断容器中是否包含指定名称的Bean对象。
- isSingleton(String name):判断指定名称的Bean对象是否为单例。
- isPrototype(String name):判断指定名称的Bean对象是否为原型。
- destroyBean(Object bean):销毁指定的Bean对象。
- destroy():销毁容器中的所有Bean对象。
BeanFactory接口的实现类可以通过ApplicationContext接口来获取,例如:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
BeanFactory beanFactory = context.getBeanFactory();
在这个例子中,通过ClassPathXmlApplicationContext类创建了一个Spring容器,并通过getBeanFactory()方法获取了该容器的BeanFactory实现类。
BeanFactory接口是Spring Framework中最基本的容器接口,它提供了获取Bean对象、销毁Bean对象等最基本的操作。开发人员可以使用BeanFactory接口来手动创建和管理Bean对象。但是,BeanFactory接口相对较为底层,使用起来比较繁琐,需要手动进行Bean对象的管理和依赖注入等操作。
通常情况下,开发人员更倾向于使用BeanFactory接口的子接口,例如ApplicationContext接口或ListableBeanFactory接口。这些接口提供了更加便捷的Bean管理和依赖注入功能,可以大大提高开发效率。
2.ListableBeanFactory
ListableBeanFactory是Spring Framework提供的一个接口,它继承了BeanFactory接口,并添加了一些额外的方法,用于获取容器中的Bean对象。ListableBeanFactory接口定义了以下方法:
- getBeanDefinitionCount():获取容器中Bean定义的数量。
- getBeanDefinitionNames():获取容器中所有Bean定义的名称。
- getBeanNamesForType():获取指定类型的所有Bean定义的名称。
- getBeansOfType():获取指定类型的所有Bean对象。
- getBeanNamesForAnnotation():获取被指定注解标注的所有Bean定义的名称。
- getBeansWithAnnotation():获取被指定注解标注的所有Bean对象。
ListableBeanFactory接口的实现类可以通过ApplicationContext接口来获取,例如:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
ListableBeanFactory beanFactory = context.getBeanFactory();
在这个例子中,通过ClassPathXmlApplicationContext类创建了一个Spring容器,并通过getBeanFactory()方法获取了该容器的ListableBeanFactory实现类。
ListableBeanFactory接口提供了一些方便的方法,可以用于检查和获取容器中的Bean对象。例如,getBeanDefinitionNames()方法可以获取容器中所有Bean定义的名称;getBeansOfType()方法可以获取指定类型的所有Bean对象。这些方法可以帮助开发人员对容器中的Bean对象进行统计、查询和管理。
需要注意的是,ListableBeanFactory接口并不是BeanFactory接口的替代品,它只是对BeanFactory接口进行了扩展。 在实际开发中,开发人员可以根据需要选择使用BeanFactory接口或ListableBeanFactory接口。如果需要获取容器中的所有Bean对象,或者需要根据类型或注解查询Bean对象,就应该使用ListableBeanFactory接口。
3.HierarchicalBeanFactory
HierarchicalBeanFactory是Spring Framework提供的一个接口,它继承了BeanFactory接口,并添加了一些额外的方法,用于处理父子容器之间的Bean对象关系。HierarchicalBeanFactory接口的实现类包括:DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。
HierarchicalBeanFactory接口定义了以下方法:
- getParentBeanFactory():获取当前容器的父容器。
- containsLocalBean(String name):判断当前容器是否包含指定名称的Bean对象。
- getBean(String name, Class<T> requiredType, Object[] args):根据名称、类型和构造参数获取Bean对象。
- getParent():获取当前容器的父容器。
- containsBean(String name):判断当前容器及其父容器中是否包含指定名称的Bean对象。
HierarchicalBeanFactory接口的实现类可以通过ApplicationContext接口来获取,例如:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
HierarchicalBeanFactory beanFactory = (HierarchicalBeanFactory) context.getBeanFactory();
在这个例子中,通过ClassPathXmlApplicationContext类创建了一个Spring容器,并通过getBeanFactory()方法获取了该容器的BeanFactory实现类,然后将其转换为HierarchicalBeanFactory接口类型。
HierarchicalBeanFactory接口是BeanFactory接口的扩展,它可以处理父子容器之间的Bean对象关系。在Spring Framework中,可以使用父子容器来实现Bean对象的层次结构,从而更好地管理Bean对象和依赖关系。HierarchicalBeanFactory接口提供了一些方法,可以用于获取父容器、判断容器中是否包含指定名称的Bean对象等操作,方便开发人员进行容器的管理和维护。
需要注意的是,HierarchicalBeanFactory接口并不是所有Spring容器都支持的接口。只有一些特定的容器,例如XmlBeanFactory和ApplicationContext等,才支持HierarchicalBeanFactory接口。如果需要使用HierarchicalBeanFactory接口的功能,需要使用支持该接口的容器。
4.ApplicationContext
ApplicationContext是Spring Framework提供的一个接口,它继承了BeanFactory接口,并添加了一些额外的功能,例如消息国际化、事件发布、资源加载等。 ApplicationContext接口的 实现类包括:ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、AnnotationConfigApplicationContext等。
ApplicationContext接口定义了以下方法:
- getBean(String name):根据名称获取Bean对象。
- getBean(String name, Class requiredType):根据名称和类型获取Bean对象。
- getBean(Class requiredType):根据类型获取Bean对象。
- containsBean(String name):判断容器中是否包含指定名称的Bean对象。
- getApplicationName():获取应用程序名称。
- getMessage(String code, Object[] args, String defaultMessage, Locale locale):获取国际化消息。
- publishEvent(ApplicationEvent event):发布应用程序事件。
- getResource(String location):获取资源。
ApplicationContext接口的实现类可以通过不同的方式来创建,例如通过XML配置文件、Java配置类或注解等方式。例如:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
在这个例子中,通过ClassPathXmlApplicationContext类创建了一个Spring容器,它会读取classpath下的applicationContext.xml文件,并根据该文件中的配置创建Bean对象。
ApplicationContext接口是Spring Framework中最常用的容器接口之一,它提供了更加便捷的Bean管理和依赖注入功能,可以大大提高开发效率。ApplicationContext接口除了继承了BeanFactory接口的基本功能外,还添加了一些额外的功能,例如国际化消息、事件发布、资源加载等。开发人员可以使用ApplicationContext接口来管理和维护Bean对象,同时也可以使用它的其他功能来实现更加丰富的应用程序功能。
需要注意的是,ApplicationContext接口是BeanFactory接口的扩展,因此它也继承了BeanFactory接口的所有功能。同时,ApplicationContext接口还提供了一些额外的功能,因此它通常会被开发人员优先选择使用。
二、常用的ApplicationContext的实现类
1.ClassPathXmlApplicationContext(基于XML配置)
ClassPathXmlApplicationContext是Spring Framework提供的一个实现ApplicationContext接口的类,它用于从classpath中加载XML配置文件,并创建Spring容器。 ClassPathXmlApplicationContext类继承了XmlApplicationContext类,因此它也支持从文件系统、URL、字节数组等方式加载XML配置文件。
ClassPathXmlApplicationContext类的构造函数有多种重载方式,最常见的是只传入一个String类型的参数,该参数表示classpath下的XML配置文件路径。例如:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
在这个例子中,ClassPathXmlApplicationContext类会在classpath下查找名为applicationContext.xml的XML配置文件,并根据该文件中的配置创建Spring容器。
ClassPathXmlApplicationContext类在创建Spring容器时会自动读取指定的XML配置文件,并根据文件中的配置创建Bean对象。开发人员可以在XML配置文件中定义Bean对象及其依赖关系,并使用Spring容器来管理和维护这些Bean对象。同时,ClassPathXmlApplicationContext类还提供了一些配置选项,例如是否自动刷新容器、是否启用AOP等,可以根据需要进行设置。
需要注意的是,ClassPathXmlApplicationContext类只是Spring Framework中创建容器的一种方式,开发人员可以根据需要选择不同的实现方式,例如使用AnnotationConfigApplicationContext类创建基于注解的配置容器,或使用WebApplicationContext类创建Web应用程序容器等。
2.AnnotationConfigApplicationContext(基于注解)
AnnotationConfigApplicationContext是Spring Framework提供的一个实现ApplicationContext接口的类,它用于基于注解的配置方式创建Spring容器。 AnnotationConfigApplicationContext类可以通过Java类来定义Bean对象及其依赖关系,而无需使用XML配置文件。
AnnotationConfigApplicationContext类的构造函数有多种重载方式,最常见的是只传入一个Class类型的参数,该参数表示使用注解配置的Java类。例如:
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
在这个例子中,AnnotationConfigApplicationContext类会读取名为AppConfig的Java类,并根据该类中的注解配置创建Spring容器。
AnnotationConfigApplicationContext类支持以下几种注解:
- @Configuration:用于标注配置类,指示该类包含Bean对象的定义。
- @Bean:用于标注方法,指示该方法返回一个Bean对象。
- @Import:用于导入其他配置类。
AnnotationConfigApplicationContext类可以通过Java类来定义Bean对象及其依赖关系,而无需使用XML配置文件。开发人员可以在Java类中使用注解来定义Bean对象及其依赖关系,并使用AnnotationConfigApplicationContext类来创建Spring容器。AnnotationConfigApplicationContext类还提供了一些配置选项,例如是否自动刷新容器、是否启用AOP等,可以根据需要进行设置。
需要注意的是,AnnotationConfigApplicationContext类只是Spring Framework中创建容器的一种方式,开发人员可以根据需要选择不同的实现方式,例如使用ClassPathXmlApplicationContext类创建基于XML配置的容器,或使用WebApplicationContext类创建Web应用程序容器等。
三、Spring Boot执行IoC的工作流程
Spring Boot是基于Spring Framework的开发框架,它通过自动配置和约定大于配置的方式,简化了Spring应用程序的开发和部署。在Spring Boot中,执行IoC的工作原理和Spring Framework基本相同,主要分为以下几个步骤:
-
扫描类路径:Spring Boot会自动扫描应用程序的类路径,查找带有@Component、@Service、@Repository等注解的类,并将它们注册为Spring容器中的Bean对象。
-
创建Bean对象:Spring Boot会根据类的注解和依赖关系,创建Bean对象,并将它们注册到Spring容器中。
-
自动装配:Spring Boot会自动装配Bean对象之间的依赖关系,通过@Autowired注解或构造函数注入等方式,将一个Bean对象注入到另一个Bean对象中。
-
全局配置:Spring Boot提供了一些全局配置,例如数据库连接、日志输出等,可以通过application.properties或application.yml等配置文件来进行配置。
-
自定义配置:开发人员可以通过@Configuration注解和@Bean注解,自定义配置类和Bean对象,并将它们注册到Spring容器中。
-
运行时环境:Spring Boot可以根据不同的运行时环境,自动加载不同的配置文件,并为应用程序提供不同的功能。例如,在开发环境中,可以启用热部署和调试模式,在生产环境中,可以启用性能优化和安全加固等。
总之,Spring Boot执行IoC的工作原理和Spring Framework基本相同,它通过自动配置和约定大于配置的方式,简化了Spring应用程序的开发和部署。开发人员只需要定义好Bean对象和依赖关系,Spring Boot就会自动完成Bean的创建和装配,大大提高了开发效率。