`

ApplicationContext以及常见类

 
阅读更多

转载:

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

分享到:
评论

相关推荐

    Spring获取ApplicationContext对象工具类的实现方法

    最后,虽然使用工具类的方法可以方便地获取ApplicationContext,但需要谨慎处理单例的问题,确保线程安全,以及避免重复创建ApplicationContext实例,这可能会导致资源浪费或者产生异常。在实际项目中,还应该根据...

    spring 获得applicationcontext公用方法

    2. 获取`ApplicationContext`的常见方法: - XML配置方式:通过`ClassPathXmlApplicationContext`或`FileSystemXmlApplicationContext`来初始化`ApplicationContext`,例如: ```java ApplicationContext context...

    applicationContext.xml

    Spring applicationContext.xml常见部分属性的使用备注

    applicationcontext

    它允许开发者通过XML、Java配置或者基于注解的方式来定义Bean的定义,以及它们之间的依赖关系。 描述中的“信息化管理和巴塞尔协议三”涉及到两个主要概念。信息化管理是指利用信息技术,包括硬件、软件和网络,对...

    sping applicationcontext中的一些例子demo

    本示例主要探讨`ApplicationContext`及其几个常见子类的使用,通过实际的代码演示来帮助理解其功能和用法。 首先,`ApplicationContext`有多个实现类,如`ClassPathXmlApplicationContext`、`...

    Spring通过ApplicationContext主动获取bean的方法讲解

    这个问题在实际开发中非常常见,特别是在异步线程或某些特殊情况下无法使用AutoWired和Component注解时,就需要使用ApplicationContext来获取bean。 首先,我们需要了解什么是ApplicationContext。...

    获取spring容器的方法

    本文将深入探讨几种常见的获取Spring容器的方法,包括使用`ApplicationContext`、通过`ServletContext`、利用`ApplicationObjectSupport`、`WebApplicationObjectSupport`以及实现`ApplicationContextAware`接口等。...

    Java常见原理解析

    ### Java常见原理解析 #### 一、Spring工作原理详解 **Spring框架**作为Java开发领域内非常重要的轻量级框架之一,其核心价值在于提供了强大的依赖注入(DI)和面向切面编程(AOP)的支持。下面我们将深入探讨...

    JAVA开发常见面试题.pdf

    - Spring框架核心组件,比如BeanFactory、ApplicationContext,以及Spring IOC(控制反转)和AOP(面向切面编程)的概念。 - Hibernate框架及其懒加载(Lazy-Load)机制,以及数据库连接池的配置和使用。 8. 实用...

    我整理的三大框架的常见问题和解决方案

    ### IT知识点解析:Java三大框架常见问题与解决方案 #### 一、日志配置与Spring框架集成问题 在处理日志配置问题时,如遇到`java.util.zip.ZipException`错误,通常意味着应用程序未能找到必要的配置文件,例如`...

    tomcat常见问题分析

    在分析Tomcat常见问题时,我们经常会遇到各种各样的错误,这些错误可能涉及到服务器配置、依赖库、系统环境以及应用程序本身。以下是一些常见的问题及其解决方案: 首先,Jdk版本不匹配是导致Tomcat无法正常运行的...

    内存泄露从入门到精通三部曲之常见原因与用户实践1

    本文将深入探讨内存泄露的常见原因,以及如何避免这些问题。 首先,集合类是内存泄露的一个常见源头。如果集合类如ArrayList、HashMap等只有添加元素的操作,而没有相应的删除机制,特别是当这些集合是全局变量(如...

    Struts2.1、Spring3.0、Hibernate3.3整合与S2SH的XML文件拆分

    Struts2.1、Spring3.0 和 Hibernate3.3 的整合是企业级Java应用开发中常见的技术组合,常被称为S2SH框架。这个整合旨在实现MVC(Model-View-Controller)架构,以提高应用的可维护性和可扩展性。下面我们将详细探讨...

    Spring常见面试问题(超详细)

    本文将深入探讨Spring框架的常见面试问题,包括其核心概念、优点、IOC(控制反转)和AOP(面向切面编程)的理解,以及它们在实际应用中的作用。 首先,Spring是一个提供IOC和AOP的轻量级容器框架。IOC,即控制反转...

    多线程Autowire注入null的解决方案.docx

    在帮助类中,我们可以使用静态变量来保存ApplicationContext,并提供getBean方法来获取对应的bean。这样,我们可以在任何地方获取到对应的bean。 在帮助类中,我们还需要实现setApplicationContext方法,以便在容器...

    Spring常见面试题与答案,IOC AOP等

    答案:Spring 配置文件是一个 XML 文件,包含了类信息,描述了如何配置它们,以及如何相互调用。 11. 什么是 Spring IOC 容器? 答案:Spring IOC 容器负责创建对象,管理对象(通过依赖注入(DI),装配对象,...

    在action以外的地方获取dao

    为了实现这一目标,Spring提供了一种方法来让我们在非Action类中获取到ApplicationContext上下文对象,进而通过这个上下文对象获取到所需的Bean实例,例如DAO层的对象。本文将详细介绍如何在Action以外的地方获取DAO...

    SSH框架常用到的一些工具类整理

    此外,`ApplicationContext`接口是Spring的核心,它用于加载配置文件并管理bean的生命周期,使得我们能够方便地获取和管理应用程序中的对象。 在Struts框架中,`ActionSupport`是基础Action类,通常被开发者继承,...

    hibernate,struts,spring 常见错误信息

    常见的错误包括: 1. **配置错误**:如XML配置文件中的实体映射错误、数据源配置错误等,可能导致SessionFactory无法创建。 2. **SQL异常**:查询语句编写错误或数据库表结构与实体类不匹配,可能导致无法执行HQL或...

Global site tag (gtag.js) - Google Analytics