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)
- 用途:为每个命名空间创建默认的
indexAction。 - 参数:
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。
评论区