Spring IoC容器

Spring IoC容器

依赖反转(依赖注入):IoC亦称“依赖倒置原理”( Dependency Inversion Principle)

  • 对象的引用或依赖关系的管理由具体的对象来完成,会导致代码的高度耦合和可测试性降低
  • 对象封装了数据和对数据的处理,对象的依赖关系常常体现在对数据和方法的依赖上

控制反转是关于一个对象如何获取它所依赖的对象的引用,反转是指责任的反转。
通过使用IoC容器,对象依赖关系的管理被反转了,转到IoC容器中来了,对象之间的相互依赖关系由IoC容器进行管理,并由Ioc容器完成对象的注入。

注:依赖注入是可以递归的,对象被逐层注入。

POJO和JavaBean的区别

  • POJO是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象,用于数据的临时传递,它只能装载数据, 作为数据存储的载体,而不具有业务逻辑处理的能力。
  • JavaBean 是一种JAVA语言写成的可重用组件,javabean当中除了和POJO一样外,还可以有其它的业务处理方法。

依赖注入的方式:

  • 接口注入
  • setter注入
  • 构造器注入

Spring 通过定义BeanDefinition来管理基于Spring的应用中的各种对象以及他们之间的相互依赖关系,BeanDefinition抽象了我们对Bean的定义,是让容器起作用的主要数据类型。

Scope

  1. singleton 作用域
    当一个bean的 作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例
  2. prototype
    prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的 getBean()方法)都会产生一个新的bean实例
  3. request
    request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
  4. session
    session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
  5. global session
    global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。
Spring 注意点
  • <context:annotationconfig />
    将隐式地向Spring容器注册 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、 PersistenceAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor
  • <context:component-scan />让Bean定义注解工作起来
    值得注意的是<context:component-scan />配置项不但启用了对类包进行扫描以实施注释驱动Bean定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor),因此当使用<context:component-scan />后,就可以将<context:annotation-config />移除了。
Spring IoC容器实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZAfqGcCN-1600729980532)(./1527979863459.png)]

Spring IoC容器设计

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pyU8vCJk-1600729980535)(./1479347643871.png)]

  1. BeanFactory:提供的是最基本的IoC容器的功能,定义了IoC容器最基本的形式
  2. 使用IoC容器时的几个步骤:
  • 创建 IoC配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息
  • 创建一个BeanFactory,默认的是DefaultBeanDefinitionFactory
  • 创建一个载入BeanDefinition的读取器,比如使用 XMLBeanDefinitionReader来载入XML文件形式的BeanDefinition,通过一个回调配置给BeanFactory
  • 从定义好的资源位置读取配置信息,具体的解析过程由 XMLBeanDefinitionReader来完成。完成整个载入和注册Bean定义之后,需要的IoC容器就建立起来了。
BeanDefinition

一个BeanDefinition描述了一个bean的实例,包括属性值,构造方法参数值和继承自它的类的更多信息。BeanDefinition仅仅是一个最简单的接口,主要功能是允许BeanFactoryPostProcessor 例如PropertyPlaceHolderConfigure 能够检索并修改属性值和别的bean的元数据。

  1. BeanDefinition的继承关系
  • 父接口:AttributeAccessor, BeanMetadataElement

  • 子接口: AnnotatedBeanDefinition

  • 子类:AbstractBeanDefinition, AnnotatedGenericBeanDefinition, ChildBeanDefinition, GenericBeanDefinition, RootBeanDefinition, ScannedGenericBeanDefinition

    1)AttributeAccessor 接口定义了最基本的对任意对象的元数据的修改或者获取,主要方法有:

      String[] attributeNames() 
      Object getAttribute(String name) 
      boolean hasAttribute(String name) 
      Object removeAttribute(String name) 
      void setAttribute(String name, Object value) 
    

2)BeanMetadataElement 接口提供了一个getResource()方法,用来传输一个可配置的源对象。
3)3 BeanDefinition 的抽象类 AbstractBeanDefinition

	public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
	        implements BeanDefinition, Cloneable {
	}

