`
movingboy
  • 浏览: 55606 次
社区版块
存档分类
最新评论

答复: acegi的objectDefinitionSource为什么可以接受string类型!??

    博客分类:
  • Java
阅读更多
曾经查看Acegi的源码,FilterSecurityInterceptor的objectDefinitionSource属性的类型为FilterInvocationDefinitionSource,猜测Acegi是使用FilterInvocationDefinitionSourceEditor读取配置并赋值给它(objectDefinitionSource)的,因为查看FilterInvocationDefinitionSourceEditor的源码,其中有相关的读取配置的代码。但FilterInvocationDefinitionSourceEditor是在何时及如何被调用的呢?

在Spring的官方论坛中找到一个帖子:http://forum.springframework.org/showthread.php?t=11242&highlight=objectDefinitionSource

其中提到:

引用
The PropertyEditorManager uses three techniques for locating an editor for a given type. First, it provides a registerEditor method to allow an editor to be specifically registered for a given type. Second it tries to locate a suitable class by adding "Editor" to the full qualified classname of the given type (e.g. "foo.bah.FozEditor"). Finally it takes the simple classname (without the package name) adds "Editor" to it and looks in a search-path of packages for a matching class.


PropertyEditorManager是java.beans包中的一个类,难道其中的根据“类型名称+Editor”来查找属性相应的编辑器(姑且这么翻译)的机制是Java早就拥有的?查看JDK中PropertyEditorManager相关的内容,果然找到上面的那段话!

原来是这样!难怪在Spring、Acegi的源码中都找不到注册或调用FilterInvocationDefinitionSourceEditor的代码。我以为这是Spring或Acegi提供的机制,原来是Java的标准机制!

至此可以理解读取配置并给属性赋值的过程大致如下:
1.Spring读取Acegi相关的配置,知道需要把类似

引用
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
                 PATTERN_TYPE_APACHE_ANT 
                 /secured/usermanage/**=ROLE_TEST 
                 /secured/**=ROLE_USER


的内容赋值给bean filterSecurityInterceptor的objectDefinitionSource属性

2.Spring知道filterSecurityInterceptor的objectDefinitionSource属性的类型为FilterInvocationDefinitionSource,查找该类型的编辑器。因为Acegi并未为该类型显式地注册编辑器(查Acegi代码可知),Spring应用上面的规则查到相应的编辑器为FilterInvocationDefinitionSourceEditor

3.Spring实例化FilterInvocationDefinitionSourceEditor,并调用它完成后续的读取配置并给属性赋值的工作
分享到:
评论
1 楼 truesmile 2009-08-17  
嗯,说的没错,开始贴代码。Spring中TypeConverterDelegate的convertIfNecessary方法用于类型转换:
// Value not of required type?
		if (pe != null || (requiredType != null && !ClassUtils.isAssignableValue(requiredType, convertedValue))) {
			if (pe == null && descriptor != null) {
				if (JdkVersion.isAtLeastJava15()) {
					pe = descriptor.createPropertyEditor(this.targetObject);
				}
				else {
					Class editorClass = descriptor.getPropertyEditorClass();
					if (editorClass != null) {
						pe = (PropertyEditor) BeanUtils.instantiateClass(editorClass);
					}
				}
			}
			if (pe == null && requiredType != null) {
				// No custom editor -> check BeanWrapperImpl's default editors.
				pe = (PropertyEditor) this.propertyEditorRegistry.getDefaultEditor(requiredType);
				if (pe == null) {
					// No BeanWrapper default editor -> check standard JavaBean editors.
					pe = [color=red]PropertyEditorManager.findEditor(requiredType);[/color]
				}
			}
			convertedValue = convertValue(convertedValue, requiredType, pe, oldValue);
		}

当属性没有默认属性器、或者在自定义属性编辑器Map中没有对应的属性编辑器时,会调用PropertyEditorManager.findEditor(Class)方法。看看JDK源码中的实现:
public static synchronized PropertyEditor findEditor(Class<?> targetType) {
	initialize();
	Class editorClass = (Class)registry.get(targetType);
	if (editorClass != null) {
	    try {
		Object o = editorClass.newInstance();
        	return (PropertyEditor)o;
	    } catch (Exception ex) {
	 	System.err.println("Couldn't instantiate type editor \"" +
			editorClass.getName() + "\" : " + ex);
	    }
	}

	// Now try adding "Editor" to the class name.

	[color=red]String editorName = targetType.getName() + "Editor";
	try {
	    return (PropertyEditor) Introspector.instantiate(targetType, editorName);
	} catch (Exception ex) {
	   // Silently ignore any errors.
	}[/color]

	// Now try looking for <searchPath>.fooEditor
	editorName = targetType.getName();
   	while (editorName.indexOf('.') > 0) {
	    editorName = editorName.substring(editorName.indexOf('.')+1);
	}
	for (int i = 0; i < searchPath.length; i++) {
	    String name = searchPath[i] + "." + editorName + "Editor";
	    try {
	        return (PropertyEditor) Introspector.instantiate(targetType, name);
	    } catch (Exception ex) {
	       // Silently ignore any errors.
	    }
	}

	// We couldn't find a suitable Editor.
	return null;
    }


会自行在属性类型后加上Editor,然后试图加载响应的类并实例化。比如属性为Person,则会加载并实例化一个PersonEditor对象。

相关推荐

    Spring安全系统:Acegi Security--星月夜

    标题和描述均提及了“Spring安全系统:Acegi Security”,这是一种专为Spring Framework设计的安全解决方案,旨在提供强大的认证和授权功能。Acegi Security,后更名为Spring Security,是Spring生态系统中的重要...

    Acegi(四):Acegi初体验及初解剖

    授权方面,Acegi允许我们为不同的URL、方法或整个控制器定义访问规则。这可以通过定义访问决策管理器(AccessDecisionManager)和访问决策投票器(AccessDecisionVoter)来实现。博主可能会解释如何配置这些组件,以...

    实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.rar

    Acegi是Spring Security的前身,它是一个强大的、可配置的安全框架,用于构建安全的Java Web应用程序。本实战教程将深入探讨如何将Acegi集成到基于Spring的Web应用中,以实现用户认证、授权以及安全控制等功能。 ...

    acegi

    Acegi 是一个在Java开发领域,特别是Spring框架中曾经广泛使用的安全组件,全称为Acegi Security。这个系统为Spring应用程序提供了全面的安全管理解决方案,包括身份验证、授权、会话管理以及安全事件处理等功能。...

    实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.pdf

    Acegi是Spring框架早期的一个安全模块,现在已被Spring Security所取代。然而,了解Acegi的安全机制对于理解Spring Security的工作原理非常有帮助。本篇将深入探讨如何在基于Spring的Web应用中集成并使用Acegi进行...

    acegi 完整实例

    Acegi Security是Spring框架早期的安全模块,现在已被Spring Security所替代。然而,了解Acegi的安全机制对于理解Spring Security的工作原理仍然很有帮助。本实例提供的内容是关于Acegi Security的全面应用,涵盖了...

    基于java的ACEGI

    AceGI,全称为Acegi Security,是Java领域中一个用于Spring框架的安全组件,它提供了全面的身份验证、授权和会话管理功能。这个框架在早期的Spring版本中非常流行,为开发者构建安全的Web应用程序提供了强大的支持。...

    Acegi例子代码+一个很好的学习Acegi的网址

    Acegi是Spring Security的前身,它是一个用于Java企业级应用的安全框架,提供了全面的身份验证、授权和会话管理功能。这个压缩包包含了Acegi的示例代码和一个学习资源,对于初学者来说是非常宝贵的资料。 首先,让...

    acegi应用安全J2EE安全

    Acegi Security是Spring社区早期开发的一个安全框架,用于增强J2EE应用程序的安全性。这个框架在Spring Security(之前称为Acegi Security)的后续版本中得到了发展和改进,成为了Spring生态中的核心组件。本文将...

    acegi_help.zip_Help!_acegi

    开发者可以部署这个WAR文件,通过实践来理解Acegi的配置和使用方法。 总的来说,这个压缩包提供了一个全方位的学习和实践Acegi Security的平台,涵盖了理论知识和实际操作,对于提升开发者在Spring应用中的安全防护...

    Acegi_db1.rar_acegi

    Acegi_db1.rar_acegi 是一个与Acegi安全框架相关的压缩包,它可能包含了用于数据库配置和安全策略实现的源代码以及相关的说明文档。Acegi是Spring Security的前身,是一个非常重要的Java安全框架,主要用于企业级...

    acegi-sample.rar_acegi

    总的来说,Acegi Security框架为Java Web应用提供了强大的安全防护,它的设计思路和实现方式对于理解现代Web应用的安全架构有着重要的参考价值。虽然现在Spring Security已经替代了Acegi,但Acegi的历史地位和它提供...

    Acegi安全系统详解.doc

    总的来说,Acegi安全系统为开发者提供了强大的工具,以实现复杂的企业级安全需求,同时保持代码的整洁和可维护性。通过灵活的配置和丰富的功能,Acegi成为了构建安全、高效应用程序的关键组件。

    Acegi解决权限问题

    Acegi Security是Spring框架早期的一个安全模块,它为Java企业级应用提供了强大的权限管理解决方案。在本文中,我们将深入探讨Acegi如何解决权限问题,并通过分析提供的代码、文档和配置文件,来理解其实现机制。 ...

    实战Acegi:使用Acegi作为基于Spring框架的WEB应

    而Acegi Security是Spring社区早期的一个安全模块,它提供了全面的身份验证、授权和会话管理功能,为基于Spring的应用程序提供了强大的安全性支持。本实战教程将深入探讨如何将Acegi Security集成到Spring框架中,...

    实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架

    Acegi是一个专门为SpringFramework应用提供安全机制的开放源代码项目,全称为Acegi Security System for Spring,当前版本为 0.8.3。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和...

    收集的一些ACEGI 资料

    ACEGI,全称为Acegi Security,是一个在Java社区中广泛使用的安全框架,它为Spring框架提供了全面的安全管理功能。在过去的几年里,ACEGI一直是许多企业级应用开发者的首选工具,因为它提供了强大的身份验证、授权和...

    Acegi中文参考手册

    Acegi Security System for Spring 是一个历史悠久的Java安全框架,它为Spring应用提供了全面的安全管理解决方案。这个框架的主要目标是提供一套灵活、可扩展且易于使用的工具,帮助开发人员实现复杂的身份验证、...

    acegisecurity-1.0.7.zip_.acegisecuri_acegi security 1.0.7_acegi

    Acegi Security通过提供细粒度的访问控制,允许开发者定义谁能访问哪些资源,以及在什么条件下可以访问。这包括基于角色的访问控制(RBAC)、表达式式访问控制(ACE)和动态授权等机制。 在Acegi Security 1.0.7中...

Global site tag (gtag.js) - Google Analytics