`
gstarwd
  • 浏览: 1524948 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring有三种启动方式,

    博客分类:
  • SSH
阅读更多

spring有三种启动方式,使用

  • ContextLoaderServlet
  • ContextLoaderListener
  • ContextLoaderPlugIn

看一下ContextLoaderListener的源码,这是一个ServletContextListener

/**
  * Initialize the root web application context.
  */
 public void contextInitialized(ServletContextEvent event) {
  this.contextLoader = createContextLoader();
  this.contextLoader.initWebApplicationContext(event.getServletContext());
 }
 
  /**
  * Create the ContextLoader to use. Can be overridden in subclasses.
  * @return the new ContextLoader
  */
 protected ContextLoader createContextLoader() {
  return new ContextLoader();
 }

 contextLoader的源码
 public WebApplicationContext initWebApplicationContext(ServletContext servletContext)
   throws BeansException {

  long startTime = System.currentTimeMillis();
  if (logger.isInfoEnabled()) {
   logger.info("Root WebApplicationContext: initialization started");
  }
  servletContext.log("Loading Spring root WebApplicationContext");

  try {
   // Determine parent for root web application context, if any.
   ApplicationContext parent = loadParentContext(servletContext);

   WebApplicationContext wac = createWebApplicationContext(servletContext, parent);
   servletContext.setAttribute(
     WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);

   if (logger.isInfoEnabled()) {
    logger.info("Using context class [" + wac.getClass().getName() +
      "] for root WebApplicationContext");
   }
   if (logger.isDebugEnabled()) {
    logger.debug("Published root WebApplicationContext [" + wac +
      "] as ServletContext attribute with name [" +
      WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]");
   }

   if (logger.isInfoEnabled()) {
    long elapsedTime = System.currentTimeMillis() - startTime;
    logger.info("Root WebApplicationContext: initialization completed in " + elapsedTime + " ms");
   }

   return wac;
  }
  catch (RuntimeException ex) {
   logger.error("Context initialization failed", ex);
   servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);
   throw ex;
  }
  catch (Error err) {
   logger.error("Context initialization failed", err);
   servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err);
   throw err;
  }
 }
 注意WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,这里面放了WebApplicationContext,需要使用时从ServletContext取出
 可以使用WebApplicationContextUtils得到WebApplicationContext
 public static WebApplicationContext getWebApplicationContext(ServletContext sc) {
  Object attr = sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
  if (attr == null) {
   return null;
  }
  if (attr instanceof RuntimeException) {
   throw (RuntimeException) attr;
  }
  if (attr instanceof Error) {
   throw (Error) attr;
  }
  if (!(attr instanceof WebApplicationContext)) {
   throw new IllegalStateException("Root context attribute is not of type WebApplicationContext: " + attr);
  }
  return (WebApplicationContext) attr;
 }
 关键的问题在于struts如何启动的spring的,ContextLoaderPlugIn的源码
 
 // Publish the context as a servlet context attribute.
  String attrName = getServletContextAttributeName();
  getServletContext().setAttribute(attrName, wac);
 
 public String getServletContextAttributeName() {
  return SERVLET_CONTEXT_PREFIX + getModulePrefix();
 }
 


不同加载的Key竟然不同,原因就是WebApplicationContext放在那里的问题,可spring调用的时候会根据WebApplicationContext里面定义的那个名字去找的,问题出在这里


 在struts-config.xml中配置

 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
      <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
    </plug-in>

    <controller>
        <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor" />
    </controller>
 

 


 原理是这样的,Struts虽然只能有一个ActionServlet实例,但是对于不同的子应用分别能有自己的RequestProcessor实例每个RequestProcessor实例分别对应不同的struts配置文件。
   子应用的ProcessorClass类必须重写一般就是继承RequestProcessor类,然后再其配置文件的controller元素中的<processorClass>属性中作出修改。那么当
  getRequestProcessor(getModuleConfig(request)).process(request,response); 就能根据request选择相应的moduleconfig,再根据其<processorClass>属性选择相应的 RequestProcessor子类来处理相应的请求了。

 

 

 

 

==================

初探spring applicationContext在web容器中加载过程

转载自www.javaworld.com.tw 袁杰 原文

首先从WEB.XML入手

==>web.xml

1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            19

            20

            21

            22

            23

            24

            25

            26

            

<context-param>
            <param-name>webAppRootKey</param-name>
            <param-value>task.root</param-value>
            </context-param>
            <!-- 定义SPRING配置文件 -->
            
            <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/taskContext*.xml</param-value>
            </context-param>
            


            <context-param>
            <param-name>log4jConfigLocation</param-name>
            <param-value>/WEB-INF/log4j.properties</param-value>
            </context-param>
            <!-- 定义LOG4J监听器 -->
            <listener>
            <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
            </listener>
             
            <!-- 定义SPRING监听器 -->
            
            <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
            </listener>
            


            


进入contextLoaderListener看看到底加载时做了甚么
==>org.springframework.web.context.ContextLoaderListener

1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            19

            20

            21

            22

            23

            24

            25

            26

            27

            28

            29

            30

            31

            32

            33

            34

            35

            36

            37

            38

            39

            40

            41

            42

            

public



 class



 ContextLoaderListener implements



 ServletContextListener {


             
            private



 ContextLoader contextLoader;
             
            /**
            * Initialize the root web application context.
            */


            //当WEB上下文初始化时,系统会调用此方法


            public



 void



 contextInitialized(ServletContextEvent event) {


            this.contextLoader = createContextLoader();
             
            
            //监听到WEB上下文初始化的时候执行SPRING上下文contextLoader的初始化工作


            this.contextLoader.initWebApplicationContext(event.getServletContext());
            


            }


             
            /**
            * Create the ContextLoader to use. Can be overridden in subclasses.
            * @return the new ContextLoader
            */


            protected



 ContextLoader createContextLoader() {


            return



 new



 ContextLoader();
            }


             
            /**
            * Return the ContextLoader used by this listener.
            */


            public



 ContextLoader getContextLoader() {


            return



 contextLoader;
            }


             
            /**
            * Close the root web application context.
            */


            public



 void



 contextDestroyed(ServletContextEvent event) {


            if



 (this.contextLoader != null



) {


            this.contextLoader.closeWebApplicationContext(event.getServletContext());
            }


            }


             
            }


            


看一下是怎么来初始化webapplicationContext的
==>contextLoader.initWebApplicationContext

1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            19

            20

            21

            22

            23

            24

            25

            26

            27

            28

            29

            30

            31

            32

            33

            34

            35

            36

            37

            38

            39

            40

            41

            42

            43

            44

            45

            46

            47

            48

            49

            50

            51

            52

            53

            54

            55

            56

            57

            58

            59

            60

            

public



 WebApplicationContext initWebApplicationContext(ServletContext servletContext)
            throws



 IllegalStateException, BeansException {


             
            if



 (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null



) {


            throw



 new



 IllegalStateException(
            "Cannot initialize context because there is already a root application context 


             
            present - " +


            "check whether you have multiple ContextLoader* definitions in your web.xml!"

);
            }


             
            long



 startTime = System.currentTimeMillis();
            if



 (logger.isInfoEnabled()) {


            logger.info("Root WebApplicationContext: initialization started"

);
            }


            servletContext.log("Loading Spring root WebApplicationContext"

);
             
            try



 {


            // Determine parent for root web application context, if any.


            ApplicationContext parent = loadParentContext(servletContext);
             
            // Store context in local instance variable, to guarantee that


            // it is available on ServletContext shutdown.


             
            
            //创建web上下文


            this.context = createWebApplicationContext(servletContext, parent);
            servletContext.setAttribute(
            WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
            


             
            if



 (logger.isInfoEnabled()) {


            logger.info("Using context class ["

 + this.context.getClass().getName() +
            "] for root WebApplicationContext"

);
            }


            if



 (logger.isDebugEnabled()) {


            logger.debug("Published root WebApplicationContext ["

 + this.context +
            "] as ServletContext attribute with name ["

 +
            WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]"

);
            }


            if



 (logger.isInfoEnabled()) {


            long



 elapsedTime = System.currentTimeMillis() - startTime;
            logger.info("Root WebApplicationContext: initialization completed in "

 + elapsedTime + " 


             
            ms");


            }


             
            return



 this.context;
            }


            catch



 (RuntimeException ex) {


            logger.error("Context initialization failed"

, ex);
            servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);
            throw



 ex;
            }


            catch



 (Error err) {


            logger.error("Context initialization failed"

, err);
            servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err);
            throw



 err;
            }


            }


            


==>contextLoader.createWebApplicationContext(servletContext, parent);

1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            19

            20

            21

            22

            23

            24

            25

            26

            

 protected



 WebApplicationContext createWebApplicationContext(
            ServletContext servletContext, ApplicationContext parent) throws



 BeansException {


            
            //根据servletContext来决定要实例化的WebApplicationContext


            Class contextClass = determineContextClass(servletContext);
            if



 (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) {


            throw



 new



 ApplicationContextException("Custom context class ["

 + contextClass.getName() +
            "] is not of type ConfigurableWebApplicationContext"

);
            }


            ConfigurableWebApplicationContext wac =
            (ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
            wac.setParent(parent);
            wac.setServletContext(servletContext);
             
            //得到WEB.XML中设置的SPRING配置文件位置


            String configLocation = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);
            if



 (configLocation != null



) {


            //把配置文件分段后设置到WebApplicationContext的ConfigLocations中


            wac.setConfigLocations(StringUtils.tokenizeToStringArray(configLocation,
            ConfigurableWebApplicationContext.CONFIG_LOCATION_DELIMITERS));
            }


            //刷新WebApplicationContext


            wac.refresh();
            


            return



 wac;
            }


            


==>contextLoader.determineContextClass(servletContext);

1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            19

            20

            21

            22

            23

            24

            25

            26

            27

            

protected



 Class determineContextClass(ServletContext servletContext) throws



 ApplicationContextException {


            
            //获得需要实例化的CONTEXT类名,在web.xml中有设置,如果没有设置,那么为空


            String contextClassName = servletContext.getInitParameter(CONTEXT_CLASS_PARAM);
            if



 (contextClassName != null



) {


            try



 {


            return



 ClassUtils.forName(contextClassName);
            }


            catch



 (ClassNotFoundException ex) {


            throw



 new



 ApplicationContextException(
            "Failed to load custom context class ["

 + contextClassName + "]"

, ex);
            }


            }


            //如果在spring web.xml中没有设置context类位置,那么取得默认context


            else



 {


            //取得defaultStrategies配置文件中的WebApplicationContext属性


            contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName());
            try



 {


            return



 ClassUtils.forName(contextClassName);
            }


            catch



 (ClassNotFoundException ex) {


            throw



 new



 ApplicationContextException(
            "Failed to load default context class ["

 + contextClassName + "]"

, ex);
            }


            }


            


            }


            


SPRING上下文默认的策略是甚么呢?
==>contextLoader.defaultStrategies

1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            

  private



 static



 final



 Properties defaultStrategies;
             
            static



 {


            // Load default strategy implementations from properties file.


            // This is currently strictly internal and not meant to be customized


            // by application developers.


            try



 {


            
            //设置classpath为contextLoader同级目录


            ClassPathResource resource = new



 ClassPathResource(DEFAULT_STRATEGIES_PATH, ContextLoader.class);
            //加载该目录下的所有properties文件


            defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
            


            }


            catch



 (IOException ex) {


            throw



 new



 IllegalStateException("Could not load 'ContextLoader.properties': "

 + ex.getMessage());
            }


            }


            


找到同级目录下的配置文件
==>ContextLoader.properties

1

            2

            3

            4

            5

            6

            7

            8

            

# Default WebApplicationContext implementation class



 for



 ContextLoader.
            # Used as fallback when no explicit context implementation has been specified as context-param.
            # Not meant to be customized by application developers.
             
            
            #默认的WebApplicationContext为org.springframework.web.context.support.XmlWebApplicationContext
            org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext
            


            


==>org.springframework.web.context.support.XmlWebApplicationContext

1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            19

            20

            21

            22

            23

            24

            25

            26

            27

            28

            29

            30

            31

            32

            33

            34

            35

            36

            37

            38

            39

            40

            41

            42

            43

            44

            45

            46

            47

            48

            49

            50

            51

            52

            53

            54

            55

            56

            57

            58

            59

            60

            61

            62

            63

            64

            65

            66

            67

            68

            69

            70

            71

            72

            73

            74

            75

            76

            77

            78

            79

            80

            81

            82

            83

            84

            85

            86

            87

            88

            89

            90

            91

            92

            93

            

public



 class



 XmlWebApplicationContext extends



 AbstractRefreshableWebApplicationContext {


             
            /** Default config location for the root context */


             
            
            //配置了默认的spring配置文件


            public



 static



 final



 String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml"

;
            


             
            //配置文件默认BUILD路径


            public



 static



 final



 String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB-INF/"

;
             
            //配置文件默认后缀名


            public



 static



 final



 String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml"

;
             
            /**
            * Loads the bean definitions via an XmlBeanDefinitionReader.
            * @see org.springframework.beans.factory.xml.XmlBeanDefinitionReader
            * @see #initBeanDefinitionReader
            * @see #loadBeanDefinitions
            */


            //获得bean配置


            protected



 void



 loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws



 IOException {


            //从BEAN工厂获得一个XmlBeanDefinitionReader 来读取SPRING配置文件


            XmlBeanDefinitionReader beanDefinitionReader = new



 XmlBeanDefinitionReader(beanFactory);
             
            //设置beanDefinitionReader服务于当前CONTEXT


            // resource loading environment.


            beanDefinitionReader.setResourceLoader(this



);
            beanDefinitionReader.setEntityResolver(new



 ResourceEntityResolver(this



));
             
            // Allow a subclass to provide custom initialization of the reader,


            // then proceed with actually loading the bean definitions.


            initBeanDefinitionReader(beanDefinitionReader);
            
            //读取配置文件


            loadBeanDefinitions(beanDefinitionReader);
            


            }


             
            /**
            * Initialize the bean definition reader used for loading the bean
            * definitions of this context. Default implementation is empty.
            * <p>Can be overridden in subclasses, e.g. for turning off XML validation
            * or using a different XmlBeanDefinitionParser implementation.
            * @param beanDefinitionReader the bean definition reader used by this context
            * @see org.springframework.beans.factory.xml.XmlBeanDefinitionReader#setValidationMode
            * @see org.springframework.beans.factory.xml.XmlBeanDefinitionReader#setDocumentReaderClass
            */


            protected



 void



 initBeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader) {


            }


             
            /**
            * Load the bean definitions with the given XmlBeanDefinitionReader.
            * <p>The lifecycle of the bean factory is handled by the refreshBeanFactory method;
            * therefore this method is just supposed to load and/or register bean definitions.
            * <p>Delegates to a ResourcePatternResolver for resolving location patterns
            * into Resource instances.
            * @throws org.springframework.beans.BeansException in case of bean registration errors
            * @throws java.io.IOException if the required XML document isn't found
            * @see #refreshBeanFactory
            * @see #getConfigLocations
            * @see #getResources
            * @see #getResourcePatternResolver
            */


            
            //读取配置文件


            protected



 void



 loadBeanDefinitions(XmlBeanDefinitionReader reader) throws



 BeansException, IOException {


            String[] configLocations = getConfigLocations();
            if



 (configLocations != null



) {


            for



 (int



 i = 0; i < configLocations.length; i++) {


            reader.loadBeanDefinitions(configLocations[i]);
            }


            }


            }


            


             
            /**
            * The default location for the root context is "/WEB-INF/applicationContext.xml",
            * and "/WEB-INF/test-servlet.xml" for a context with the namespace "test-servlet"
            * (like for a DispatcherServlet instance with the servlet-name "test").
            */


            //获得默认的ConfigLocations


            protected



 String[] getDefaultConfigLocations() {


            if



 (getNamespace() != null



) {


            return



 new



 String[] {

DEFAULT_CONFIG_LOCATION_PREFIX + getNamespace() +
             
            DEFAULT_CONFIG_LOCATION_SUFFIX}

;
            }


            else



 {


            return



 new



 String[] {

DEFAULT_CONFIG_LOCATION}

;
            }


            }


            


==>AbstractBeanDefinitionReader.loadBeanDefinitions()

1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            19

            20

            21

            22

            23

            24

            25

            26

            27

            28

            29

            30

            31

            32

            33

            34

            35

            

public



 int



 loadBeanDefinitions(String location) throws



 BeanDefinitionStoreException {


            ResourceLoader resourceLoader = getResourceLoader();
            if



 (resourceLoader == null



) {


            throw



 new



 BeanDefinitionStoreException(
            "Cannot import bean definitions from location ["

 + location + "]: no ResourceLoader available"

);
            }


             
            if



 (resourceLoader instanceof



 ResourcePatternResolver) {


            // Resource pattern matching available.


            try



 {


            
            //根据配置文件读取相应配置


            Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);
            


            int



 loadCount = loadBeanDefinitions(resources);
            if



 (logger.isDebugEnabled()) {


            logger.debug("Loaded "

 + loadCount + " bean definitions from location pattern ["

 + location + "]"

);
            }


            return



 loadCount;
            }


            catch



 (IOException ex) {


            throw



 new



 BeanDefinitionStoreException(
            "Could not resolve bean definition resource pattern ["

 + location + "]"

, ex);
            }


            }


            else



 {


            // Can only load single resources by absolute URL.


            Resource resource = resourceLoader.getResource(location);
            int



 loadCount = loadBeanDefinitions(resource);
            if



 (logger.isDebugEnabled()) {


            logger.debug("Loaded "

 + loadCount + " bean definitions from location ["

 + location + "]"

);
            }


            return



 loadCount;
            }


            }


            


这个是其中一个ResourceLoader的实现
==>PathMatchingResourcePatternResolver.getResources(String locationPattern);

1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            19

            20

            21

            22

            23

            24

            25

            26

            27

            28

            29

            

 public



 Resource[] getResources(String locationPattern) throws



 IOException {


            Assert.notNull(locationPattern, "Location pattern must not be null"

);
            if



 (locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)) {


            // a class path resource (multiple resources for same name possible)


            
            if



 (getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()))) {


            // a class path resource pattern


            return



 findPathMatchingResources(locationPattern);
            }


            else



 {


            // all class path resources with the given name


            return



 findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()));
            }


            


            }


            else



 {


            // Only look for a pattern after a prefix here


            // (to not get fooled by a pattern symbol in a strange prefix).


            int



 prefixEnd = locationPattern.indexOf(":"

) + 1;
            if



 (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) {


            // a file pattern


            return



 findPathMatchingResources(locationPattern);
            }


            else



 {


            // a single resource with the given name


            return



 new



 Resource[] {

getResourceLoader().getResource(locationPattern)}

;
            }


            }


            }


            



==>PathMatchingResourcePatternResolver.findPathMatchingResources(String locationPattern);

1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            19

            20

            21

            22

            

 protected



 Resource[] findPathMatchingResources(String locationPattern) throws



 IOException {


            String rootDirPath = determineRootDir(locationPattern);
            String subPattern = locationPattern.substring(rootDirPath.length());
            Resource[] rootDirResources = getResources(rootDirPath);
            
            //collectionFactory初始化一个set容量为16


            Set result = CollectionFactory.createLinkedSetIfPossible(16);
            for



 (int



 i = 0; i < rootDirResources.length; i++) {


            Resource rootDirResource = rootDirResources[i];
            if



 (isJarResource(rootDirResource)) {


            result.addAll(doFindPathMatchingJarResources(rootDirResource, subPattern));
            }


            else



 {


            result.addAll(doFindPathMatchingFileResources(rootDirResource, subPattern));
            }


            }


            


            if



 (logger.isDebugEnabled()) {


            logger.debug("Resolved location pattern ["

 + locationPattern + "] to resources "

 + result);
            }


            return



 (Resource[]) result.toArray(new



 Resource[result.size()]);
            }


            



前面说到有一个刷新WebApplicationContext的操作,但是XmlWebApplicationContext 并没有实现refresh方法,而方法的实现写在

AbstractRefreshableWebApplicationContext 中

==>AbstractRefreshableWebApplicationContext.refresh();

1

            2

            3

            4

            5

            6

            7

            

public



 void



 refresh() throws



 BeansException {


            if



 (ObjectUtils.isEmpty(getConfigLocations())) {


            //设置configLocations为默认的getDefaultConfigLocations()


            setConfigLocations(getDefaultConfigLocations());
            }


            super.refresh();
            }


            



==>AbstractApplicationContext.refresh();

1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            19

            20

            21

            22

            23

            24

            25

            26

            27

            28

            29

            30

            31

            32

            33

            34

            35

            36

            37

            38

            39

            40

            41

            42

            43

            44

            45

            46

            47

            48

            49

            50

            51

            52

            53

            54

            55

            56

            57

            58

            59

            60

            61

            62

            63

            64

            65

            66

            67

            68

            69

            70

            71

            72

            73

            74

            75

            76

            77

            78

            

public



 void



 refresh() throws



 BeansException, IllegalStateException {


            synchronized



 (this.startupShutdownMonitor) {


            this.startupTime = System.currentTimeMillis();
             
            synchronized



 (this.activeMonitor) {


            this.active = true



;
            }


             
            // Tell subclass to refresh the internal bean factory.


            refreshBeanFactory();
            ConfigurableListableBeanFactory beanFactory = getBeanFactory();
             
            // Tell the internal bean factory to use the context's class loader.


            beanFactory.setBeanClassLoader(getClassLoader());
             
            // Populate the bean factory with context-specific resource editors.


            beanFactory.addPropertyEditorRegistrar(new



 ResourceEditorRegistrar(this



));
             
            // Configure the bean factory with context semantics.


            beanFactory.addBeanPostProcessor(new



 ApplicationContextAwareProcessor(this



));
            beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
            beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
            beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
            beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
             
            // Allows post-processing of the bean factory in context subclasses.


            postProcessBeanFactory(beanFactory);
             
            // Invoke factory processors registered with the context instance.


            for



 (Iterator it = getBeanFactoryPostProcessors().iterator(); it.hasNext();) {


            BeanFactoryPostProcessor factoryProcessor = (BeanFactoryPostProcessor) it.next();
            factoryProcessor.postProcessBeanFactory(beanFactory);
            }


             
            if



 (logger.isInfoEnabled()) {


            if



 (getBeanDefinitionCount() == 0) {


            logger.info("No beans defined in application context ["

 + getDisplayName() + "]"

);
            }


            else



 {


            logger.info(getBeanDefinitionCount() + " beans defined in application context ["

 +
             
            getDisplayName() + "]"

);
            }


            }


             
            try



 {


            // Invoke factory processors registered as beans in the context.


            invokeBeanFactoryPostProcessors();
             
            // Register bean processors that intercept bean creation.


            registerBeanPostProcessors();
             
            // Initialize message source for this context.


            initMessageSource();
             
            // Initialize event multicaster for this context.


            initApplicationEventMulticaster();
             
            // Initialize other special beans in specific context subclasses.


            onRefresh();
             
            // Check for listener beans and register them.


            registerListeners();
             
            // Instantiate singletons this late to allow them to access the message source.


            beanFactory.preInstantiateSingletons();
             
            // Last step: publish corresponding event.


            publishEvent(new



 ContextRefreshedEvent(this



));
            }


             
            catch



 (BeansException ex) {


            // Destroy already created singletons to avoid dangling resources.


            beanFactory.destroySingletons();
            throw



 ex;
            }


            }


            }


            http://www.blogjava.net/run2u/archive/2007/11/07/158824.html
分享到:
评论

相关推荐

    spring boot三种启动方式.txt

    spring boot三种启动方式.txt

    spring配置和启动方式

    spring配置和启动方式 博客地址:https://blog.csdn.net/u010476739/article/details/76696756

    spring famework 配置启动方式

    本篇文章将深入探讨Spring Framework的两种主要配置启动方式:XML配置和注解配置,并通过具体的示例来阐述这两种方法。 首先,让我们从XML配置开始。在Spring早期版本中,XML配置是最常见的方式,它通过定义Bean的...

    spring boot如何指定启动端口

    Spring Boot 提供了两种方式来实现动态指定端口: 方式三-1:命令行方式 可以在命令行中使用以下命令来指定启动端口: `java -jar test.jar --server.port=8081` 这样,在启动 Spring Boot 应用程序时,端口号将...

    spring项目启动加载类到静态服务类中的三种方式.zip

    本教程将详细阐述三种不同的方式,将Spring项目启动时加载的类集成到静态服务类中。 1. **使用`ApplicationContextAware`接口** `ApplicationContextAware`是Spring提供的一个接口,它允许我们在类中注入...

    Spring启动完整流程图

    Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动...

    SpringCloud服务启动脚本

    SpringCloud微服务架构,启动脚本,动态输出日志,并指向启动日志脚本位置。

    spring学习:依赖注入的几种方式讨论

    Spring Boot引入了一种更智能的依赖注入方式——自动配置。自动配置是通过`@EnableAutoConfiguration`注解启动的,它根据项目中的类路径和特定条件自动配置Bean。例如,如果类路径下存在`MongoClient`的jar,Spring ...

    spring boot windows 启动脚本

    spring boot windows 启动脚本

    Spring 自启动项目demo

    当Spring容器加载时,它可以自动扫描指定包下的所有类,发现带有特定注解(如@Service、@Repository、@Component等)的类,并将它们作为Bean进行实例化。这些Bean在应用程序启动时会自动创建,无需手动调用new关键字...

    spring boot/spring cloud项目启动脚本,默认名称:start.sh

    linux服务器,springboot,spring cloud、spring cloud alibaba等项目启动脚本 下载脚本, 1,上传脚本至jar包同级目录 2,更改脚本: jar包名称 项目文件路径 日志路径(包含日志名称) 脚本已配置好jvm优化...

    spring获取weblogic jndi数据源的两种方式

    ### Spring 获取 WebLogic JNDI 数据源的两种方式 在Spring框架中,通过JNDI(Java Naming and Directory Interface)可以方便地访问WebLogic服务器中的数据源。这为应用程序提供了高度解耦的数据访问机制,使得...

    Java+Spring+Spring容器启动流程方法调用xmind脑图

    1. Spring容器的启动流程 2. 循环依赖 3. Spring 中Bean的创建 4. Spring 方法xmind脑图

    spring容器启动和关闭时事件监听

    spring容器启动和关闭时事件监听;spring容器启动和关闭时事件监听;spring容器启动和关闭时事件监听

    Spring-Boot启动Demo

    **Spring Boot启动方式详解** ...理解这两种启动方式有助于你根据项目需求做出合适的选择。在实践中,你可以根据描述中的`demo-war`进一步学习和实践Spring Boot的war打包和部署过程,从而加深对这一启动方式的理解。

    spring的三种任务调度实现方式lib

    Spring提供了三种主要的任务调度实现方式:Spring内置的任务调度器(TaskScheduler),Quartz Scheduler,以及Spring Batch。下面我们将详细介绍这三种方式。 1. Spring内置的任务调度器(TaskScheduler) Spring...

    spring boot部署启动脚本

    标题中的“Spring Boot部署启动脚本”指的是在Spring Boot应用开发完成后,为了自动化部署和启动应用程序而创建的脚本。Spring Boot是一个简化Spring应用程序开发的框架,它提倡“开箱即用”的理念,使得开发者可以...

    spring和quartz的定时器的启动和停止例子

    Spring提供了一种集成Quartz的方式,使得我们可以方便地在Spring应用中管理和执行定时任务。本篇将深入探讨如何在Spring中启动和停止Quartz定时器。 首先,我们需要理解Spring和Quartz的基本概念。Spring是一个强大...

    82. Spring Boot – 启动彩蛋【从零开始学Spring Boot】

    Spring Boot – 启动彩蛋"这一主题,这属于Spring Boot框架的一部分,该框架简化了Java应用程序的创建和管理。启动彩蛋是开发人员为了增加趣味性或者隐藏信息而在软件中设置的小秘密,通常需要特定的触发条件才能...

Global site tag (gtag.js) - Google Analytics