其中BeanMetadataAttributeAccessor接口既实现了BeanMetadataElement接口提供的getResource()方法也提供了AttributeAccessorSupport 针对属性的增删改查,如上AttributeAccessor的方法。

	public class BeanMetadataAttributeAccessor extends AttributeAccessorSupport implements BeanMetadataElement {
	}

4)MutablePropertyValues:PropertyValues接口的默认实现,支持对属性的简单操作,为构造方法提供深度复制和使用map获取构造的支持。

5) BeanDefinition实现类ChildBeanDefinition, GenericBeanDefinition, RootBeanDefinition

  • ChildBeanDefinition是一种bean definition,它可以继承它父类的设置,即ChildBeanDefinition对RootBeanDefinition有一定的依赖关系。
  • GenericBeanDefinition是一站式的标准bean definition,除了具有指定类、可选的构造参数值和属性参数这些其它bean definition一样的特性外,它还具有通过parenetName属性来灵活设置parent bean definition。
  • 一个RootBeanDefinition定义表明它是一个可合并的bean definition:即在spring beanFactory运行期间,可以返回一个特定的bean。

6)Bean的包装BeanWrapper

  • 作用:提供对标准javabean的分析和操作方法:单个或者批量获取和设置属性值,获取属性描述符,查询属性的可读性和可写性等。支持属性的嵌套设置,深度没有限制。

  • 继承关系:

      public interface BeanWrapper extends ConfigurablePropertyAccessor {
      }
      
      public interface ConfigurablePropertyAccessor extends PropertyAccessor, PropertyEditorRegistry, TypeConverter {
      }
    

7)BeanWrapper的实现类:BeanWrapperImpl

  • BeanWrapperImpl作用:可以根据需求,将集合与数组的值转换到对应目标对象的集合和数组。自定义的属性编辑器通过属性编辑器的setValue,setAsText方法实现上述的转换功能。
  • BeanWrapperImpl 默认的PropertyEditor的实现如下:(PropertyEditorRegistrySupport.java)
IoC容器的初始化过程

IoC容器的初始化由AbstractApplicationContext的refresh()方法来启动,这个启动包括BeanDefinition的 Resource定位、载入和注册三个基本过程

  1. Resource定位:Resource定位指的是BeanDefinition的资源定位,它由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的使用提供了统一接口。
  2. BeanDefinition载入:载入过程就是把用户定义好的Bean表示成IoC容器内部的数据结构BeanDefinition。BeanDefinition实际上是POJO对象在IoC容器中的抽象,通过BeanDefinition定义的数据结构,使IoC容器能够方便的对POJO对象也就是Bean进行管理。
  3. 向IoC容器注册BeanDefinition:调用 BeanDefinitionRegistry接口的实现来完成注册,把载入过程中解析得到的BeanDefinition注入到IoC容器中额一个ConcurrentHashMap中,IoC容器就是通过这个ConcurrentHashMap来持有这些BeanDefinition数据的。

注:Bean定义的载入和依赖注入是两个独立的过程,依赖注入一般发生在应用第一次通过getBean向容器索取Bean的时候。

	public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver{}
  1. BeanDefinition的Resource定位
    以FileSystemXmlApplicationContext为例分析,FileSystemXmlApplicationContext的继承关系
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0qltlsNH-1600729980542)(./1479371820333.png)]

1)FileSystemXmlApplicationContext

  • 构造方法:父类AbstractApplicationContext 中初始化this.resourcePatternResolver 为PathMatchingResourcePatternResolver
  • setConfigLocations:父类AbstractRefreshableConfigApplicationContext中的方法,对this.configLocations赋值
  • refresh:父类AbstractApplicationContext中的方法,调用obtainFreshBeanFactory
  • obtainFreshBeanFactory:父类AbstractApplicationContext中的方法,调用 refreshBeanFactory方法
  • refreshBeanFactory:父类AbstractRefreshableApplicationContext中的方法,创建默认的IoC容器DefaultListableBeanFactory,调用loadBeanDefinitions
  • loadBeanDefinitions:父类AbstractXmlApplicationContext中的方法,创建XmlBeanDefinitionReader,调用重载方法loadBeanDefinitions(XmlBeanDefinitionReader reader),在重载方法中调用getConfigLocations,然后调用XmlBeanDefinitionReader的loadBeanDefinitions方法
