LoginSignup
2
2

More than 5 years have passed since last update.

Spring で簡易プラグイン機構、に順序も考慮する

Posted at

Spring を使った簡易プラグイン機構としては、以下に書かれている通りでとても簡単に実現できる。

DIコンテナで実現する簡易プラグイン機構
https://blog.ik.am/entries/331

ここでは、更にプラグインの適用順序も考慮してみる。
やり方はとても簡単で @Priority を付けて順番を定義するだけ。

MyPlugin.java
public interface MyPlugin {
    String execute();
}
MyPluginService.java
@Service
public class MyPluginService {
    @Autowired
    List<MyPlugin> plugins;

    public List<String> execute() {
        return plugins.stream().map(p -> p.execute()).collect(Collectors.toList());
    }
}
PluginController.java
@RestController
public class PluginController {
    @Autowired
    MyPluginService myPluginService;

    @GetMapping("plugins")
    public List<String> plugins() {
        return myPluginService.execute();
    }
}
@Component
@Priority(10)
public class Fuga1Plugin implements MyPlugin {
    @Override
    public String execute() {
        return "Fuga1Plugin";
    }
}

@Component
@Priority(50)
public class Hoge1Plugin implements MyPlugin {
    @Override
    public String execute() {
        return "Hoge1Plugin";
    }
}

@Component
@Priority(100)
public class Fuga2Plugin implements MyPlugin {
    @Override
    public String execute() {
        return "Fuga2Plugin";
    }
}

@Component
@Priority(200)
public class Hoge2Plugin implements MyPlugin {
    @Override
    public String execute() {
        return "Hoge2Plugin";
    }
}
実行結果
$ curl http://localhost:8080/plugins | jq .
[
  "Fuga1Plugin",
  "Hoge1Plugin",
  "Fuga2Plugin",
  "Hoge2Plugin"
]

ちなみに、Spring 4.1 からは @Order ではなく @Priority 推奨とのこと。
また、@Conditional を使えば、適用条件も書けたりするが、あまり使う機会はなさそう。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2