PackageBasedActionConfigBuilder
是 Struts 2 Convention 插件的核心类之一,负责扫描类路径中的 Action 类,并根据注解(如 @Action
、@Namespace
等)生成 Struts 2 的配置(ActionConfig
和 PackageConfig
)。以下是该类中主要方法的用途和参数说明:
1. 构造方法
public PackageBasedActionConfigBuilder(Configuration configuration, Container container, ObjectFactory objectFactory, String redirectToSlash, String defaultParentPackage)
- 用途:初始化
PackageBasedActionConfigBuilder
实例。 - 参数:
configuration
:Struts 2 的配置对象。container
:依赖注入容器。objectFactory
:用于创建 Action 实例的工厂。redirectToSlash
:是否将请求重定向到以斜杠结尾的 URL。defaultParentPackage
:默认的父包名。
2. buildActionConfigs()
public void buildActionConfigs()
- 用途:扫描类路径中的 Action 类,并生成 Struts 2 的配置。
- 流程:
- 检查是否启用了 Action 扫描(
disableActionScanning
)。 - 调用
findActions()
方法查找所有符合条件的 Action 类。 - 调用
buildConfiguration()
方法生成配置。
- 检查是否启用了 Action 扫描(
3. findActions()
protected Set<Class> findActions()
- 用途:查找所有符合条件的 Action 类。
- 流程:
- 根据
actionPackages
和packageLocators
配置确定扫描的包路径。 - 使用
ClassFinder
扫描类路径中的类。 - 返回所有符合条件的 Action 类。
- 根据
4. buildConfiguration(Set<Class> classes)
protected void buildConfiguration(Set<Class> classes)
- 用途:根据扫描到的 Action 类生成 Struts 2 的配置。
- 参数:
classes
:扫描到的 Action 类集合。
- 流程:
- 遍历每个 Action 类,解析其注解(如
@Action
、@Namespace
等)。 - 生成
ActionConfig
和PackageConfig
,并将其添加到 Struts 2 的配置中。
- 遍历每个 Action 类,解析其注解(如
5. getActionAnnotations(Class<?> actionClass)
protected Map<String, List<org.apache.struts2.convention.annotation.Action>> getActionAnnotations(Class<?> actionClass)
- 用途:获取 Action 类中所有方法的
@Action
注解。 - 参数:
actionClass
:要扫描的 Action 类。
- 返回值:一个映射,键为方法名,值为该方法的
@Action
注解列表。
6. createActionConfig()
protected void createActionConfig(PackageConfig.Builder pkgCfg, Class<?> actionClass, String actionName, String actionMethod, org.apache.struts2.convention.annotation.Action annotation, Set<String> allowedMethods)
- 用途:根据 Action 类和注解生成
ActionConfig
。 - 参数:
pkgCfg
:当前包的配置构建器。actionClass
:Action 类。actionName
:Action 的名称。actionMethod
:Action 的方法名。annotation
:@Action
注解。allowedMethods
:允许的方法集合。
- 流程:
- 根据注解生成
ActionConfig
。 - 添加拦截器和结果映射。
- 将
ActionConfig
添加到包的配置中。
- 根据注解生成
7. determineActionNamespace(Class<?> actionClass)
protected List<String> determineActionNamespace(Class<?> actionClass)
- 用途:确定 Action 类的命名空间。
- 参数:
actionClass
:Action 类。
- 返回值:命名空间列表。
8. determineActionName(Class<?> actionClass)
protected String determineActionName(Class<?> actionClass)
- 用途:确定 Action 类的名称。
- 参数:
actionClass
:Action 类。
- 返回值:Action 的名称。
9. getPackageConfig()
protected PackageConfig.Builder getPackageConfig(Map<String, PackageConfig.Builder> packageConfigs, String actionNamespace, String actionPackage, Class<?> actionClass, org.apache.struts2.convention.annotation.Action action)
- 用途:获取或创建包的配置构建器。
- 参数:
packageConfigs
:包配置构建器的映射。actionNamespace
:Action 的命名空间。actionPackage
:Action 的包名。actionClass
:Action 类。action
:@Action
注解。
- 返回值:包的配置构建器。
10. buildIndexActions()
protected void buildIndexActions(Map<String, PackageConfig.Builder> packageConfigs)
- 用途:为每个命名空间创建默认的
index
Action。 - 参数:
packageConfigs
:包配置构建器的映射。
11. needsReload()
public boolean needsReload()
- 用途:检查是否需要重新加载配置(用于开发模式)。
- 返回值:如果需要重新加载,返回
true
,否则返回false
。
12. destroy()
public void destroy()
- 用途:清理资源,释放加载的文件 URL。
13. initReloadClassLoader()
protected void initReloadClassLoader()
- 用途:初始化重新加载类加载器(用于开发模式)。
14. getClassLoader()
protected ClassLoader getClassLoader()
- 用途:获取当前线程的上下文类加载器。
- 返回值:类加载器。
15. getClassLoaderInterface()
protected ClassLoaderInterface getClassLoaderInterface()
- 用途:获取类加载器接口(用于扫描类路径)。
- 返回值:类加载器接口。
16. isReloadEnabled()
protected boolean isReloadEnabled()
- 用途:检查是否启用了重新加载功能(用于开发模式)。
- 返回值:如果启用了重新加载,返回
true
,否则返回false
。
17. buildClassFinder()
protected ClassFinder buildClassFinder(Test<String> classPackageTest, List<URL> urls)
- 用途:构建类查找器(
ClassFinder
),用于扫描类路径中的类。 - 参数:
classPackageTest
:用于测试类包名的条件。urls
:类路径 URL 列表。
- 返回值:类查找器。
18. readUrls()
private List<URL> readUrls() throws IOException
- 用途:读取类路径中的 URL。
- 返回值:URL 列表。
19. buildUrlSet()
private UrlSet buildUrlSet(List<URL> resourceUrls) throws IOException
- 用途:构建 URL 集合,用于扫描类路径。
- 参数:
resourceUrls
:资源 URL 列表。
- 返回值:URL 集合。
20. includeClassNameInActionScan()
protected boolean includeClassNameInActionScan(String className)
- 用途:检查类名是否符合扫描条件。
- 参数:
className
:类名。
- 返回值:如果符合条件,返回
true
,否则返回false
。
21. checkExcludePackages()
protected boolean checkExcludePackages(String classPackageName)
- 用途:检查类包名是否在排除列表中。
- 参数:
classPackageName
:类包名。
- 返回值:如果不在排除列表中,返回
true
,否则返回false
。
22. checkActionPackages()
protected boolean checkActionPackages(String classPackageName)
- 用途:检查类包名是否在 Action 包列表中。
- 参数:
classPackageName
:类包名。
- 返回值:如果在列表中,返回
true
,否则返回false
。
23. checkPackageLocators()
protected boolean checkPackageLocators(String classPackageName)
- 用途:检查类包名是否符合包定位器的条件。
- 参数:
classPackageName
:类包名。
- 返回值:如果符合条件,返回
true
,否则返回false
。
总结
PackageBasedActionConfigBuilder
是 Struts 2 Convention 插件的核心类,负责扫描类路径中的 Action 类,并根据注解生成 Struts 2 的配置。它的主要方法包括扫描类路径、解析注解、生成配置等。通过这个类,Struts 2 可以自动注册 Action,而无需手动配置 struts.xml
。
评论区