- 浏览: 20762 次
- 性别:
- 来自: 上海
最新评论
-
liangfuming:
看了之后受益匪浅
Struts2 -- ActionProxy&ActionInvocation -
nianien:
你好,我怎么找不到哪个地方有写加载struts.propert ...
Struts2--Dispatcher&ConfigurationProvider
接下来第三步:init_LegacyStrutsProperties()
调用的是调用的是LegacyPropertiesConfigurationProvider
通过比较前面DefaultPropertiesProvider与调用的是LegacyPropertiesConfigurationProvider.
发现DefaultPropertiesProvider继承自后者,但重写了register()方法,主要是生成PropertiesSetting的不同,前者是根据org/apache/struts2/default.properties
后者是根据struts.properties
我们展开register()中的Settings.getInstance(),最后是调用getDefaultInstance()
- private static Settings getDefaultInstance() {
- if (defaultImpl == null) {
- // Create bootstrap implementation
- //不带参数的DefaultSettings(),区别与DefaultPropertiesProvider中直接带default.properties参数
- //不带参数就是默认为struts.propertes,并且加载struts.custom.properties所定义的properties文件
- defaultImpl = new DefaultSettings();
- // Create default implementation
- try {
- //STRUTS_CONFIGURATION为:struts.configuration
- //在struts.proterties中查找struts.configuration的值,这个值必须是org.apache.struts2.config.Configuration接口的实现类
- //所以我有个困惑就是在下面的转换当中怎么将Configuration转换成Setting类型的...
- //这一点先放下了,有时间再研究
- String className = get(StrutsConstants.STRUTS_CONFIGURATION);
- if (!className.equals(defaultImpl.getClass().getName())) {
- try {
- // singleton instances shouldn't be built accessing request or session-specific context data
- defaultImpl = (Settings) ObjectFactory.getObjectFactory().buildBean(Thread.currentThread().getContextClassLoader().loadClass(className), null);
- } catch (Exception e) {
- LOG.error("Settings: Could not instantiate the struts.configuration object, substituting the default implementation.", e);
- }
- }
- } catch (IllegalArgumentException ex) {
- // ignore
private static Settings getDefaultInstance() { if (defaultImpl == null) { // Create bootstrap implementation //不带参数的DefaultSettings(),区别与DefaultPropertiesProvider中直接带default.properties参数 //不带参数就是默认为struts.propertes,并且加载struts.custom.properties所定义的properties文件 defaultImpl = new DefaultSettings(); // Create default implementation try { //STRUTS_CONFIGURATION为:struts.configuration //在struts.proterties中查找struts.configuration的值,这个值必须是org.apache.struts2.config.Configuration接口的实现类 //所以我有个困惑就是在下面的转换当中怎么将Configuration转换成Setting类型的... //这一点先放下了,有时间再研究 String className = get(StrutsConstants.STRUTS_CONFIGURATION); if (!className.equals(defaultImpl.getClass().getName())) { try { // singleton instances shouldn't be built accessing request or session-specific context data defaultImpl = (Settings) ObjectFactory.getObjectFactory().buildBean(Thread.currentThread().getContextClassLoader().loadClass(className), null); } catch (Exception e) { LOG.error("Settings: Could not instantiate the struts.configuration object, substituting the default implementation.", e); } } } catch (IllegalArgumentException ex) { // ignore
在2.1.6中去掉了第四步:init_ZeroConfiguration();
第五步是自定义的configProviders
- private void init_CustomConfigurationProviders() {
- //从这里可以看到可以将自定义的Provider定义在web.xml中FilterDispatcher的param中:configProviders
- String configProvs = initParams.get("configProviders");
- if (configProvs != null) {
- String[] classes = configProvs.split("\\s*[,]\\s*");
- for (String cname : classes) {
- try {
- Class cls = ClassLoaderUtils.loadClass(cname, this.getClass());
- ConfigurationProvider prov = (ConfigurationProvider)cls.newInstance();
- configurationManager.addConfigurationProvider(prov);
- }
- ...
- }
- }
- }
private void init_CustomConfigurationProviders() { //从这里可以看到可以将自定义的Provider定义在web.xml中FilterDispatcher的param中:configProviders String configProvs = initParams.get("configProviders"); if (configProvs != null) { String[] classes = configProvs.split("\\s*[,]\\s*"); for (String cname : classes) { try { Class cls = ClassLoaderUtils.loadClass(cname, this.getClass()); ConfigurationProvider prov = (ConfigurationProvider)cls.newInstance(); configurationManager.addConfigurationProvider(prov); } ... } } }
第六步:init_FilterInitParameters
- //从这里可以看出struts.properties中的属性不仅可以在struts.xml中以constant形式定义,而且可以在FilterDispatcher的param中定义
- private void init_FilterInitParameters() {
- configurationManager.addConfigurationProvider(new ConfigurationProvider() {
- public void destroy() {}
- public void init(Configuration configuration) throws ConfigurationException {}
- public void loadPackages() throws ConfigurationException {}
- public boolean needsReload() { return false; }
- public void register(ContainerBuilder builder, LocatableProperties props) throws ConfigurationException {
- props.putAll(initParams);//在这里实现滴~
- }
- });
- }
//从这里可以看出struts.properties中的属性不仅可以在struts.xml中以constant形式定义,而且可以在FilterDispatcher的param中定义 private void init_FilterInitParameters() { configurationManager.addConfigurationProvider(new ConfigurationProvider() { public void destroy() {} public void init(Configuration configuration) throws ConfigurationException {} public void loadPackages() throws ConfigurationException {} public boolean needsReload() { return false; } public void register(ContainerBuilder builder, LocatableProperties props) throws ConfigurationException { props.putAll(initParams);//在这里实现滴~ } }); }
第七步:init_AliasStandardObjects,使用BeanSelectionProvider
这是将配置文件中定义的<bean>与实际的类相映射,就是注入bean的依赖关系,这部分以后有时候再研究Container
接下来是看怎样调用这些ConfigurationProviders
展开init_PreloadConfiguration()
- private Container init_PreloadConfiguration() {
- Configuration config = configurationManager.getConfiguration();
- Container container = config.getContainer();
- boolean reloadi18n = Boolean.valueOf(container.getInstance(String.class, StrutsConstants.STRUTS_I18N_RELOAD));
- LocalizedTextUtil.setReloadBundles(reloadi18n);
- return container;
- }
- //再看getConfiguration()
- public synchronized Configuration getConfiguration() {
- if (configuration == null) {
- setConfiguration(new DefaultConfiguration(defaultFrameworkBeanName));
- try {
- //重点就是这个reloadContainer
- configuration.reloadContainer(getContainerProviders());
- } catch (ConfigurationException e) {
- setConfiguration(null);
- throw new ConfigurationException("Unable to load configuration.", e);
- }
- } else {
- conditionalReload();
- }
- return configuration;
- }
private Container init_PreloadConfiguration() { Configuration config = configurationManager.getConfiguration(); Container container = config.getContainer(); boolean reloadi18n = Boolean.valueOf(container.getInstance(String.class, StrutsConstants.STRUTS_I18N_RELOAD)); LocalizedTextUtil.setReloadBundles(reloadi18n); return container; } //再看getConfiguration() public synchronized Configuration getConfiguration() { if (configuration == null) { setConfiguration(new DefaultConfiguration(defaultFrameworkBeanName)); try { //重点就是这个reloadContainer configuration.reloadContainer(getContainerProviders()); } catch (ConfigurationException e) { setConfiguration(null); throw new ConfigurationException("Unable to load configuration.", e); } } else { conditionalReload(); } return configuration; }
展开DefaultConfiguration中的reloadContainer
- public synchronized List<PackageProvider> reloadContainer(List<ContainerProvider> providers) throws ConfigurationException {
- packageContexts.clear();
- loadedFileNames.clear();
- List<PackageProvider> packageProviders = new ArrayList<PackageProvider>();
- //Struts2(xwork2)用Container来完成依赖注入的功能
- //首先初始化一个ContainerBuilder,再由builder来保存接口与实现类或工厂类的对应关系
- //然后通过builder.create(boolean)方法产生container
- //由container.getInstance(Class);就可以得到接口的实现实例了
- //这一部分比较复杂,后面研究完成了,会单独拿出来讲,这里先弄清楚Xwork依赖注入的实现步骤就可以了
- ContainerProperties props = new ContainerProperties();
- ContainerBuilder builder = new ContainerBuilder();
- for (final ContainerProvider containerProvider : providers)
- {
- //循环调用ConfigurationProvider的init和register方法,明白了吧,在这里统一循环调用
- containerProvider.init(this);
- containerProvider.register(builder, props);
- }
- props.setConstants(builder);
- //注入依赖关系,在这里并不产生实例
- builder.factory(Configuration.class, new Factory<Configuration>() {
- public Configuration create(Context context) throws Exception {
- return DefaultConfiguration.this;
- }
- });
- ActionContext oldContext = ActionContext.getContext();
- try {
- // Set the bootstrap container for the purposes of factory creation
- Container bootstrap = createBootstrapContainer();
- setContext(bootstrap);
- //create已经注入依赖关系的Container
- container = builder.create(false);
- setContext(container);
- objectFactory = container.getInstance(ObjectFactory.class);
- // Process the configuration providers first
- for (final ContainerProvider containerProvider : providers)
- {
- if (containerProvider instanceof PackageProvider) {
- container.inject(containerProvider);
- //调用PackageProvider的loadPackages()方法,这里主要是针对XmlConfigurationProvider和StrutsXmlConfigurationProvider
- ((PackageProvider)containerProvider).loadPackages();
- packageProviders.add((PackageProvider)containerProvider);
- }
- }
- // Then process any package providers from the plugins
- Set<String> packageProviderNames = container.getInstanceNames(PackageProvider.class);
- if (packageProviderNames != null) {
- for (String name : packageProviderNames) {
- PackageProvider provider = container.getInstance(PackageProvider.class, name);
- provider.init(this);
- provider.loadPackages();
- packageProviders.add(provider);
- }
- }
- rebuildRuntimeConfiguration();
- } finally {
- if (oldContext == null) {
- ActionContext.setContext(null);
- }
- }
- return packageProviders;
- }
public synchronized List<PackageProvider> reloadContainer(List<ContainerProvider> providers) throws ConfigurationException { packageContexts.clear(); loadedFileNames.clear(); List<PackageProvider> packageProviders = new ArrayList<PackageProvider>(); //Struts2(xwork2)用Container来完成依赖注入的功能 //首先初始化一个ContainerBuilder,再由builder来保存接口与实现类或工厂类的对应关系 //然后通过builder.create(boolean)方法产生container //由container.getInstance(Class);就可以得到接口的实现实例了 //这一部分比较复杂,后面研究完成了,会单独拿出来讲,这里先弄清楚Xwork依赖注入的实现步骤就可以了 ContainerProperties props = new ContainerProperties(); ContainerBuilder builder = new ContainerBuilder(); for (final ContainerProvider containerProvider : providers) { //循环调用ConfigurationProvider的init和register方法,明白了吧,在这里统一循环调用 containerProvider.init(this); containerProvider.register(builder, props); } props.setConstants(builder); //注入依赖关系,在这里并不产生实例 builder.factory(Configuration.class, new Factory<Configuration>() { public Configuration create(Context context) throws Exception { return DefaultConfiguration.this; } }); ActionContext oldContext = ActionContext.getContext(); try { // Set the bootstrap container for the purposes of factory creation Container bootstrap = createBootstrapContainer(); setContext(bootstrap); //create已经注入依赖关系的Container container = builder.create(false); setContext(container); objectFactory = container.getInstance(ObjectFactory.class); // Process the configuration providers first for (final ContainerProvider containerProvider : providers) { if (containerProvider instanceof PackageProvider) { container.inject(containerProvider); //调用PackageProvider的loadPackages()方法,这里主要是针对XmlConfigurationProvider和StrutsXmlConfigurationProvider ((PackageProvider)containerProvider).loadPackages(); packageProviders.add((PackageProvider)containerProvider); } } // Then process any package providers from the plugins Set<String> packageProviderNames = container.getInstanceNames(PackageProvider.class); if (packageProviderNames != null) { for (String name : packageProviderNames) { PackageProvider provider = container.getInstance(PackageProvider.class, name); provider.init(this); provider.loadPackages(); packageProviders.add(provider); } } rebuildRuntimeConfiguration(); } finally { if (oldContext == null) { ActionContext.setContext(null); } } return packageProviders; }
发表评论
-
Struts2--ActionContext及CleanUP Filter
2010-10-26 16:41 15961. ActionContext ActionCont ... -
Struts2--Dispatcher&ConfigurationProvider
2010-10-26 16:39 954首先强调一下struts2的线程程安全,在Struts2中 ... -
Struts2 --FilterDispatcher核心控制器
2010-10-26 16:34 1730Dispatcher已经在之前讲过,这就好办了。Filte ... -
Struts2 -- ActionProxy&ActionInvocation
2010-10-26 16:11 1207下面开始讲一下主菜ActionProxy了.在这之前最好先去了 ... -
Struts2 --拦截器&工作流程概述
2010-10-24 01:00 2045记得一次面试当面试 ...
相关推荐
<bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class="com.struts2.MyDefaultActionMapper" /> <constant name="struts.mapper.class" value=...
plexus-sec-dispatcher-1.3.jar
505) at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org....
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter </filter-class> <filter-mapping> <!-- 拦截所有的url --> <filter-name>struts2</filter-name> <url-pattern>/*</url-...
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> <!-- 引用个具体类文件 --> </filter> <filter-mapping> <filter-name>struts2</filter-name> ...
最近温习ssh2整合编程,顺便浏览下struts2有什么更新的消息,下载了新版本的struts2的2.1.8.1版,使用的是MyEclipse8.0开发,但是问题就随之而来了。MyEclipse8.0中自带的struts2版本是2.1.6,spring版本有2.0,2.5...
数据库连接池
npm install typed-event-dispatcher // Import as an ES Module. import { TypedEventDispatcher } from "typed-event-dispatcher" ; // Or require as a CommonJS Module. const { TypedEventDispatcher } = ...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ...
struts2官网2.3版本的最后一个版本,能够...注意此版本的dispatcher是org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter。详见https://struts.apache.org/docs/struts-23-to-25-migration.html。
#simple-flux-dispatcher 用于通量的简单调度程序。 的工作方式与助焊剂文档中所述的相同,但更简单,并带有易于理解的错误消息 ##安装 npm install --save-dev simple-flux-dispatcher 用法 var ...
官网对struts2的2.5版本做了一些修改,包括dispatcher(org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter)等,详见https://struts.apache.org/docs/struts-23-to-25-migration.html。
kamailio-etcd-dispatcher 将针对Asterisk的服务发现添加到Kamailio,让Kamailio动态发现Asterisk框,然后对其进行负载平衡。 修改Kamailio调度程序,以使Kamailio充当用etcd发现的计算机的负载平衡器。 该工具会...
Diff Dispatcher A simple annotation processor for generating data class changes dispatcher Applications which use unidirectional UI archictures have UI state passed to a single "render"-method. ...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
所以一个建议的方法是使用Dispatcher.InvokeAsync ,如果需要深入了解,请看我师傅的文章深入了解 WPF Dispatcher 的工作原理在所
org.apache.struts2.dispatcher.FilterDispatcher
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
acala-oracle-dispatcher