java:20: 错误: java错误找不到符号号 printAL(a);

&h2&&b&Spring5源码解析-Spring中的应用上下文&/b&&/h2&&p&之前讲到过,Spring中的 beans生活(用这俩字觉得更形象具体)在其应用程序的上下文环境中。在本文中,我们将详细介绍应用程序上下文,另外此篇同样是&a href=&/?target=https%3A//muyinchen.github.io//%25E7%%25E5%259F%259F%25E8%E7%25B3%25BB%25E5%%25E7%259A%%E9%%25E5%E6%259E%2590/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&由域联系到的逃逸分析&i class=&icon-external&&&/i&&/a&的关于Spring容器的续篇。&/p&&p&关于&a href=&/?target=https%3A//muyinchen.github.io//Spring5%25E6%25BA%%25A0%%25A7%25A3%25E6%259E%2590-%40Autowired/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Spring5源码解析-@Autowired&i class=&icon-external&&&/i&&/a&这篇文章讲了通过@Autowired注解进行依赖注入。这一次我们来探讨&b&应用程序上下文(application context)&/b&的概念。在第一部分中,我们来看看所有Spring管理的bean生活在什么样的环境中。在第二部分,来分析下到负责上下文管理的类。在最后一部分中,我们来进行一些实践操作。&/p&&p&&br&&/p&&h2&&b&什么是Spring的应用程序上下文?&/b&&/h2&&p&众所周知,Spring管理的这些类被称为bean,并且生活在Spring容器中。bean处理程序的最基本实现是&b&bean factory&/b&。作为&b&org.springframework.beans.factory.BeanFactory&/b&接口的&b&实现类&/b&,这是一个初始化,配置和管理bean的容器。但通常在Spring应用程序中仅使用BeanFactory是不够的。它出现在&b&应用程序上下文中&/b&。&/p&&p&应用程序上下文(Application context)是一种面向企业化(其实Spring文档里也有面向企业这一说,不过这不就是企业里流水线的工厂里才能有的东西么)的bean工厂。作为标准bean工厂,它是bean class生活的空间。但与标准bean工厂不同,应用程序上下文提供了一个补充企业层(也就是通用的东西了,比如企业里的胸牌,服装等)。又迷糊了吧,举个例子 :例如,通过提供国际化,转换服务或事件传播,使我们省去很多麻烦去亲自处理。通常,应用程序上下文优于bean工厂。但它的唯一缺点是内存消耗比bean工厂大,出现这种情况是由于补充的服务。如果内存的使用对于你的程序要求非常苛刻(例如在applet或移动环境中),请考虑更多使用bean factory。否则,在更标准的应用程序中,应使用应用程序上下文(application context)。&/p&&p&&br&&/p&&h2&&b&Spring的应用程序上下文类&/b&&/h2&&p&想要了解Spring中应用程序上下文,关键部分就是&b&org.springframework.context.ApplicationContext&/b&接口。它扩展了一些其他接口:&/p&&ul&&li&&b&org.springframework.core.env.EnvironmentCapable&/b&:用于标记对象来对外暴露自己说我实现了&b&Environment&/b&接口。根据这个接口的注释可以知道,它主要用于完成类型的检查。&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&cm&&/**&/span&
&span class=&cm&& * Interface indicating a component that contains and exposes an {@link Environment} reference.&/span&
&span class=&cm&& *
注释说了很清晰明了了,就不多废话了&/span&
&span class=&cm&& * &p&All Spring application contexts are EnvironmentCapable, and the interface is used primarily&/span&
&span class=&cm&& * for performing {@code instanceof} checks in framework methods that accept BeanFactory&/span&
&span class=&cm&& * instances that may or may not actually be ApplicationContext instances in order to interact&/span&
&span class=&cm&& * with the environment if indeed it is available.&/span&
&span class=&cm&& *&/span&
&span class=&cm&& * &p&As mentioned, {@link org.springframework.context.ApplicationContext ApplicationContext}&/span&
&span class=&cm&& * extends EnvironmentCapable, and thus exposes a {@link #getEnvironment()} however,&/span&
&span class=&cm&& * {@link org.springframework.context.ConfigurableApplicationContext ConfigurableApplicationContext}&/span&
&span class=&cm&& * redefines {@link org.springframework.context.ConfigurableApplicationContext#getEnvironment&/span&
&span class=&cm&& * getEnvironment()} and narrows the signature to return a {@link ConfigurableEnvironment}.&/span&
&span class=&cm&& * The effect is that an Environment object is 'read-only' until it is being accessed from&/span&
&span class=&cm&& * a ConfigurableApplicationContext, at which point it too may be configured.&/span&
&span class=&cm&& *&/span&
&span class=&cm&& * @author Chris Beams&/span&
&span class=&cm&& * @since 3.1&/span&
&span class=&cm&& * @see Environment&/span&
&span class=&cm&& * @see ConfigurableEnvironment&/span&
&span class=&cm&& * @see org.springframework.context.ConfigurableApplicationContext#getEnvironment()&/span&
&span class=&cm&& */&/span&
&span class=&kd&&public&/span& &span class=&kd&&interface&/span& &span class=&nc&&EnvironmentCapable&/span& &span class=&o&&{&/span&
&span class=&cm&&/**&/span&
&span class=&cm&&
* Return the {@link Environment} associated with this component&/span&
&span class=&cm&&
* (may be {@code null} or a default environment).&/span&
&span class=&cm&&
&span class=&n&&Environment&/span& &span class=&nf&&getEnvironment&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&ul&&li&&b&org.springframework.beans.factory.ListableBeanFactory&/b&:通过继承该interface可以列出所有bean,也可以只列出与预期类型相对应的bean。&/li&&li&&b&org.springframework.beans.factory.HierarchicalBeanFactory&/b&:支持分层bean的管理。&/li&&li&&b&org.springframework.context.MessageSource&/b&:用来解决消息支持国际化。&/li&&li&&b&org.springframework.context.ApplicationEventPublisher&/b&:通过该接口,可以允许通知所有类来监听到某些应用程序上下文事件。&/li&&li&&b&org.springframework.core.io.support.ResourcePatternResolver&/b&:是一个有助于将资源地址(例如:classpath:/WEB-INF/web.xml)解析到&b&org.springframework.core.io.Resource&/b&对象中的策略接口。&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&cm&&/**&/span&
&span class=&cm&& * Central interface to provide configuration for an application.&/span&
&span class=&cm&& * This is read-only while the application is running, but may be&/span&
&span class=&cm&& * reloaded if the implementation supports this.&/span&
&span class=&cm&& *&/span&
&span class=&cm&& * &p&An ApplicationContext provides:&/span&
&span class=&cm&& * &ul&
请看所扩展相关各个接口功能的描述&/span&
&span class=&cm&& * &li&Bean factory methods for accessing application components.&/span&
&span class=&cm&& * Inherited from {@link org.springframework.beans.factory.ListableBeanFactory}.&/span&
&span class=&cm&& * &li&The ability to load file resources in a generic fashion.&/span&
&span class=&cm&& * Inherited from the {@link org.springframework.core.io.ResourceLoader} interface.&/span&
&span class=&cm&& * &li&The ability to publish events to registered listeners.&/span&
&span class=&cm&& * Inherited from the {@link ApplicationEventPublisher} interface.&/span&
&span class=&cm&& * &li&The ability to resolve messages, supporting internationalization.&/span&
&span class=&cm&& * Inherited from the {@link MessageSource} interface.&/span&
&span class=&cm&& * &li&Inheritance from a parent context. Definitions in a descendant context&/span&
&span class=&cm&& * will always take priority. This means, for example, that a single parent&/span&
&span class=&cm&& * context can be used by an entire web application, while each servlet has&/span&
&span class=&cm&& * its own child context that is independent of that of any other servlet.&/span&
&span class=&cm&& * &/ul&&/span&
&span class=&cm&& *&/span&
&span class=&cm&& * &p&In addition to standard {@link org.springframework.beans.factory.BeanFactory}&/span&
&span class=&cm&& * lifecycle capabilities, ApplicationContext implementations detect and invoke&/span&
&span class=&cm&& * {@link ApplicationContextAware} beans as well as {@link ResourceLoaderAware},&/span&
&span class=&cm&& * {@link ApplicationEventPublisherAware} and {@link MessageSourceAware} beans.&/span&
&span class=&cm&& *&/span&
&span class=&cm&& * @author Rod Johnson&/span&
&span class=&cm&& * @author Juergen Hoeller&/span&
&span class=&cm&& * @see ConfigurableApplicationContext&/span&
&span class=&cm&& * @see org.springframework.beans.factory.BeanFactory&/span&
&span class=&cm&& * @see org.springframework.core.io.ResourceLoader&/span&
&span class=&cm&& */&/span&
&span class=&kd&&public&/span& &span class=&kd&&interface&/span& &span class=&nc&&ApplicationContext&/span& &span class=&kd&&extends&/span& &span class=&n&&EnvironmentCapable&/span&&span class=&o&&,&/span& &span class=&n&&ListableBeanFactory&/span&&span class=&o&&,&/span& &span class=&n&&HierarchicalBeanFactory&/span&&span class=&o&&,&/span&
&span class=&n&&MessageSource&/span&&span class=&o&&,&/span& &span class=&n&&ApplicationEventPublisher&/span&&span class=&o&&,&/span& &span class=&n&&ResourcePatternResolver&/span& &span class=&o&&{&/span&
&/code&&/pre&&/div&&p&对于我们来说,实现这些接口使应用程序上下文比一个简单的bean工厂更有用。我们通过&b&org.springframework.web.context.support.XmlWebApplicationContext&/b&这个实现类来看其在Web应用程序中使用。此类扩展了同一个包下AbstractRefreshableWebApplicationContext这个抽象类。&/p&&p&XmlWebApplicationContext实现了AbstractRefreshableApplicationContext中的抽象方法loadBeanDefinitions,用于读取所有bean。从这个方法实现,可以看出,所有的bean都是通过&b&org.springframework.beans.factory.xml.XmlBeanDefinitionReader&/b&从XML文件读取的。&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&cm&&/**&/span&
&span class=&cm&& * Loads the bean definitions via an XmlBeanDefinitionReader.&/span&
&span class=&cm&& * @see org.springframework.beans.factory.xml.XmlBeanDefinitionReader&/span&
&span class=&cm&& * @see #initBeanDefinitionReader&/span&
&span class=&cm&& * @see #loadBeanDefinitions&/span&
&span class=&cm&& */&/span&
&span class=&nd&&@Override&/span&
&span class=&kd&&protected&/span& &span class=&kt&&void&/span& &span class=&nf&&loadBeanDefinitions&/span&&span class=&o&&(&/span&&span class=&n&&DefaultListableBeanFactory&/span& &span class=&n&&beanFactory&/span&&span class=&o&&)&/span& &span class=&kd&&throws&/span& &span class=&n&&BeansException&/span&&span class=&o&&,&/span& &span class=&n&&IOException&/span& &span class=&o&&{&/span&
&span class=&c1&&// Create a new XmlBeanDefinitionReader for the given BeanFactory.&/span&
&span class=&c1&&//只能说Spring源码注释的太详细了,英文确实很重要&/span&
&span class=&n&&XmlBeanDefinitionReader&/span& &span class=&n&&beanDefinitionReader&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&XmlBeanDefinitionReader&/span&&span class=&o&&(&/span&&span class=&n&&beanFactory&/span&&span class=&o&&);&/span&
&span class=&c1&&// Configure the bean definition reader with this context's&/span&
&span class=&c1&&// resource loading environment.&/span&
&span class=&n&&beanDefinitionReader&/span&&span class=&o&&.&/span&&span class=&na&&setEnvironment&/span&&span class=&o&&(&/span&&span class=&n&&getEnvironment&/span&&span class=&o&&());&/span&
&span class=&n&&beanDefinitionReader&/span&&span class=&o&&.&/span&&span class=&na&&setResourceLoader&/span&&span class=&o&&(&/span&&span class=&k&&this&/span&&span class=&o&&);&/span&
&span class=&n&&beanDefinitionReader&/span&&span class=&o&&.&/span&&span class=&na&&setEntityResolver&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&ResourceEntityResolver&/span&&span class=&o&&(&/span&&span class=&k&&this&/span&&span class=&o&&));&/span&
&span class=&c1&&// Allow a subclass to provide custom initialization of the reader,&/span&
&span class=&c1&&// then proceed with actually loading the bean definitions.&/span&
&span class=&n&&initBeanDefinitionReader&/span&&span class=&o&&(&/span&&span class=&n&&beanDefinitionReader&/span&&span class=&o&&);&/span&
&span class=&n&&loadBeanDefinitions&/span&&span class=&o&&(&/span&&span class=&n&&beanDefinitionReader&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&另一个有趣的方法,继承自AbstractRefreshableWebApplicationContext,是postProcessBeanFactory。它在加载所有bean定义之后并在其实例化之前被调用(postProcess就是bean构造函数之后调用即实例化之前)。AbstractRefreshableWebApplicationContext使用它来注册请求和会话作用域以及环境bean(具体看下面源码)。另外,这个抽象类实现了ConfigurableWebApplicationContext接口,这样一来就可以定义servlet的上下文和一些本地的配置。&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&cm&&/**&/span&
&span class=&cm&&
* Register request/session scopes, a {@link ServletContextAwareProcessor}, etc.&/span&
&span class=&cm&&
&span class=&nd&&@Override&/span&
&span class=&kd&&protected&/span& &span class=&kt&&void&/span& &span class=&nf&&postProcessBeanFactory&/span&&span class=&o&&(&/span&&span class=&n&&ConfigurableListableBeanFactory&/span& &span class=&n&&beanFactory&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&addBeanPostProcessor&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&ServletContextAwareProcessor&/span&&span class=&o&&(&/span&&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&servletContext&/span&&span class=&o&&,&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&servletConfig&/span&&span class=&o&&));&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&ignoreDependencyInterface&/span&&span class=&o&&(&/span&&span class=&n&&ServletContextAware&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&);&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&ignoreDependencyInterface&/span&&span class=&o&&(&/span&&span class=&n&&ServletConfigAware&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&);&/span&
&span class=&n&&WebApplicationContextUtils&/span&&span class=&o&&.&/span&&span class=&na&&registerWebApplicationScopes&/span&&span class=&o&&(&/span&&span class=&n&&beanFactory&/span&&span class=&o&&,&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&servletContext&/span&&span class=&o&&);&/span&
&span class=&n&&WebApplicationContextUtils&/span&&span class=&o&&.&/span&&span class=&na&&registerEnvironmentBeans&/span&&span class=&o&&(&/span&&span class=&n&&beanFactory&/span&&span class=&o&&,&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&servletContext&/span&&span class=&o&&,&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&servletConfig&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&nd&&@Override&/span&
&span class=&nd&&@Nullable&/span&
&span class=&kd&&public&/span& &span class=&n&&ServletContext&/span& &span class=&nf&&getServletContext&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&servletContext&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&nd&&@Override&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&setServletConfig&/span&&span class=&o&&(&/span&&span class=&nd&&@Nullable&/span& &span class=&n&&ServletConfig&/span& &span class=&n&&servletConfig&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&servletConfig&/span& &span class=&o&&=&/span& &span class=&n&&servletConfig&/span&&span class=&o&&;&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&servletConfig&/span& &span class=&o&&!=&/span& &span class=&kc&&null&/span& &span class=&o&&&&&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&servletContext&/span& &span class=&o&&==&/span& &span class=&kc&&null&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&setServletContext&/span&&span class=&o&&(&/span&&span class=&n&&servletConfig&/span&&span class=&o&&.&/span&&span class=&na&&getServletContext&/span&&span class=&o&&());&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&span class=&nd&&@Override&/span&
&span class=&nd&&@Nullable&/span&
&span class=&kd&&public&/span& &span class=&n&&ServletConfig&/span& &span class=&nf&&getServletConfig&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&servletConfig&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&cm&&/**&/span&
&span class=&cm&&
* {@inheritDoc}&/span&
&span class=&cm&&
* &p&Replace {@code Servlet}-related property sources.&/span&
&span class=&cm&&
&span class=&nd&&@Override&/span&
&span class=&kd&&protected&/span& &span class=&kt&&void&/span& &span class=&nf&&initPropertySources&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&n&&ConfigurableEnvironment&/span& &span class=&n&&env&/span& &span class=&o&&=&/span& &span class=&n&&getEnvironment&/span&&span class=&o&&();&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&env&/span& &span class=&k&&instanceof&/span& &span class=&n&&ConfigurableWebEnvironment&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&o&&((&/span&&span class=&n&&ConfigurableWebEnvironment&/span&&span class=&o&&)&/span& &span class=&n&&env&/span&&span class=&o&&).&/span&&span class=&na&&initPropertySources&/span&&span class=&o&&(&/span&&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&servletContext&/span&&span class=&o&&,&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&servletConfig&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&由XmlWebApplicationContext间接继承的另一个抽象类是AbstractRefreshableApplicationContext。它有几种处理上下文刷新的方法。处理事件通知的类是&b&org.springframework.context.support.AbstractApplicationContext&/b&,由XmlWebApplicationContext间接继承。它包含一个将事件(ApplicationEvent类的实例)发送到所有侦听对象的publishEvent方法。&/p&&p&但是我们的重中之重是处理生命周期,是AbstractApplicationContext类的public void refresh() throws BeansException, IllegalStateException方法来做到的。&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&nd&&@Override&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&refresh&/span&&span class=&o&&()&/span& &span class=&kd&&throws&/span& &span class=&n&&BeansException&/span&&span class=&o&&,&/span& &span class=&n&&IllegalStateException&/span& &span class=&o&&{&/span&
&span class=&kd&&synchronized&/span& &span class=&o&&(&/span&&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&startupShutdownMonitor&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&c1&&// Prepare this context for refreshing.&/span&
&span class=&n&&prepareRefresh&/span&&span class=&o&&();&/span&
&span class=&c1&&// Tell the subclass to refresh the internal bean factory.&/span&
&span class=&n&&ConfigurableListableBeanFactory&/span& &span class=&n&&beanFactory&/span& &span class=&o&&=&/span& &span class=&n&&obtainFreshBeanFactory&/span&&span class=&o&&();&/span&
&span class=&c1&&// Prepare the bean factory for use in this context.&/span&
&span class=&n&&prepareBeanFactory&/span&&span class=&o&&(&/span&&span class=&n&&beanFactory&/span&&span class=&o&&);&/span&
&span class=&k&&try&/span& &span class=&o&&{&/span&
&span class=&c1&&// Allows post-processing of the bean factory in context subclasses.&/span&
&span class=&n&&postProcessBeanFactory&/span&&span class=&o&&(&/span&&span class=&n&&beanFactory&/span&&span class=&o&&);&/span&
&span class=&c1&&// Invoke factory processors registered as beans in the context.&/span&
&span class=&n&&invokeBeanFactoryPostProcessors&/span&&span class=&o&&(&/span&&span class=&n&&beanFactory&/span&&span class=&o&&);&/span&
&span class=&c1&&// Register bean processors that intercept bean creation.&/span&
&span class=&n&&registerBeanPostProcessors&/span&&span class=&o&&(&/span&&span class=&n&&beanFactory&/span&&span class=&o&&);&/span&
&span class=&c1&&// Initialize message source for this context.&/span&
&span class=&n&&initMessageSource&/span&&span class=&o&&();&/span&
&span class=&c1&&// Initialize event multicaster for this context.&/span&
&span class=&n&&initApplicationEventMulticaster&/span&&span class=&o&&();&/span&
&span class=&c1&&// Initialize other special beans in specific context subclasses.&/span&
&span class=&n&&onRefresh&/span&&span class=&o&&();&/span&
&span class=&c1&&// Check for listener beans and register them.&/span&
&span class=&n&&registerListeners&/span&&span class=&o&&();&/span&
&span class=&c1&&// Instantiate all remaining (non-lazy-init) singletons.&/span&
&span class=&n&&finishBeanFactoryInitialization&/span&&span class=&o&&(&/span&&span class=&n&&beanFactory&/span&&span class=&o&&);&/span&
&span class=&c1&&// Last step: publish corresponding event.&/span&
&span class=&n&&finishRefresh&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&k&&catch&/span& &span class=&o&&(&/span&&span class=&n&&BeansException&/span& &span class=&n&&ex&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&logger&/span&&span class=&o&&.&/span&&span class=&na&&isWarnEnabled&/span&&span class=&o&&())&/span& &span class=&o&&{&/span&
&span class=&n&&logger&/span&&span class=&o&&.&/span&&span class=&na&&warn&/span&&span class=&o&&(&/span&&span class=&s&&&Exception encountered during context initialization - &&/span& &span class=&o&&+&/span&
&span class=&s&&&cancelling refresh attempt: &&/span& &span class=&o&&+&/span& &span class=&n&&ex&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&c1&&// Destroy already created singletons to avoid dangling resources.&/span&
&span class=&n&&destroyBeans&/span&&span class=&o&&();&/span&
&span class=&c1&&// Reset 'active' flag.&/span&
&span class=&n&&cancelRefresh&/span&&span class=&o&&(&/span&&span class=&n&&ex&/span&&span class=&o&&);&/span&
&span class=&c1&&// Propagate exception to caller.&/span&
&span class=&k&&throw&/span& &span class=&n&&ex&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&k&&finally&/span& &span class=&o&&{&/span&
&span class=&c1&&// Reset common introspection caches in Spring's core, since we&/span&
&span class=&c1&&// might not ever need metadata for singleton beans anymore...&/span&
&span class=&n&&resetCommonCaches&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&通过阅读源码,我们可以注意到以下操作:&/p&&ol&&li&上下文准备刷新(属性源初始化)&/li&&li&bean工厂准备好用来一系列操作(classloader定义,基本bean注册)&/li&&li&bean后置处理(postProcessBeanFactory方法)被调用&/li&&li&消息源(消息管理)被初始化&/li&&li&event multicaster初始化(event multicaster是将事件分派到合适的侦听对象的对象)&/li&&li&在特定的上下文子类中初始化其他特殊的bean。&/li&&li&监听器的注册&/li&&li&所有剩余的bean的实例化(例如:转换服务)&/li&&/ol&&p&在非Web环境中,我们可以使用标准应用程序上下文,如FileSystemXmlApplicationContext,ClassPathXmlApplicationContext或GenericXmlApplicationContext。&/p&&p&&br&&/p&&h2&&b&关于Spring的应用程序环境的一些实践&/b&&/h2&&p&关于此 部分,我们将看到:如何在一个控制器中获得一个上下文,查找得到一些bean配置并来解析一个消息。在进入正式的代码之前,我们需要做一些上下文的配置:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&o&&&!--&/span& &span class=&n&&activate&/span& &span class=&n&&configuration&/span& &span class=&n&&by&/span& &span class=&n&&annotations&/span&&span class=&o&&,&/span& &span class=&k&&for&/span& &span class=&n&&example&/span& &span class=&n&&enable&/span& &span class=&nd&&@Controller&/span& &span class=&n&&annotation&/span& &span class=&o&&--&&/span&
&span class=&o&&&&/span&&span class=&n&&context&/span&&span class=&o&&:&/span&&span class=&n&&annotation&/span&&span class=&o&&-&/span&&span class=&n&&config&/span&&span class=&o&&/&&/span&
&span class=&o&&&!--&/span& &span class=&n&&indicates&/span& &span class=&n&&where&/span& &span class=&n&&Spring&/span& &span class=&n&&should&/span& &span class=&n&&looking&/span& &span class=&k&&for&/span& &span class=&n&&application&/span& &span class=&n&&services&/span& &span class=&n&&as&/span& &span class=&n&&services&/span&&span class=&o&&,&/span& &span class=&n&&controllers&/span& &span class=&n&&or&/span& &span class=&n&&components&/span&&span class=&o&&,&/span& &span class=&n&&annotated&/span& &span class=&n&&respectively&/span& &span class=&n&&with&/span& &span class=&nd&&@Service&/span&&span class=&o&&,&/span& &span class=&nd&&@Controller&/span& &span class=&n&&and&/span& &span class=&nd&&@Component&/span& &span class=&o&&--&&/span&
&span class=&o&&&&/span&&span class=&n&&context&/span&&span class=&o&&:&/span&&span class=&n&&component&/span&&span class=&o&&-&/span&&span class=&n&&scan&/span& &span class=&n&&base&/span&&span class=&o&&-&/span&&span class=&n&&package&/span&&span class=&o&&=&/span&&span class=&s&&&com.mysite.test&&/span&&span class=&o&&/&&/span&
&span class=&o&&&!--&/span& &span class=&n&&registers&/span& &span class=&n&&RequestMappingHandlerMapping&/span&&span class=&o&&,&/span& &span class=&n&&RequestMappingHandlerAdapter&/span& &span class=&n&&and&/span& &span class=&n&&ExceptionHandlerExceptionResolver&/span&&span class=&o&&;&/span& &span class=&n&&thanks&/span& &span class=&n&&to&/span& &span class=&n&&it&/span&&span class=&o&&,&/span& &span class=&n&&Spring&/span& &span class=&n&&can&/span& &span class=&n&&resolve&/span& &span class=&n&&requests&/span& &span class=&n&&annotated&/span& &span class=&n&&with&/span& &span class=&nd&&@RequestMapping&/span& &span class=&n&&and&/span& &span class=&nd&&@ExceptionHandler&/span& &span class=&o&&--&&/span&
&span class=&o&&&&/span&&span class=&n&&mvc&/span&&span class=&o&&:&/span&&span class=&n&&annotation&/span&&span class=&o&&-&/span&&span class=&n&&driven&/span&&span class=&o&&/&&/span&
&span class=&o&&&!--&/span& &span class=&n&&represents&/span& &span class=&n&&a&/span& &span class=&n&&bean&/span& &span class=&n&&which&/span& &span class=&n&&will&/span& &span class=&n&&resolve&/span& &span class=&n&&the&/span& &span class=&n&&messages&/span& &span class=&o&&--&&/span&
&span class=&o&&&&/span&&span class=&n&&bean&/span& &span class=&n&&class&/span&&span class=&o&&=&/span&&span class=&s&&&org.springframework.context.support.ReloadableResourceBundleMessageSource&&/span& &span class=&n&&id&/span&&span class=&o&&=&/span&&span class=&s&&&messageSource&&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&property&/span& &span class=&n&&name&/span&&span class=&o&&=&/span&&span class=&s&&&basenames&&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&list&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&value&/span&&span class=&o&&&&/span&&span class=&n&&classpath&/span&&span class=&o&&:&/span&&span class=&n&&messages&/span&&span class=&o&&&/&/span&&span class=&n&&value&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&value&/span&&span class=&o&&&&/span&&span class=&n&&classpath&/span&&span class=&o&&:&/span&&span class=&n&&errors&/span&&span class=&o&&&/&/span&&span class=&n&&value&/span&&span class=&o&&&&/span&
&span class=&o&&&/&/span&&span class=&n&&list&/span&&span class=&o&&&&/span&
&span class=&o&&&/&/span&&span class=&n&&property&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&property&/span& &span class=&n&&name&/span&&span class=&o&&=&/span&&span class=&s&&&defaultEncoding&&/span& &span class=&n&&value&/span&&span class=&o&&=&/span&&span class=&s&&&UTF-8&&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&property&/span& &span class=&n&&name&/span&&span class=&o&&=&/span&&span class=&s&&&fallbackToSystemLocale&&/span& &span class=&n&&value&/span&&span class=&o&&=&/span&&span class=&s&&&false&&/span&&span class=&o&&&&/span&
&span class=&o&&&/&/span&&span class=&n&&property&/span&&span class=&o&&&&/span&
&span class=&o&&&/&/span&&span class=&n&&property&/span&&span class=&o&&&&/span&
&span class=&o&&&/&/span&&span class=&n&&bean&/span&&span class=&o&&&&/span&
&/code&&/pre&&/div&&p&通过上面的配置,我们可以编写一个测试controller和一个类ApplicationContextProvider,它将保存一个应用程序上下文实例并按需返回:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&c1&&// controller, TestController.java&/span&
&span class=&nd&&@Controller&/span&
&span class=&kd&&public&/span& &span class=&kd&&class&/span& &span class=&nc&&TestController&/span& &span class=&o&&{&/span&
&span class=&nd&&@Autowired&/span&
&span class=&kd&&private&/span& &span class=&n&&ApplicationContext&/span& &span class=&n&&context&/span&&span class=&o&&;&/span&
&span class=&nd&&@RequestMapping&/span&&span class=&o&&(&/span&&span class=&n&&value&/span& &span class=&o&&=&/span& &span class=&s&&&/test&&/span&&span class=&o&&,&/span& &span class=&n&&method&/span& &span class=&o&&=&/span& &span class=&n&&RequestMethod&/span&&span class=&o&&.&/span&&span class=&na&&GET&/span&&span class=&o&&)&/span&
&span class=&kd&&public&/span& &span class=&n&&String&/span& &span class=&nf&&test&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&n&&LOGGER&/span&&span class=&o&&.&/span&&span class=&na&&debug&/span&&span class=&o&&(&/span&&span class=&s&&&[TestController] Received application context :&&/span&&span class=&o&&+&/span&&span class=&n&&context&/span&&span class=&o&&);&/span&
&span class=&n&&ApplicationContext&/span& &span class=&n&&providerContext&/span& &span class=&o&&=&/span& &span class=&n&&ApplicationContextProvider&/span&&span class=&o&&.&/span&&span class=&na&&getApplicationContext&/span&&span class=&o&&();&/span&
&span class=&n&&LOGGER&/span&&span class=&o&&.&/span&&span class=&na&&debug&/span&&span class=&o&&(&/span&&span class=&s&&&[TestController] Provider context is :&&/span&&span class=&o&&+&/span&&span class=&n&&providerContext&/span&&span class=&o&&);&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&context&/span& &span class=&o&&==&/span& &span class=&n&&providerContext&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&LOGGER&/span&&span class=&o&&.&/span&&span class=&na&&debug&/span&&span class=&o&&(&/span&&span class=&s&&&[TestController] Both contextes are the same&&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&n&&LOGGER&/span&&span class=&o&&.&/span&&span class=&na&&debug&/span&&span class=&o&&(&/span&&span class=&s&&&[TestController] Message is :&&/span&&span class=&o&&+&/span&&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&context&/span&&span class=&o&&.&/span&&span class=&na&&getMessage&/span&&span class=&o&&(&/span&&span class=&s&&&testMessage&&/span&&span class=&o&&,&/span& &span class=&k&&new&/span& &span class=&n&&Object&/span&&span class=&o&&[]&/span& &span class=&o&&{},&/span& &span class=&n&&Locale&/span&&span class=&o&&.&/span&&span class=&na&&ENGLISH&/span&&span class=&o&&));&/span&
&span class=&k&&return&/span& &span class=&s&&&test&&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&span class=&c1&&// context provider, ApplicationContextProvider.java&/span&
&span class=&nd&&@Component&/span&
&span class=&kd&&public&/span& &span class=&kd&&class&/span& &span class=&nc&&ApplicationContextProvider&/span& &span class=&kd&&implements&/span& &span class=&n&&ApplicationContextAware&/span& &span class=&o&&{&/span&
&span class=&kd&&private&/span& &span class=&kd&&static&/span& &span class=&n&&ApplicationContext&/span& &span class=&n&&context&/span&&span class=&o&&;&/span&
&span class=&nd&&@Override&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&setApplicationContext&/span&&span class=&o&&(&/span&&span class=&n&&ApplicationContext&/span& &span class=&n&&c&/span&&span class=&o&&)&/span& &span class=&kd&&throws&/span& &span class=&n&&BeansException&/span& &span class=&o&&{&/span&
&span class=&n&&context&/span& &span class=&o&&=&/span& &span class=&n&&c&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&kd&&static&/span& &span class=&n&&ApplicationContext&/span& &span class=&nf&&getApplicationContext&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&k&&return&/span& &span class=&n&&context&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&ApplicationContext实例由Spring管理。这就是为什么我们可以使用@Autowired注解将其注入另一个Spring管理的bean(在我们的例子中是一个controller )。这是通过注入的从一个bean得到上下文第一种方法。&/p&&p&第二种方法是使ApplicationContextProvider类实现&b&org.springframework.context.ApplicationContextAware&/b&接口。这里需要说一下,该接口实现后可以获取当前正在运行的ApplicationContext的这个事件的通知。所以实现类必须实现这个方法:&b&void setApplicationContext(ApplicationContext applicationContext)throws BeansException&/b&。该方法允许设置当前的ApplicationContext实例并用来使用。上下文通过&b&org.springframework.context.support.ApplicationContextAwareProcessor&/b&传递给ApplicationContextAware实现,在AbstractApplicationContext类中注册(见下面源码)。需要注意的是,ApplicationcontextAwareProcessor也用于设置bean工厂或应用程序的上下文环境,见下面此类源码中的private final StringValueResolver embeddedValueR的StringValueResolver接口的实现。可以知道,要实现这两种功能,这些类必须分别从&b&org.springframework.context&/b&包中实现EmbeddedValueResolverAware和EnvironmentAware接口。&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&cm&&/**&/span&
&span class=&cm&&
* Configure the factory's standard context characteristics,&/span&
&span class=&cm&&
* such as the context's ClassLoader and post-processors.&/span&
&span class=&cm&&
* @param beanFactory the BeanFactory to configure&/span&
&span class=&cm&&
&span class=&kd&&protected&/span& &span class=&kt&&void&/span& &span class=&nf&&prepareBeanFactory&/span&&span class=&o&&(&/span&&span class=&n&&ConfigurableListableBeanFactory&/span& &span class=&n&&beanFactory&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&c1&&// Tell the internal bean factory to use the context's class loader etc.&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&setBeanClassLoader&/span&&span class=&o&&(&/span&&span class=&n&&getClassLoader&/span&&span class=&o&&());&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&setBeanExpressionResolver&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&StandardBeanExpressionResolver&/span&&span class=&o&&(&/span&&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&getBeanClassLoader&/span&&span class=&o&&()));&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&addPropertyEditorRegistrar&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&ResourceEditorRegistrar&/span&&span class=&o&&(&/span&&span class=&k&&this&/span&&span class=&o&&,&/span& &span class=&n&&getEnvironment&/span&&span class=&o&&()));&/span&
&span class=&c1&&// Configure the bean factory with context callbacks.&/span&
&span class=&c1&&//将applicationContext实例扔进去,见下面对ApplicationContextAwareProcessor的源码注释&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&addBeanPostProcessor&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&ApplicationContextAwareProcessor&/span&&span class=&o&&(&/span&&span class=&k&&this&/span&&span class=&o&&));&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&ignoreDependencyInterface&/span&&span class=&o&&(&/span&&span class=&n&&EnvironmentAware&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&);&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&ignoreDependencyInterface&/span&&span class=&o&&(&/span&&span class=&n&&EmbeddedValueResolverAware&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&);&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&ignoreDependencyInterface&/span&&span class=&o&&(&/span&&span class=&n&&ResourceLoaderAware&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&);&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&ignoreDependencyInterface&/span&&span class=&o&&(&/span&&span class=&n&&ApplicationEventPublisherAware&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&);&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&ignoreDependencyInterface&/span&&span class=&o&&(&/span&&span class=&n&&MessageSourceAware&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&);&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&ignoreDependencyInterface&/span&&span class=&o&&(&/span&&span class=&n&&ApplicationContextAware&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&);&/span&
&span class=&c1&&// BeanFactory interface not registered as resolvable type in a plain factory.&/span&
&span class=&c1&&// MessageSource registered (and found for autowiring) as a bean.&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&registerResolvableDependency&/span&&span class=&o&&(&/span&&span class=&n&&BeanFactory&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&,&/span& &span class=&n&&beanFactory&/span&&span class=&o&&);&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&registerResolvableDependency&/span&&span class=&o&&(&/span&&span class=&n&&ResourceLoader&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&,&/span& &span class=&k&&this&/span&&span class=&o&&);&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&registerResolvableDependency&/span&&span class=&o&&(&/span&&span class=&n&&ApplicationEventPublisher&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&,&/span& &span class=&k&&this&/span&&span class=&o&&);&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&registerResolvableDependency&/span&&span class=&o&&(&/span&&span class=&n&&ApplicationContext&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&,&/span& &span class=&k&&this&/span&&span class=&o&&);&/span&
&span class=&c1&&// Register early post-processor for detecting inner beans as ApplicationListeners.&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&addBeanPostProcessor&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&ApplicationListenerDetector&/span&&span class=&o&&(&/span&&span class=&k&&this&/span&&span class=&o&&));&/span&
&span class=&c1&&// Detect a LoadTimeWeaver and prepare for weaving, if found.&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&containsBean&/span&&span class=&o&&(&/span&&span class=&n&&LOAD_TIME_WEAVER_BEAN_NAME&/span&&span class=&o&&))&/span& &span class=&o&&{&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&addBeanPostProcessor&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&LoadTimeWeaverAwareProcessor&/span&&span class=&o&&(&/span&&span class=&n&&beanFactory&/span&&span class=&o&&));&/span&
&span class=&c1&&// Set a temporary ClassLoader for type matching.&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&setTempClassLoader&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&ContextTypeMatchClassLoader&/span&&span class=&o&&(&/span&&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&getBeanClassLoader&/span&&span class=&o&&()));&/span&
&span class=&o&&}&/span&
&span class=&c1&&// Register default environment beans.&/span&
&span class=&k&&if&/span& &span class=&o&&(!&/span&&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&containsLocalBean&/span&&span class=&o&&(&/span&&span class=&n&&ENVIRONMENT_BEAN_NAME&/span&&span class=&o&&))&/span& &span class=&o&&{&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&registerSingleton&/span&&span class=&o&&(&/span&&span class=&n&&ENVIRONMENT_BEAN_NAME&/span&&span class=&o&&,&/span& &span class=&n&&getEnvironment&/span&&span class=&o&&());&/span&
&span class=&o&&}&/span&
&span class=&k&&if&/span& &span class=&o&&(!&/span&&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&containsLocalBean&/span&&span class=&o&&(&/span&&span class=&n&&SYSTEM_PROPERTIES_BEAN_NAME&/span&&span class=&o&&))&/span& &span class=&o&&{&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&registerSingleton&/span&&span class=&o&&(&/span&&span class=&n&&SYSTEM_PROPERTIES_BEAN_NAME&/span&&span class=&o&&,&/span& &span class=&n&&getEnvironment&/span&&span class=&o&&().&/span&&span class=&na&&getSystemProperties&/span&&span class=&o&&());&/span&
&span class=&o&&}&/span&
&span class=&k&&if&/span& &span class=&o&&(!&/span&&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&containsLocalBean&/span&&span class=&o&&(&/span&&span class=&n&&SYSTEM_ENVIRONMENT_BEAN_NAME&/span&&span class=&o&&))&/span& &span class=&o&&{&/span&
&span class=&n&&beanFactory&/span&&span class=&o&&.&/span&&span class=&na&&registerSingleton&/span&&span class=&o&&(&/span&&span class=&n&&SYSTEM_ENVIRONMENT_BEAN_NAME&/span&&span class=&o&&,&/span& &span class=&n&&getEnvironment&/span&&span class=&o&&().&/span&&span class=&na&&getSystemEnvironment&/span&&span class=&o&&());&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&cm&&/**&/span&
&span class=&cm&& * {@link org.springframework.beans.factory.config.BeanPostProcessor}&/span&
&span class=&cm&& * 看下面这句注释:&/span&
&span class=&cm&& * implementation that passes the ApplicationContext to beans that&/span&
&span class=&cm&& * implement the {@link EnvironmentAware}, {@link EmbeddedValueResolverAware},&/span&
&span class=&cm&& * {@link ResourceLoaderAware}, {@link ApplicationEventPublisherAware},&/span&
&span class=&cm&& * {@link MessageSourceAware} and/or {@link ApplicationContextAware} interfaces.&/span&
&span class=&cm&& *&/span&
&span class=&cm&& * &p&Implemented interfaces are satisfied in order of their mention above.&/span&
&span class=&cm&& *&/span&
&span class=&cm&& * &p&Application contexts will automatically register this with their&/span&
&span class=&cm&& * underlying bean factory. Applications do not use this directly.&/span&
&span class=&cm&& *&/span&
&span class=&cm&& * @author Juergen Hoeller&/span&
&span class=&cm&& * @author Costin Leau&/span&
&span class=&cm&& * @author Chris Beams&/span&
&span class=&cm&& * @since 10.10.2003&/span&
&span class=&cm&& * @see org.springframework.context.EnvironmentAware&/span&
&span class=&cm&& * @see org.springframework.context.EmbeddedValueResolverAware&/span&
&span class=&cm&& * @see org.springframework.context.ResourceLoaderAware&/span&
&span class=&cm&& * @see org.springframework.context.ApplicationEventPublisherAware&/span&
&span class=&cm&& * @see org.springframework.context.MessageSourceAware&/span&
&span class=&cm&& * @see org.springframework.context.ApplicationContextAware&/span&
&span class=&cm&& * @see org.springframework.context.support.AbstractApplicationContext#refresh()&/span&
&span class=&cm&& */&/span&
&span class=&kd&&class&/span& &span class=&nc&&ApplicationContextAwareProcessor&/span& &span class=&kd&&implements&/span& &span class=&n&&BeanPostProcessor&/span& &span class=&o&&{&/span&
&span class=&kd&&private&/span& &span class=&kd&&final&/span& &span class=&n&&ConfigurableApplicationContext&/span& &span class=&n&&applicationContext&/span&&span class=&o&&;&/span&
&span class=&kd&&private&/span& &span class=&kd&&final&/span& &span class=&n&&StringValueResolver&/span& &span class=&n&&embeddedValueResolver&/span&&span class=&o&&;&/span&
&span class=&cm&&/**&/span&
&span class=&cm&&
* Create a new ApplicationContextAwareProcessor for the given context.&/span&
&span class=&cm&&
* 要创建此实例,必须要有ConfigurableApplicationContext的上下文实例才行&/span&
&span class=&cm&&
&span class=&kd&&public&/span& &span class=&nf&&ApplicationContextAwareProcessor&/span&&span class=&o&&(&/span&&span class=&n&&ConfigurableApplicationContext&/span& &span class=&n&&applicationContext&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&applicationContext&/span& &span class=&o&&=&/span& &span class=&n&&applicationContext&/span&&span class=&o&&;&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&embeddedValueResolver&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&EmbeddedValueResolver&/span&&span class=&o&&(&/span&&span class=&n&&applicationContext&/span&&span class=&o&&.&/span&&span class=&na&&getBeanFactory&/span&&span class=&o&&());&/span&
&span class=&o&&}&/span&
&span class=&nd&&@Override&/span&
&span class=&kd&&public&/span& &span class=&n&&Object&/span& &span class=&nf&&postProcessBeforeInitialization&/span&&span class=&o&&(&/span&&span class=&kd&&final&/span& &span class=&n&&Object&/span& &span class=&n&&bean&/span&&span class=&o&&,&/span& &span class=&n&&String&/span& &span class=&n&&beanName&/span&&span class=&o&&)&/span& &span class=&kd&&throws&/span& &span class=&n&&BeansException&/span& &span class=&o&&{&/span&
&span class=&n&&AccessControlContext&/span& &span class=&n&&acc&/span& &span class=&o&&=&/span& &span class=&kc&&null&/span&&span class=&o&&;&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&getSecurityManager&/span&&span class=&o&&()&/span& &span class=&o&&!=&/span& &span class=&kc&&null&/span& &span class=&o&&&&&/span&
&span class=&o&&(&/span&&span class=&n&&bean&/span& &span class=&k&&instanceof&/span& &span class=&n&&EnvironmentAware&/span& &span class=&o&&||&/span& &span class=&n&&bean&/span& &span class=&k&&instanceof&/span& &span class=&n&&EmbeddedValueResolverAware&/span& &span class=&o&&||&/span&
&span class=&n&&bean&/span& &span class=&k&&instanceof&/span& &span class=&n&&ResourceLoaderAware&/span& &span class=&o&&||&/span& &span class=&n&&bean&/span& &span class=&k&&instanceof&/span& &span class=&n&&ApplicationEventPublisherAware&/span& &span class=&o&&||&/span&
&span class=&n&&bean&/span& &span class=&k&&instanceof&/span& &span class=&n&&MessageSourceAware&/span& &span class=&o&&||&/span& &span class=&n&&bean&/span& &span class=&k&&instanceof&/span& &span class=&n&&ApplicationContextAware&/span&&span class=&o&&))&/span& &span class=&o&&{&/span&
&span class=&n&&acc&/span& &span class=&o&&=&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&applicationContext&/span&&span class=&o&&.&/span&&span class=&na&&getBeanFactory&/span&&span class=&o&&().&/span&&span class=&na&&getAccessControlContext&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&acc&/span& &span class=&o&&!=&/span& &span class=&kc&&null&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&AccessController&/span&&span class=&o&&.&/span&&span class=&na&&doPrivileged&/span&&span class=&o&&((&/span&&span class=&n&&PrivilegedAction&/span&&span class=&o&&&&/span&&span class=&n&&Object&/span&&span class=&o&&&)&/span& &span class=&o&&()&/span& &span class=&o&&-&&/span& &span class=&o&&{&/span&
&span class=&n&&invokeAwareInterfaces&/span&&span class=&o&&(&/span&&span class=&n&&bean&/span&&span class=&o&&);&/span&
&span class=&k&&return&/span& &span class=&kc&&null&/span&&span class=&o&&;&/span&
&span class=&o&&},&/span& &span class=&n&&acc&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&k&&else&/span& &span class=&o&&{&/span&
&span class=&n&&invokeAwareInterfaces&/span&&span class=&o&&(&/span&&span class=&n&&bean&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&k&&return&/span& &span class=&n&&bean&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&在我们的例子中,对于ApplicationContextAware的实现是只是一个简单的上下文提供者。但是在别的地方,我们定义的这个provider可能是用来得到上下文资源的对象。&b&这就是关于获取应用程序上下文的两种方式&/b&。&/p&&p&最后,我们通过一个方法来使用context(上下文)的getMessage方法来对消息解析。在我们的message_en.properties文件中,可以事先声明消息的模板:&b&testMessage =It’s our test message with content。&/b&然后我们会在日志文件中看到相应的输出。&/p&&p&顺便说一下,从ApplicationContextProvider获得的对象和@Autowired的对象之间的上下文是相同的:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&o&&[&/span&&span class=&n&&TestController&/span&&span class=&o&&]&/span& &span class=&n&&Received&/span& &span class=&n&&application&/span& &span class=&n&&context&/span& &span class=&o&&:&/span&&span class=&n&&Root&/span& &span class=&n&&WebApplicationContext&/span&&span class=&o&&:&/span& &span class=&n&&startup&/span& &span class=&n&&date&/span& &span class=&o&&[&/span&&span class=&n&&Wed&/span& &span class=&n&&Apr&/span& &span class=&mo&&02&/span& &span class=&mi&&20&/span&&span class=&o&&:&/span&&span class=&mo&&00&/span&&span class=&o&&:&/span&&span class=&mi&&23&/span& &span class=&n&&CEST&/span& &span class=&mi&&2014&/span&&span class=&o&&];&/span& &span class=&n&&root&/span& &span class=&n&&of&/span& &span class=&n&&context&/span& &span class=&n&&hierarchy&/span&
&span class=&o&&[&/span&&span class=&n&&TestController&/span&&span class=&o&&]&/span& &span class=&n&&Provider&/span& &span class=&n&&context&/span& &span class=&n&&is&/span& &span class=&o&&:&/span&&span class=&n&&Root&/span& &span class=&n&&WebApplicationContext&/span&&span class=&o&&:&/span& &span class=&n&&startup&/span& &span class=&n&&date&/span& &span class=&o&&[&/span&&span class=&n&&Wed&/span& &span class=&n&&Apr&/span& &span class=&mo&&02&/span& &span class=&mi&&20&/span&&span class=&o&&:&/span&&span class=&mo&&00&/span&&span class=&o&&:&/span&&span class=&mi&&23&/span& &span class=&n&&CEST&/span& &span class=&mi&&2014&/span&&span class=&o&&];&/span& &span class=&n&&root&/span& &span class=&n&&of&/span& &span class=&n&&context&/span& &span class=&n&&hierarchy&/span&
&span class=&o&&[&/span&&span class=&n&&TestController&/span&&span class=&o&&]&/span& &span class=&n&&All&/span& &span class=&n&&contexts&/span& &span class=&n&&are&/span& &span class=&n&&the&/span& &span class=&n&&same&/span&
&span class=&o&&[&/span&&span class=&n&&TestController&/span&&span class=&o&&]&/span& &span class=&n&&Message&/span& &span class=&n&&is&/span& &span class=&o&&:&/span&&span class=&n&&It&/span&&span class=&err&&'&/span&&span class=&n&&s&/span& &span class=&n&&our&/span& &span class=&n&&test&/span& &span class=&n&&message&/span& &span class=&n&&with&/span& &span class=&n&&content&/span&&span class=&o&&.&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&blockquote&&i&原文:&a href=&/?target=https%3A//muyinchen.github.io//Spring5%25E6%25BA%%25A0%%25A7%25A3%25E6%259E%2590-Spring%25E4%25B8%25AD%25E7%259A%%25BA%%%25E4%25B8%258A%25E4%25B8%258B%25E6%/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Spring5源码解析-Spring中的应用上下文&i class=&icon-external&&&/i&&/a&&/i&&/blockquote&
Spring5源码解析-Spring中的应用上下文之前讲到过,Spring中的 beans生活(用这俩字觉得更形象具体)在其应用程序的上下文环境中。在本文中,我们将详细介绍应用程序上下文,另外此篇同样是的关于Spring容器的续篇。关于
&img src=&/v2-c908624cca0ab4a9500bcefd2971033e_b.jpg& data-rawwidth=&500& data-rawheight=&333& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-c908624cca0ab4a9500bcefd2971033e_r.jpg&&&p&这个路线图中包含了Java学习的三部曲:&/p&&ul&&li&&a href=&/?target=http%3A///m/22348/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java零基础入门&i class=&icon-external&&&/i&&/a&(点击标题学习)&br&&/li&&li&&a href=&/?target=http%3A///m/22349/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java面向对象开发&i class=&icon-external&&&/i&&/a&(点击标题学习)&br&&/li&&li&&a href=&/?target=http%3A///m/22350/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java高级开发&i class=&icon-external&&&/i&&/a&(点击标题学习)&br&&/li&&/ul&&p&在阿里云大学,你可以跟随Java名师李兴华学到路线图中所有的知识点(完全免费哦),赶快开始你的Java学习之路吧!&/p&&img src=&/v2-c5a1bc390cdbddaf26f0da6_b.png& data-rawwidth=&578& data-rawheight=&2271& class=&origin_image zh-lightbox-thumb& width=&578& data-original=&/v2-c5a1bc390cdbddaf26f0da6_r.png&&&p&课程详细目录:&/p&&h2&Java零基础入门&/h2&&br&&blockquote&&p&课时1:Java简介(Java发展概述)&/p&&p&课时2:Java简介(Java主要特点)&/p&&p&课时3:JDK的安装与配置&/p&&p&课时4:第一个Java程序&/p&&p&课时5:CLASSPATH环境属性&/p&&p&课时6:Java程序基本概念(注释)&/p&&p&课时7:Java程序基本概念(标识符与关键字)&/p&&p&课时8:Java数据类型划分(数据类型划分)&/p&&p&课时9:Java数据类型划分(整型类型)&/p&&p&课时10:Java数据类型划分(浮点类型)&/p&&p&课时11:Java数据类型划分(字符型)&/p&&p&课时12:Java数据类型划分(布尔型)&/p&&p&课时13:Java数据类型划分(初见String类)&/p&&p&课时14:Java运算符(基础数学运算符)&/p&&p&课时15:Java运算符(三目运算符)&/p&&p&课时16:Java运算符(关系运算符)&/p&&p&课时17:Java运算符(逻辑运算符)&/p&&p&课时18:Java运算符(位运算符)&/p&&p&课时19:程序逻辑控制(分支结构)&/p&&p&课时20:程序逻辑控制(循环结构)&/p&&p&课时21:程序逻辑控制(循环控制)&/p&&p&课时22:程序逻辑控制(循环嵌套)&/p&&p&课时23:方法的定义与使用(方法的基本定义)&/p&&p&课时24:方法的定义与使用(方法重载)&/p&&p&课时25:方法的定义与使用(方法递归调用)&/p&&/blockquote&&br&&h2&Java面向对象开发&/h2&&br&&blockquote&&p&课时1:面向对象简介&/p&&p&课时2:类与对象(类与对象基本定义)&/p&&p&课时3:类与对象(类与对象定义)&/p&&p&课时4:类与对象(对象内存分析)&/p&&p&课时5:类与对象(引用传递初次分析)&/p&&p&课时6:private实现封装处理&/p&&p&课时7:构造方法与匿名对象&/p&&p&课时8:【第01个代码模型】综合案例:简单Java类&/p&&p&课时9:数组的定义与使用(数组基本概念)&/p&&p&课时10:数组的定义与使用(数组引用传递)&/p&&p&课时11:数组的定义与使用(数组静态初始化)&/p&&p&课时12:数组的定义与使用(二维数组)&/p&&p&课时13:数组的定义与使用(数组与方法互操作)&/p&&p&课时14:数组的定义与使用(Java对数组的支持)&/p&&p&课时15:数组的定义与使用(数组案例:数组数据统计)&/p&&p&课时16:数组的定义与使用(数组案例:数组排序)&/p&&p&课时17:数组的定义与使用(数组案例:数组转置)&/p&&p&课时18:数组的定义与使用(数组案例:二分查找法)&/p&&p&课时19:数组的定义与使用(对象数组)&/p&&p&课时20:String类的基本特点(String类两种实例化方式)&/p&&p&课时21:String类的基本特点(字符串比较)&/p&&p&课时22:String类的基本特点(字符串为匿名对象)&/p&&p&课时23:String类的基本特点(String两种实例化区别)&/p&&p&课时24:String类的基本特点(字符串常量不可变更)&/p&&p&课时25:String类的常用方法(DOC文档组成)&/p&&p&课时26:String类的常用方法(字符串与字符数组)&/p&&p&课时27:String类的常用方法(字节与字符串)&/p&&p&课时28:String类的常用方法(字符串比较)&/p&&p&课时29:String类的常用方法(字符串查找)&/p&&p&课时30:String类的常用方法(字符串替换)&/p&&p&课时31:String类的常用方法(字符串拆分)&/p&&p&课时32:String类的常用方法(字符串截取)&/p&&p&课时33:String类的常用方法(字符串其它操作方法)&/p&&p&课时34:this关键字(this调用属性)&/p&&p&课时35:this关键字(this调用方法)&/p&&p&课时36:this关键字(表示当前对象)&/p&&p&课时37:引用传递进阶分析&/p&&p&课时38:【第02个代码模型】综合案例:对象比较&/p&&p&课时39:引用传递实际应用&/p&&p&课时40:【第03个代码模型】综合案例:数据表与简单Java类(一对多)&/p&&p&课时41:【第03个代码模型】综合案例:数据表与简单Java类(多对多)&/p&&p&课时42:【第03个代码模型】综合案例:数据表与简单Java类(角色与权限)&/p&&p&课时43:static关键字(static属性)&/p&&p&课时44:static关键字(static方法)&/p&&p&课时45:static关键字(分析主方法)&/p&&p&课时46:static关键字(static应用)&/p&&p&课时47:代码块(普通代码块)&/p&&p&课时48:代码块(构造块)&/p&&p&课时49:代码块(静态代码块)&/p&&p&课时50:内部类的定义及使用(内部类基本概念)&/p&&p&课时51:内部类的定义及使用(static定义内部类)&/p&&p&课时52:内部类的定义及使用(在方法中定义内部类)&/p&&p&课时53:继承的定义与使用(继承问题的引出)&/p&&p&课时54:继承的定义与使用(继承的实现)&/p&&p&课时55:继承的定义与使用(继承使用限制)&/p&&p&课时56:覆写(方法覆写)&/p&&p&课时57:覆写(属性覆盖)&/p&&p&课时58:覆写(super关键字)&/p&&p&课时59:综合案例:数组操作(定义Array父类)&/p&&p&课时60:综合案例:数组操作(SortArray排序子类)&/p&&p&课时61:综合案例:数组操作(ReverseArray反转子类)&/p&&p&课时62:final关键字&/p&&p&课时63:多态性&/p&&p&课时64:抽象类的定义与使用(抽象类基本概念)&/p&&p&课时65:抽象类的定义与使用(抽象类使用限制)&/p&&p&课时66:抽象类的定义与使用(模版设计模式)&/p&&p&课时67:接口的定义与使用(接口基本概念)&/p&&p&课时68:接口的定义与使用(接口使用限制)&/p&&p&课时69:接口的定义与使用(使用接口定义标准)&/p&&p&课时70:接口的定义与使用(工厂设计模式)&/p&&p&课时71:接口的定义与使用(代理设计模式)&/p&&p&课时72:接口的定义与使用(抽象类与接口的区别)&/p&&p&课时73:匿名内部类&/p&&p&课时74:Object类(Object类简介)&/p&&p&课时75:Object类(取得对象信息)&/p&&p&课时76:Object类(对象比较)&/p&&p&课时77:Object类(接收引用数据类型)&/p&&p&课时78:包装类(包装类简介)&/p&&p&课时79:包装类(装箱与拆箱)&/p&&p&课时80:包装类(字符串与基本数据类型转换)&/p&&p&课时81:包的定义及使用(包的定义)&/p&&p&课时82:包的定义及使用(包的导入)&/p&&p&课时83:包的定义及使用(系统常用包)&/p&&p&课时84:访问控制权限&/p&&p&课时85:jar命令&/p&&p&课时86:单例设计模式(单例设计模式)&/p&&p&课时87:单例设计模式(多例设计模式)&/p&&p&课时88:【第04个代码模型】异常的捕获与处理(观察异常带来的问题)&/p&&p&课时89:【第04个代码模型】异常的捕获与处理(异常处理格式)&/p&&p&课时90:【第04个代码模型】异常的捕获与处理(throws关键字)&/p&&p&课时91:【第04个代码模型】异常的捕获与处理(throw关键字)&/p&&p&课时92:【第04个代码模型】异常的捕获与处理(异常处理模型)&/p&&p&课时93:【第04个代码模型】异常的捕获与处理(RuntimeException)&/p&&p&课时94:【第04个代码模型】异常的捕获与处理(断言)&/p&&p&课时95:【第04个代码模型】异常的捕获与处理(自定义异常类)&/p&&p&课时96:链表(链表基本概念)&/p&&p&课时97:链表(链表实现结构说明)&/p&&p&课时98:链表(增加链表数据)&/p&&p&课时99:链表(取得链表数据个数)&/p&&p&课时100:链表(链表数据转换为对象数组)&/p&&p&课时101:链表(查询数据)&/p&&p&课时102:链表(根据索引取得数据)&/p&&p&课时103:链表(修改指定索引数据)&/p&&p&课时104:链表(删除数据)&/p&&p&课时105:【第05个代码模型】综合案例:宠物商店&/p&&/blockquote&&br&&h2&Java高级开发&/h2&&br&&blockquote&&p&课时1:Eclipse开发工具(Eclipse简介)&/p&&p&课时2:Eclipse开发工具(使用JDT开发程序)&/p&&p&课时3:Eclipse开发工具(debug调试)&/p&&p&课时4:Eclipse开发工具(junit测试工具)&/p&&p&课时5:Java基础新特性(可变参数)&/p&&p&课时6:Java基础新特性(foreach输出)&/p&&p&课时7:Java基础新特性(静态导入)&/p&&p&课时8:泛型(泛型问题引出)&/p&&p&课时9:泛型(泛型实现)&/p&&p&课时10:泛型(通配符)&/p&&p&课时11:泛型(泛型接口)&/p&&p&课时12:泛型(泛型方法)&/p&&p&课时13:枚举(多例与枚举)&/p&&p&课时14:枚举(Enum类)&/p&&p&课时15:枚举(枚举中定义其它结构)&/p&&p&课时16:枚举(枚举应用)&/p&&p&课时17:Annotation(代码开发逻辑)&/p&&p&课时18:Annotation(准确覆写)&/p&&p&课时19:Annotation(过期声明)&/p&&p&课时20:Annotation(压制警告)&/p&&p&课时21:接口定义加强&/p&&p&课时22:Lambda表达式&/p&&p&课时23:方法引用&/p&&p&课时24:内建函数式接口&/p&&p&课时25:进程与线程&/p&&p&课时26:Java多线程实现(Thread类实现多线程)&/p&&p&课时27:Java多线程实现(Runnable接口实现多线程)&/p&&p&课时28:Java多线程实现(Thread与Runnable区别)&/p&&p&课时29:Java多线程实现(线程状态)&/p&&p&课时30:Java多线程实现(Callable实现多线程)&/p&&p&课时31:多线程常用操作方法(线程命名和取得)&/p&&p&课时32:多线程常用操作方法(线程休眠)&/p&&p&课时33:多线程常用操作方法(线程优先级)&/p&&p&课时34:线程的同步与死锁(同步问题引出)&/p&&p&课时35:线程的同步与死锁(同步处理)&/p&&p&课时36:线程的同步与死锁(死锁)&/p&&p&课时37:【第06个代码模型】综合案例:生产者与消费者(基础模型)&/p&&p&课时38:【第06个代码模型】综合案例:生产者与消费者(解决同步问题)&/p&&p&课时39:【第06个代码模型】综合案例:生产者与消费者(解决重复操作问题)&/p&&p&课时40:线程池(线程池概念)&/p&&p&课时41:线程池(线程池实现)&/p&&p&课时42:StringBuffer类&/p&&p&课时43:Runtime类&/p&&p&课时44:System类&/p&&p&课时45:对象克隆&/p&&p&课时46:【第07个代码模型】日期处理类(Date类)&/p&&p&课时47:【第07个代码模型】日期处理类(SimpleDateFormat类)&/p&&p&课时48:数字操作类(Math类)&/p&&p&课时49:数字操作类(随机数)&/p&&p&课时50:数字操作类(大数字操作类)&/p&&p&课时51:Arrays类&/p&&p&课时52:比较器(Comparable)&/p&&p&课时53:比较器(二叉树)&/p&&p&课时54:比较器(Comparator)&/p&&p&课时55:国际化程序(国际化实现原理)&/p&&p&课时56:国际化程序(Locale类)&/p&&p&课时57:国际化程序(ResourceBundle)&/p&&p&课时58:国际化程序(国际化程序实现)&/p&&p&课时59:观察者设计模式&/p&&p&课时60:定时器&/p&&p&课时61:UUID类&/p&&p&课时62:Base64加密处理&/p&&p&课时63:【第08个代码模型】ThreadLocal类&/p&&p&课时64:【第09个代码模型】正则表达式(正则问题引出)&/p&&p&课时65:【第09个代码模型】正则表达式(正则符号)&/p&&p&课时66:【第09个代码模型】正则表达式(String类对正则的支持)&/p&&p&课时67:【第09个代码模型】正则表达式(java.util.regex开发包)&/p&&p&课时68:File文件操作类(File类基本操作)&/p&&p&课时69:File文件操作类(创建目录)&/p&&p&课时70:File文件操作类(取得文件信息)&/p&&p&课时71:File文件操作类(综合案例:目录列表)&/p&&p&课时72:字节流与字符流(流操作简介)&/p&&p&课时73:字节流与字符流(字节输出流:OutputStream)&/p&&p&课时74:字节流与字符流(AutoCloseable自动关闭支持)&/p&&p&课时75:字节流与字符流(字节输入流:InputStream)&/p&&p&课时76:字节流与字符流(字符输出流:OutputStream)&/p&&p&课时77:字节流与字符流(字符输入流:Reader)&/p&&p&课时78:字节流与字符流(字节流与字符流区别)&/p&&p&课时79:转换流&/p&&p&课时80:【第10个代码模型】综合案例:文件拷贝&/p&&p&课时81:字符编码(常用字符编码)&/p&&p&课时82:字符编码(乱码产生分析)&/p&&p&课时83:内存操作流(内存流基本操作)&/p&&p&课时84:内存操作流(内存流操作)&/p&&p&课时85:【第11个代码模型】打印流(打印流模型)&/p&&p&课时86:【第11个代码模型】打印流(使用系统打印流)&/p&&p&课时87:【第11个代码模型】打印流(格式化文本信息)&/p&&p&课时88:System类对IO的支持(系统输出)&/p&&p&课时89:System类对IO的支持(系统输入)&/p&&p&课时90:BufferedReader类&/p&&p&课时91:【第12个代码模型】Scanner类&/p&&p&课时92:【第13个代码模型】对象序列化(序列化基本概念)&/p&&p&课时93:【第13个代码模型】对象序列化(序列化实现)&/p&&p&课时94:【第13个代码模型】对象序列化(transient关键字)&/p&&p&课时95:认识反射机制&/p&&p&课时96:Class类对象的三种实例化模式&/p&&p&课时97:【第14个代码模型】反射与工厂设计模式&/p&&p&课时98:反射与类操作(取得父类信息)&/p&&p&课时99:反射与类操作(反射调用构造)&/p&&p&课时100:反射与类操作(反射调用方法)&/p&&p&课时101:反射与类操作(反射调用成员)&/p&&p&课时102:【第15个代码模型】综合案例:反射与简单Java类(单级VO操作原理)&/p&&p&课时103:【第15个代码模型】综合案例:反射与简单Java类(单级VO设置实现)&/p&&p&课时104:【第15个代码模型】综合案例:反射与简单Java类(多级VO设置实现)&/p&&p&课时105:【第15个代码模型】综合案例:反射与简单Java类(设置各种数据类型)&/p&&p&课时106:【第15个代码模型】综合案例:反射与简单Java类(级联实例化对象)&/p&&p&课时107:ClassLoader类加载器(认识类加载器)&/p&&p&课时108:ClassLoader类加载器(自定义ClassLoader)&/p&&p&课时109:【第16个代码模型】反射与代理设计模式(基础代理设计模式)&/p&&p&课时110:【第16个代码模型】反射与代理设计模式(动态代理设计模式)&/p&&p&课时111:【第16个代码模型】反射与代理设计模式(cglib实现动态代理)&/p&&p&课时112:反射与Annotation(反射取得Annotation)&/p&&p&课时113:反射与Annotation(自定义Annotation)&/p&&p&课时114:反射与Annotation(Annotation与工厂设计模式)&/p&&p&课时115:volatile关键字&/p&&p&课时116:网络编程(网络编程简介)&/p&&p&课时117:网络编程(基本网络程序模型)&/p&&p&课时118:网络编程(Echo程序)&/p&&p&课时119:JDBC简介&/p&&p&课时120:连接Oracle数据库&/p&&p&课时121:使用Statement操作数据库(Statement接口简介)&/p&&p&课时122:使用Statement操作数据库(Statement执行更新操作)&/p&&p&课时123:使用Statement操作数据库(Statement执行查询操作)&/p&&p&课时124:【第17个代码模型】使用PreparedStatement操作数据库(Statement执行分析)&/p&&p&课时125:【第17个代码模型】使用PreparedStatement操作数据库(PreparedStatement查询案例)&/p&&p&课时126:批处理与事务处理(批处理)&/p&&p&课时127:批处理与事务处理(事务处理)&/p&&p&课时128:Java类集简介&/p&&p&课时129:Collection集合接口&/p&&p&课时130:【第18个代码模型】List集合接口(List接口简介)&/p&&p&课时131:【第18个代码模型】List集合接口(ArrayList子类)&/p&&p&课时132:【第18个代码模型】List集合接口(List与简单Java类)&/p&&p&课时133:【第18个代码模型】List集合接口(Vector子类)&/p&&p&课时134:【第18个代码模型】List集合接口(LinkedList子类)&/p&&p&课时135:【第19个代码模型】Set集合接口(Set接口常用子类)&/p&&p&课时136:【第19个代码模型】Set集合接口(集合排序说明)&/p&&p&课时137:【第19个代码模型】Set集合接口(重复元素判断)&/p&&p&课时138:【第20个代码模型】集合输出(Iterator迭代输出)&/p&&p&课时139:【第20个代码模型】集合输出(ListIterat}

我要回帖

更多关于 java报错找不到符号 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信