AbstractApplicationContext的refresh 方法
  • obtainFreshBeanFactory:创建BeanFactory,并完成BeanDefinition的载入、解析、注册
  • prepareBeanFactory:设置BeanFactory的前置处理
  • postProcessBeanFactory:设置BeanFactory的后置处理
  • invokeBeanFactoryPostProcessors:调用BeanFactory的后处理器,这些后处理器是在Bean定义中向容器注册的
  • registerBeanPostProcessors:注册Bean的后处理器,在Bean创建过程中调用
  • initMessageSource:对上下文中的消息源进行初始化
  • initApplicationEventMulticaster:初始化上下文中的事件机制
  • onRefresh:初始化其他特殊的Bean
  • registerListeners:检查监听Bean并且将这些Bean向容器注册
  • finishBeanFactoryInitialization:实例化所有的(non-lazy-init)单件
  • finishRefresh:发布容器,结束refresh过程

2)XmlBeanDefinitionReader

  • loadBeanDefinitions(String… locations):父类AbstractBeanDefinitionReader中的方法,遍历调用重载方法loadBeanDefinitions(String location, Set<Resource> actualResources)
  • getResourceLoader:获取资源定位加载器,这里即FileSystemXmlApplicationContext(继承自DefaultResourceLoader)
  • 调用ResourcePatternResolver 实例的getResources方法,即AbstractApplicationContext中的实现this.resourcePatternResolver.getResources(locationPattern),resourcePatternResolver即容器构造方法中初始化的PathMatchingResourcePatternResolver
  • PathMatchingResourcePatternResolver中的getResources实现中调用DefaultResourceLoader的getResource
  • DefaultResourceLoader的getResource实现中调用FileSystemXmlApplicationContext的getResourceByPath
  • FileSystemXmlApplicationContext的getResourceByPath 创建FileSystemResource对象
  • loadBeanDefinitions(Resource resource):获取配置文件资源定位对象输入流封装之后调用doLoadBeanDefinitions方法
  • doLoadBeanDefinitions:调用doLoadDocument获取BeanDefinition定义配置文件的Document对象,调用registerBeanDefinitions(Document doc, Resource resource)解析、注册BeanDefinition
  • registerBeanDefinitions:启动对BeanDefinition解析过程,创建BeanDefinitionDocumentReader,XmlReaderContext、DefaultNamespaceHandlerResolver,然后调用BeanDefinitionDocumentReader的registerBeanDefinitions方法

3)DefaultBeanDefinitionDocumentReader

  • registerBeanDefinitions:调用doRegisterBeanDefinitions
  • doRegisterBeanDefinitions:创建BeanDefinitionParserDelegate解析器委托,调用parseBeanDefinitions
  • parseBeanDefinitions:获取XML配置的子节点,然后遍历解析各子节点,如果命名空间是http://www.springframework.org/schema/beans的调用parseDefaultElement方法,否则调用delegate.parseCustomElement(ele);
  • parseDefaultElement:
    • processBeanDefinition:通过BeanDefinitionParserDelegate获取BeanDefinitionHolder,然后通过BeanDefinitionReaderUtils.registerBeanDefinition注册BeanDefinition

普通的Bean定义解析是在 DefaultBeanDefinitionDocumentReader的processBeanDefinition方法中委托BeanDefinitionParserDelegate完成的

BeanDefinitionParserDelegate
  • parseBeanDefinitionElement方法创建BeanDefinitionHolder
  • parseBeanDefinitionElement重载方法中创建AbstractBeanDefinition
    • createBeanDefinition:创建GenericBeanDefinition:
    • parseConstructorArgElements:解析<Bean>构造函数设置
    • parsePropertyElements:解析<Bean>的property设置
    • 。。。。

4)NamespaceHandlerSupport
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YvJ3pizy-1600729980549)(./1479447820130.png)]

  • registerBeanDefinitionParser:注册解析器
  • findParserForElement:查找元素解析器
  • parse:调用解析器的parse方法

