DI コンテナ作ってた
とりあえずある程度の形にはなってたりします。
public interface SampleComponent { public String helloworld(); }
import freja.di.config.annotation.*; @Component class SampleComponentImpl implements SampleComponent { public String helloworld() { return "HELLO WORLD"; } }
import freja.di.*; import freja.di.config.annotation.*; @Aspect(targetInterface = { SampleComponent.class }) class SampleAspect implements Interceptor { public Object intercept(String name, MethodInvocation invocation, Object[] args) throws Exception { return "== " + invocation.invoke(args) + " =="; } }
import freja.di.*; import freja.di.config.annotation.*; public class Test { public static void main(String[] args) { SampleComponent obj = Freja.get(SampleComponent.class); System.out.println(obj.helloworld()); } }
C:\Users\SiroKuro\Desktop\tt>javac -cp .;freja.jar *.java C:\Users\SiroKuro\Desktop\tt>java -cp .;freja.jar Test == HELLO WORLD ==
コンセプトは「設定ファイル無し」「注釈で制御できないことは行わない」の2つで、とりあえずバッドノウハウの少ないものにしたいなと考えています。
とりあえず動くけど、AOP まわりがまだまだ作りかけ。
課題は private なクラス(と、そのクラスを使ったクラス)をコンポーネントにしようとするとコケること。HotDeploy を行わないなら何ら問題ないんだけど、どういう着地点にするかで、まだ考えてみたいような。
- HotDeploy 可否フラグを @Component に持たせる(手動万歳派)
- private を読み込もうとしてコケたら HotDeploy を行わない(ログ出てないとドツボに嵌りやすい派)
- private なクラスはコンポーネント化しちゃだめ(それは仕様です派)
選択肢はこのあたりかな。