转载:
spring容器初始化的流程,代码解析:
public class AnnotationConfigApplicationContext extends GenericApplicationContext { //创建一个读取注解的Bean定义读取器,并将其设置到容器中 private final AnnotatedBeanDefinitionReader reader = new AnnotatedBeanDefinitionReader(this); //创建一个扫描指定类路径中注解Bean定义的扫描器,并将其设置到容器中 private final ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(this); //默认构造函数,初始化一个空容器,容器不包含任何 Bean 信息,需要在稍后通过调用其register() //方法注册配置类,并调用refresh()方法刷新容器,触发容器对注解Bean的载入、解析和注册过程 public AnnotationConfigApplicationContext() { } //最常用的构造函数,通过将涉及到的配置类传递给该构造函数,以实现将相应配置类中的Bean //自动注册到容器中 public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { register(annotatedClasses); refresh(); } //该构造函数会自动扫描以给定的包及其子包下的所有类,并自动识别所有的Spring Bean,将其 //注册到容器中 public AnnotationConfigApplicationContext(String... basePackages) { scan(basePackages); refresh(); } //为容器的注解Bean读取器和注解Bean扫描器设置Bean名称产生器 public void setBeanNameGenerator(BeanNameGenerator beanNameGenerator) { this.reader.setBeanNameGenerator(beanNameGenerator); this.scanner.setBeanNameGenerator(beanNameGenerator); } //为容器的注解Bean读取器和注解Bean扫描器设置作用范围元信息解析器 public void setScopeMetadataResolver(ScopeMetadataResolver scopeMetadataResolver) { this.reader.setScopeMetadataResolver(scopeMetadataResolver); this.scanner.setScopeMetadataResolver(scopeMetadataResolver); } //为容器注册一个要被处理的注解Bean,新注册的Bean,必须手动调用容器的 //refresh()方法刷新容器,触发容器对新注册的Bean的处理 public void register(Class<?>... annotatedClasses) { this.reader.register(annotatedClasses); } //扫描指定包路径及其子包下的注解类,为了使新添加的类被处理,必须手动调用 //refresh()方法刷新容器 public void scan(String... basePackages) { this.scanner.scan(basePackages); } }
基于注解的应用实现,提供注解的Reader和包或类扫描的Scanner
其中类.class和包名是其入参
classAnnotationConfigApplicationContext extends
GenericApplicationContext
public AnnotationConfigApplicationContext() {
this.reader =new AnnotatedBeanDefinitionReader(this);
this.scanner =newClassPathBeanDefinitionScanner(this);
}
通用的应用实现,其他实现一般会继承这个类
class GenericApplicationContextextends
AbstractApplicationContext implements BeanDefinitionRegistry
public GenericApplicationContext() {
this.beanFactory =new DefaultListableBeanFactory();
this.beanFactory.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
}
实现Bean的注册定义,提供删除、获取、判断的方法
interface BeanDefinitionRegistryextends AliasRegistry
对注册别名进行设置、获取、判断
interface AliasRegistry
Interface : ResourceLoader //资源加载
提供两个接口:
得到资源加载句柄:Resource getResource();和
得到类加载器:ClassLoader getClassLoader();
class DefaultResourceLoader implements ResourceLoader
Private ClassLoader classLoader;
public DefaultResourceLoader() {
this.classLoader = ClassUtils.getDefaultClassLoader();
}
Public ClassLoader getClassLoader(){
return (this.classLoader != null ?this.classLoader : ClassUtils.getDefaultClassLoader());
}
//实现父类的getResource接口
Resource getResource(String location){
//实现
}
使用模板方法设计模式,简单实现共同的上下文功能,需要具体的子类来实现它。对父类的一些接口的具体实现。
abstractclassAbstractApplicationContext extends DefaultResourceLoader
implements ConfigurableApplicationContext,DisposableBean
interface DisposableBean
提供destroy();接口,销毁Bean
提供一个基于配置的Application的全面的应用接口
提供一些环境变量,设置和判断当前应用状态的接口
interface ConfigurableApplicationContext
extends ApplicationContext,Lifecycle
interface Lifecycle
提供控制周期的开始void start(),停止void stop(),现在的状态boolean isRunning(); 此典型的用例是控制异步处理
核心接口,对整个的Application在做控制
interfaceApplicationContext extends EnvironmentCapable,
ListableBeanFactory, HierarchicalBeanFactory,MessageSource,
ApplicationEventPublisher, ResourcePatternResolver
资源文件匹配解析
Interface ResourcePatternResolver extends ResourceLoader
封装事件的发布功能,为ApplicationContext的超级接口
interface ApplicationEventPubliser
void publishEvent(ApplicationEvent event);
对消息进行封装,支持参数化和国际化
interfaceMessageSource
提供获取父类的BeanFactory的方法
interface HierarchicalBeanFactoryextends BeanFactory {
public abstract BeanFactory getParentBeanFactory();
public abstract boolean containsLocalBean(String paramString);
}
核心Bean工厂类,提供获取Bean的方法 Object getBean(String name)
是否是单例singleton,是否为原型Prototype;
操作别名getAliases(String Name)
interface BeanFactory
监听和预加载Bean实例;提供了获取带注解标签类的Map集合,根据名字获取Bean的定义等
interface ListableBeanFactoryextendsBeanFactory
获取Environment 环境变量。getEnviroment();
interface EnvironmentCapable
相关推荐
最后,虽然使用工具类的方法可以方便地获取ApplicationContext,但需要谨慎处理单例的问题,确保线程安全,以及避免重复创建ApplicationContext实例,这可能会导致资源浪费或者产生异常。在实际项目中,还应该根据...
2. 获取`ApplicationContext`的常见方法: - XML配置方式:通过`ClassPathXmlApplicationContext`或`FileSystemXmlApplicationContext`来初始化`ApplicationContext`,例如: ```java ApplicationContext context...
Spring applicationContext.xml常见部分属性的使用备注
它允许开发者通过XML、Java配置或者基于注解的方式来定义Bean的定义,以及它们之间的依赖关系。 描述中的“信息化管理和巴塞尔协议三”涉及到两个主要概念。信息化管理是指利用信息技术,包括硬件、软件和网络,对...
本示例主要探讨`ApplicationContext`及其几个常见子类的使用,通过实际的代码演示来帮助理解其功能和用法。 首先,`ApplicationContext`有多个实现类,如`ClassPathXmlApplicationContext`、`...
这个问题在实际开发中非常常见,特别是在异步线程或某些特殊情况下无法使用AutoWired和Component注解时,就需要使用ApplicationContext来获取bean。 首先,我们需要了解什么是ApplicationContext。...
本文将深入探讨几种常见的获取Spring容器的方法,包括使用`ApplicationContext`、通过`ServletContext`、利用`ApplicationObjectSupport`、`WebApplicationObjectSupport`以及实现`ApplicationContextAware`接口等。...
### Java常见原理解析 #### 一、Spring工作原理详解 **Spring框架**作为Java开发领域内非常重要的轻量级框架之一,其核心价值在于提供了强大的依赖注入(DI)和面向切面编程(AOP)的支持。下面我们将深入探讨...
- Spring框架核心组件,比如BeanFactory、ApplicationContext,以及Spring IOC(控制反转)和AOP(面向切面编程)的概念。 - Hibernate框架及其懒加载(Lazy-Load)机制,以及数据库连接池的配置和使用。 8. 实用...
### IT知识点解析:Java三大框架常见问题与解决方案 #### 一、日志配置与Spring框架集成问题 在处理日志配置问题时,如遇到`java.util.zip.ZipException`错误,通常意味着应用程序未能找到必要的配置文件,例如`...
在分析Tomcat常见问题时,我们经常会遇到各种各样的错误,这些错误可能涉及到服务器配置、依赖库、系统环境以及应用程序本身。以下是一些常见的问题及其解决方案: 首先,Jdk版本不匹配是导致Tomcat无法正常运行的...
本文将深入探讨内存泄露的常见原因,以及如何避免这些问题。 首先,集合类是内存泄露的一个常见源头。如果集合类如ArrayList、HashMap等只有添加元素的操作,而没有相应的删除机制,特别是当这些集合是全局变量(如...
Struts2.1、Spring3.0 和 Hibernate3.3 的整合是企业级Java应用开发中常见的技术组合,常被称为S2SH框架。这个整合旨在实现MVC(Model-View-Controller)架构,以提高应用的可维护性和可扩展性。下面我们将详细探讨...
在Spring Boot框架中,普通类调用bean是常见的操作,特别是在构建复杂应用时。这篇博客“17. Spring Boot普通类调用bean【从零开始学Spring Boot】”旨在指导初学者如何在非Spring管理的类中访问和使用Spring容器中...
本文将深入探讨Spring框架的常见面试问题,包括其核心概念、优点、IOC(控制反转)和AOP(面向切面编程)的理解,以及它们在实际应用中的作用。 首先,Spring是一个提供IOC和AOP的轻量级容器框架。IOC,即控制反转...
在帮助类中,我们可以使用静态变量来保存ApplicationContext,并提供getBean方法来获取对应的bean。这样,我们可以在任何地方获取到对应的bean。 在帮助类中,我们还需要实现setApplicationContext方法,以便在容器...
答案:Spring 配置文件是一个 XML 文件,包含了类信息,描述了如何配置它们,以及如何相互调用。 11. 什么是 Spring IOC 容器? 答案:Spring IOC 容器负责创建对象,管理对象(通过依赖注入(DI),装配对象,...
为了实现这一目标,Spring提供了一种方法来让我们在非Action类中获取到ApplicationContext上下文对象,进而通过这个上下文对象获取到所需的Bean实例,例如DAO层的对象。本文将详细介绍如何在Action以外的地方获取DAO...
此外,`ApplicationContext`接口是Spring的核心,它用于加载配置文件并管理bean的生命周期,使得我们能够方便地获取和管理应用程序中的对象。 在Struts框架中,`ActionSupport`是基础Action类,通常被开发者继承,...