5)AbstractBeanDefinitionParser 解析器抽象类

  • parse:
    • 调用子类AbstractSingleBeanDefinitionParser的parseInternal方法获取AbstractBeanDefinition
    • parseInternal:创建BeanDefinitionBuilder、GenericBeanDefinition,获取解析元素的Class 对象,通过工厂方法设置BeanDefinition的属性,调用子类的 doParse方法设置BeanDefinition的属性并返回BeanDefinition
    • 处理别名,id
    • 创建一个BeanDefinitionHolder来持有BeanDefinition
    • registerBeanDefinition:注册BeanDefinition
      • 调用BeanDefinitionReaderUtils.registerBeanDefinition注册BeanDefinition到IoC容器,BeanDefinitionReaderUtils中又调用DefaultListableBeanFactory的注册方法registerBeanDefinition注册BeanDefinition、registerAlias方法注册别名
    • 触发完成注册事件

6)DefaultListableBeanFactory

  • registerBeanDefinition:
    • this.beanDefinitionMap.put(beanName, beanDefinition);
    • this.beanDefinitionNames.add(beanName);
    • this.manualSingletonNames.remove(beanName);

7)invokeBeanFactoryPostProcessors 调用IoC容器的后处理器

  • PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
各类解析器
  1. ComponentScanBeanDefinitionParser 扫描context:component-scan
  • parse:
    + 获取扫描包basePackages
    + 创建ClassPathBeanDefinitionScanner类路径下的扫描器,父类构造方法中调用registerDefaultFilters方法添加AnnotationTypeFilter(Component.class)过滤器
    + 调用ClassPathBeanDefinitionScanner的 doScan方法
    - 调用父类ClassPathScanningCandidateComponentProvider的findCandidateComponents方法,返回Set<BeanDefinition>
    + 获取扫描包下的所有.class文件
    + 遍历.class文件
    + 创建SimpleMetadataReader,构造方法中创建ClassReader、AnnotationMetadataReadingVisitor(继承自ClassVisitor),调用classReader.accept 方法。classReader跟classVisitor是asm提供的字节码访问类,从字面上就能看出来,其使用了visitor模式,事实上就是classReader.accept的时候会遍历整个类的字节码,遍历的时候如果碰到method,就会调用ClassVisitor中定义的visitMethod,碰到field,就会调用visitField(同样是回调)。
    + 判断是否是定义的注解,肯定则创建ScannedGenericBeanDefinition
    - 遍历Set<BeanDefinition>
    - postProcessBeanDefinition:处理BeanDefinition的一些赋值
    - AnnotationConfigUtils.processCommonDefinitionAnnotations:处理注解,依赖值等
    - 创建BeanDefinitionHolder持有BeanDefinition
    - registerBeanDefinition:注册BeanDefinition,BeanDefinitionReaderUtils.registerBeanDefinition
注:
  • AbstractBeanDefinition:描述类大部分BeanDefinition的属性
  • BeanDefinition的载入分为两部分:
    • 通过调用XML的解析器得到 Document对象
    • 按照Spring的Bean规则进行解析, DefaultBeanDefinitionDocumentReader
IoC容器的依赖注入

BeanFactory的getBean是触发依赖注入的入口,最终调用doGetBean来实现

1)DefaultListableBeanFactory

  • doGetBean:
    • getSingleton:先从缓存中获取Bean,处理那些已经被创建过的单件模式的Bean
    • getObjectForBeanInstance:完成FactoryBean的相关处理,以取得FactoryBean的生产结果
    • 检查是否能在当前的BeanFactory中取到需要的Bean,取不到则到双亲BeanFactory中取
    • getMergedLocalBeanDefinition:根据Bean的名字得到BeanDefinition
    • String[] dependsOn = mbd.getDependsOn():获取当前Bean的所有依赖Bean,这样会触发getBean的递归调用,直到取到一个没有任何依赖的Bean为止
    • getSingleton:通过调用ObjectFactory的回调方法getObject方法调用createBean创建 Singleton bean的实例

