設定ファイルにビジネス ルールを設定することで、コードの合理化と保守が可能になり、ルールを変更する場合も設定ファイルのみを変更するだけで済みます。 easy-rules は、Spring の SPEL 式、Apache JEXL 式、MVL 式をサポートするコンパクトなルール エンジンです。
プロジェクトの Gradle に依存関係を追加します。
build.gradle:
plugins {
id 'org.springframework.boot' バージョン '3.0.5'
id 'io.spring.dependency-management ' バージョン '1.1.0'
id 'java'
}group = 'cn.springcamp'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17 'configurations {
applyOnly {
extendsFrom annotationProcessor
}
testCompileOnly {
extendsFrom testAnnotationProcessor
}
}repositories {
mavenCentral()
}依存関係 {
実装 "org.springframework.boot:spring-boot-starter-json"
実装 'org.springframework.boot:spring-boot -starter-validation'
実装 'org.jeasy:easy-rules-core:4.1.0'
実装 'org.jeasy:easy-rules-spel:4.1.0'
実装 'org. jeasy:easy-rules-support:4.1.0'
annotationProcessor 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
testImplementation "org.springframework.boot:spring-boot-starter -test"
testImplementation 'org.junit.vintage:junit-vintage-engine'
testImplementation 'org.junit.vintage:junit-vintage-engine'
}dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependency:2022.0.1"
}
}test {
useJUnitPlatform()
}
サンプル プログラムは、ビジネス ルールを設定ファイル (ビジネス ルール設定ファイル (demo-rule.yml) コード:
#) に配置します。##名前: "年齢ルール"ルール設定ファイル 条件を介して設定し、ルールが満たされると、アクションで設定されたアクションが呼び出されます。 サンプル プロジェクトでは、ルール設定に Spring の SPEL 式を使用しています。設定ファイルには 2 つのルールが設定されています。最初のルールは、説明: ""
優先度: 1
条件: "#person.getAdult() == false"
アクション:
- " T( java.lang.System).out.println(\"ショップ: 申し訳ありませんが、アルコールの購入は禁止されています\")"
- "#person.setAdult(true)"
- "#person .setAge (18)"
---
名前: "アルコール ルール"
説明: ""
優先度: 1
条件: "#person.getAdult() == true"
actions:
- "T(java.lang.System).out.println(\"ショップ: アルコールの購入が許可されました\")"
person Spring Bean の getAdult() を介するかどうかを決定します。ルールが満たされ、ルールが満たされると 3 つのメソッドが呼び出されます。
rule:4. コードでルール エンジンを設定します。Skip-on-first-failed-rule: true
最初に適用されたルールをスキップ: false
最初に適用された非トリガールールをスキップ: true
ルール:
- ルール ID: "デモ"
ルール- file-location: "classpath:demo-rule.yml"
RuleEngineConfigこの春のルール エンジンを使用してルールを設定します。構成クラス エンジン構成:
@Slf4j @EnableConfigurationProperties(RuleEngineConfigProperties.class) @Configuration public class RuleEngineConfig implements BeanFactoryAware { @Autowired(required = false) private List<RuleListener> ruleListeners; @Autowired(required = false) private List<RulesEngineListener> rulesEngineListeners; private BeanFactory beanFactory; @Bean public RulesEngineParameters rulesEngineParameters(RuleEngineConfigProperties properties) { RulesEngineParameters parameters = new RulesEngineParameters(); parameters.setSkipOnFirstAppliedRule(properties.isSkipOnFirstAppliedRule()); parameters.setSkipOnFirstFailedRule(properties.isSkipOnFirstFailedRule()); parameters.setSkipOnFirstNonTriggeredRule(properties.isSkipOnFirstNonTriggeredRule()); return parameters; } @Bean public RulesEngine rulesEngine(RulesEngineParameters rulesEngineParameters) { DefaultRulesEngine rulesEngine = new DefaultRulesEngine(rulesEngineParameters); if (!CollectionUtils.isEmpty(ruleListeners)) { rulesEngine.registerRuleListeners(ruleListeners); } if (!CollectionUtils.isEmpty(rulesEngineListeners)) { rulesEngine.registerRulesEngineListeners(rulesEngineListeners); } return rulesEngine; } @Bean public BeanResolver beanResolver() { return new BeanFactoryResolver(beanFactory); } @Bean public RuleEngineTemplate ruleEngineTemplate(RuleEngineConfigProperties properties, RulesEngine rulesEngine) { RuleEngineTemplate ruleEngineTemplate = new RuleEngineTemplate(); ruleEngineTemplate.setBeanResolver(beanResolver()); ruleEngineTemplate.setProperties(properties); ruleEngineTemplate.setRulesEngine(rulesEngine); return ruleEngineTemplate; } @Bean public RuleListener defaultRuleListener() { return new RuleListener() { @Override public boolean beforeEvaluate(Rule rule, Facts facts) { return true; } @Override public void afterEvaluate(Rule rule, Facts facts, boolean b) { log.info("-----------------afterEvaluate-----------------"); log.info(rule.getName() + rule.getDescription() + facts.toString()); } @Override public void beforeExecute(Rule rule, Facts facts) { log.info("-----------------beforeExecute-----------------"); log.info(rule.getName() + rule.getDescription() + facts.toString()); } @Override public void onSuccess(Rule rule, Facts facts) { log.info("-----------------onSuccess-----------------"); log.info(rule.getName() + rule.getDescription() + facts.toString()); } @Override public void onFailure(Rule rule, Facts facts, Exception e) { log.info("-----------------onFailure-----------------"); log.info(rule.getName() + "----------" + rule.getDescription() + facts.toString() + e.toString()); } }; } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } }
ruleEngineTemplate は構成ファイルで構成され、ルール エンジンの実行は、ruleEngineTemplate を通じてトリガーされます。
ruleEngineTemplate構成後、ビジネス コードでルール エンジンを実行し、構成ファイルで構成されたビジネス ルールを処理できます:
@SpringBootApplication public class Application implements CommandLineRunner { @Autowired RuleEngineTemplate ruleEngineTemplate; public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void run(String... args) { Person person = new Person(); Facts facts = new Facts(); facts.put("person", person); ruleEngineTemplate.fire("demo", facts); } }
を参照してください。 ショップ: 申し訳ありませんが、アルコールの購入は許可されていません 、このコンテンツは
"T(java.lang.System).out.println(\"Shop weルール ファイルのアクションで構成されています: 申し訳ありませんが、アルコールの購入は許可されていません\")"。ルールが正常に実行されたことを示します。
以上がSpringBoot が easy-rules ルール エンジンを統合するプロセスは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。