Java 从外部覆盖Spring项目的配置

Java 从外部覆盖Spring项目的配置,java,spring,configuration,Java,Spring,Configuration,我正在开发一个Spring应用程序,它将被任何类型的其他应用程序使用,无论它是Spring项目、web应用程序还是简单的单类控制台应用程序。使用我的项目的应用程序只需将JAR文件添加到我的应用程序中 因此,我的项目有一个静态工厂类,它从Spring上下文中获取并返回一个bean,该bean作为访问对象来访问我的项目的所有公共可用函数。 这部分已经开始工作了 但我需要使用JAR的应用程序的开发人员能够覆盖项目中的某些配置,而无需编辑JAR本身中的配置文件。目前,这些设置应该是可覆盖的: -数据源和

我正在开发一个Spring应用程序,它将被任何类型的其他应用程序使用,无论它是Spring项目、web应用程序还是简单的单类控制台应用程序。使用我的项目的应用程序只需将JAR文件添加到我的应用程序中

因此,我的项目有一个静态工厂类,它从Spring上下文中获取并返回一个bean,该bean作为访问对象来访问我的项目的所有公共可用函数。 这部分已经开始工作了

但我需要使用JAR的应用程序的开发人员能够覆盖项目中的某些配置,而无需编辑JAR本身中的配置文件。目前,这些设置应该是可覆盖的: -数据源和HibernateBean配置 -jasypt(加密)bean配置 -log4j设置

如何使用jar外部的配置覆盖这些设置

问候
触地

如果要替换完整的配置,最简单的方法是使用一个参数化工厂,该工厂采用一个替代配置文件作为其参数


如果您需要更细粒度的xml(最多10个部分),那么您可以一次将应用程序xml拆分为几个较小的xml,然后再次使用可配置的工厂来交换较小的xml文件。

如果您想替换完整的配置,而最简单的方法是使用一个参数化工厂,该工厂将替代配置文件作为其参数


如果您需要更细粒度的xml(最多10个部分),那么您可以一次将应用程序xml拆分为几个较小的xml,然后再次使用可配置工厂来交换较小的xml文件。

也许一个好的解决方案是用户可以覆盖的配置,为此,请查看:

特别是@Configuration和@Bean

也许您可以实现一个配置类,用户可以重写它。在扩展类并覆盖一些提供一些bean的方法之后,用户应该通知您的工厂,它除了


new AnnotationConfigApplicationContext(userConfigurationClass)

也许一个好的解决方案是用户可以覆盖的配置,为此,请查看:

特别是@Configuration和@Bean

也许您可以实现一个配置类,用户可以重写它。在扩展类并覆盖一些提供一些bean的方法之后,用户应该通知您的工厂,它除了


new AnnotationConfigApplicationContext(userConfigurationClass)

所以我得到了一个适合我的解决方案。 我将覆盖上下文XML的常规导入放在主应用程序上下文的底部:

<import resource="classpath*:project/package/config/override/or-*.xml" />


因此,用户所要做的就是在其类路径(例如资源文件夹)中创建包“project/package/config/override”,并将匹配的XML文件与新的bean定义放在其中。

因此我得到了一个适合我的解决方案。 我将覆盖上下文XML的常规导入放在主应用程序上下文的底部:

<import resource="classpath*:project/package/config/override/or-*.xml" />


因此,用户所要做的就是在其类路径(例如资源文件夹)中创建包“project/package/config/override”,并将匹配的XML文件与新的bean定义放在其中。

我已经使用主“application context.XML”中的标记拆分了上下文XML。但我认为这只是在同一个目录中搜索文件……但我更喜欢user1001027,我已经使用主“application context.xml”中的标记拆分了上下文xml。但是我认为这只是在同一个目录中搜索文件…但是我更喜欢user1001027而不是我的。如果我理解正确,将使用我的JAR的用户将必须创建自己的配置类并将其传递给工厂方法?我不能指望用户会这样做。要求是,用户只需将其覆盖配置文件放入项目的类路径中。我最多只能期望他将配置文件所在的foldername传递给我的工厂方法?我不能指望用户会这样做。要求是,用户只需将其覆盖配置文件放入项目的类路径中。我最多只能期望他将配置文件所在的foldername传递给我的工厂方法。