2)AbstractAutowireCapableBeanFactory

  • createBean:调用doCreateBean
  • doCreateBean:
    • BeanWrapper用来持有创建出来的Bean

    • createBeanInstance:创建Bean

      • instantiateUsingFactoryMethod:使用工厂方法对Bean进行实例化
      • instantiateBean:(最常见)使用默认构造函数对Bean进行实例化
        • CglibSubclassingInstantiationStrategy:默认的实例化策略,即使用CGLIB对Bean进行实例化
        • SimpleInstantiationStrategy:Spring用来生成Bean的默认类,提供了两种实例化Java对象的方法,一种是使用了JVM的反射功能的BeanUtils;另一种是通过使用CGLIB生成
          • instantiate:
            • BeanUtils.instantiateClass:BeanUtils实例化通过 Constructor来实例化Bean
            • instantiateWithMethodInjection:使用CGLIB来实例化Bean
    • populateBean:依赖注入入口

      • mbd.getPropertyValues():获取BeanDefinition中的properties
      • autowireByName、autowireByType:对Autowire注入的处理,可以根据Bean的名字和类型完成注入
      • applyPropertyValues:对属性进行注入
      • BeanDefinitionValueResolver:resolveValueIfNecessary方法完成对BeanDefinition的解析
    • initializeBean:对Bean初始化

ApplicationContext和Bean的初始化和销毁
IoC容器中Bean的生命周期
  • Bean实例的创建
  • 为Bean实例设置属性
  • 调用Bean的初始化方法
  • 应用可以通过IoC容器使用
  • 当容器关闭时,调用Bean的销毁方法
初始化方法

initializeBean(AbstractAutowireCapableBeanFactory)

  • invokeAwareMethods:调用一系列Aware接口实现
  • applyBeanPostProcessorsBeforeInitialization
  • invokeInitMethods:调用InitializingBean接口实例的afterPropertiesSet方法
  • applyBeanPostProcessorsAfterInitialization
lazy-init属性和预实例化

refresh(AbstractApplicationContext)

  • finishBeanFactoryInitialization:对lazy-init属性处理
  • preInstantiateSingletons(DefaultListableBeanFactory):调用getBean实例化
FactoryBean的实现

FactoryBean为应用生成需要的对象,这些对象往往是经过特殊处理的,FactoryBean机制可以提供一个很好的封装机制,比如封装Proxy、RMI、JNDI等

AbstractBeanFactory
  • doGetBean中
  • sharedInstance = createBean(beanName, mbd, args)生成Bean实例,
  • bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); 如果Bean实现了FactoryBean接口,则用FactoryBean 生产Bean实例
BeanPostProcessor的实现

BeanPostProcessor Bean的后置处理器是一个监听器,可以触发容器触发的事件,将它向IoC容器注册后,容器中管理的Bean具备了接收IoC容器事件回调的能力。

在initializeBean方法中实现

autowiring(自动依赖装配)的实现

IoC依赖关系管理方法:

  • 通过BeanDefinition的属性值和构造方法以显示的方式
  • 自动依赖装配方式
    在自动装配中,不需要对Bean的属性做显式的依赖关系声明,只需要配置好autowiring属性,IoC容器会根据这个属性的配置,使用反射自动查找属性的类型或名字,然后基于属性的类型和名字自动匹配IoC容器中的Bean,从而自动的完成依赖注入
Bean的依赖检测

Spring通过特定的 aware接口 来完成在Bean中直接操作IoC容器

  • BeanNameAware:可以在Bean中得到它在IoC容器中的Bean实例名称
  • BeanFactoryAware:在Bean中得到Bean所在的IoC容器,从而直接在Bean中使用更多的IoC容器服务
  • ApplicationContextAware:在Bean中得到Bean所在的应用上下文
  • MessageSourceAware:在Bean中可以得到消息源
  • ApplicationEventPublisherAware:在Bean中得到应用上下文的事件发布器,从而可以在Bean中发布应用上下文事件
  • ResourceLoaderAware:在Bean中得到ResourceLoader,从而在Bean中使用ResourceLoader加载外部对应的Resource资源
附录
常见命名空间初始化
  • ContextNamespaceHandler

      public void init() {
      		registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser());
      		registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser());
      		registerBeanDefinitionParser("annotation-config", new AnnotationConfigBeanDefinitionParser());
      		registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser());
      		registerBeanDefinitionParser("load-time-weaver", new LoadTimeWeaverBeanDefinitionParser());
      		registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());
      		registerBeanDefinitionParser("mbean-export", new MBeanExportBeanDefinitionParser());
      		registerBeanDefinitionParser("mbean-server", new MBeanServerBeanDefinitionParser());
      	}
    
  • AopNamespaceHandler

      public void init() {
      		// In 2.0 XSD as well as in 2.1 XSD.
      		registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser());
      		registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser());
      		registerBeanDefinitionDecorator("scoped-proxy", new ScopedProxyBeanDefinitionDecorator());
      
      		// Only in 2.0 XSD: moved to context namespace as of 2.1
      		registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());
      	}
    
  • TaskNamespaceHandler

      public void init() {
      		this.registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
      		this.registerBeanDefinitionParser("executor", new ExecutorBeanDefinitionParser());
      		this.registerBeanDefinitionParser("scheduled-tasks", new ScheduledTasksBeanDefinitionParser());
      		this.registerBeanDefinitionParser("scheduler", new SchedulerBeanDefinitionParser());
      	}
    
  • MvcNamespaceHandler

      public void init() {
      		registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
      		registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser());
      		registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser());
      		registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser());
      		registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser());
      		registerBeanDefinitionParser("redirect-view-controller", new ViewControllerBeanDefinitionParser());
      		registerBeanDefinitionParser("status-controller", new ViewControllerBeanDefinitionParser());
      		registerBeanDefinitionParser("view-resolvers", new ViewResolversBeanDefinitionParser());
      		registerBeanDefinitionParser("tiles-configurer", new TilesConfigurerBeanDefinitionParser());
      		registerBeanDefinitionParser("freemarker-configurer", new FreeMarkerConfigurerBeanDefinitionParser());
      		registerBeanDefinitionParser("velocity-configurer", new VelocityConfigurerBeanDefinitionParser());
      		registerBeanDefinitionParser("groovy-configurer", new GroovyMarkupConfigurerBeanDefinitionParser());
      		registerBeanDefinitionParser("script-template-configurer", new ScriptTemplateConfigurerBeanDefinitionParser());
      		registerBeanDefinitionParser("cors", new CorsBeanDefinitionParser());
      	}
    
  • UtilNamespaceHandler

      public void init() {
      		registerBeanDefinitionParser("constant", new ConstantBeanDefinitionParser());
      		registerBeanDefinitionParser("property-path", new PropertyPathBeanDefinitionParser());
      		registerBeanDefinitionParser("list", new ListBeanDefinitionParser());
      		registerBeanDefinitionParser("set", new SetBeanDefinitionParser());
      		registerBeanDefinitionParser("map", new MapBeanDefinitionParser());
      		registerBeanDefinitionParser("properties", new PropertiesBeanDefinitionParser());
      	}
    
META-INF/spring.handlers(Spring 命名空间处理器,多个jar下)
  • http://www.springframework.org/schema/p=org.springframework.beans.factory.xml.SimplePropertyNamespaceHandler,

  • http://www.springframework.org/schema/mvc=org.springframework.web.servlet.config.MvcNamespaceHandler,

  • http://www.springframework.org/schema/util=org.springframework.beans.factory.xml.UtilNamespaceHandler,

  • http://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler,

  • http://www.springframework.org/schema/websocket=org.springframework.web.socket.config.WebSocketNamespaceHandler,

  • http://www.springframework.org/schema/aop=org.springframework.aop.config.AopNamespaceHandler,

  • http://www.springframework.org/schema/oxm=org.springframework.oxm.config.OxmNamespaceHandler,

  • http://www.springframework.org/schema/jdbc=org.springframework.jdbc.config.JdbcNamespaceHandler,

  • http://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler,

  • http://www.springframework.org/schema/c=org.springframework.beans.factory.xml.SimpleConstructorNamespaceHandler,

  • http://www.springframework.org/schema/tx=org.springframework.transaction.config.TxNamespaceHandler,

  • http://www.springframework.org/schema/jms=org.springframework.jms.config.JmsNamespaceHandler,

  • http://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler,

  • http://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler,

  • http://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值