2017-05-10 4 views
1

私は平等なJavaコード(Beanまたはコンテナフレームワークなし)を開発しており、@PostConstruct/@PreDestroyの機能を実現したいと考えていました。それは可能ですか?PostConstructをPlain Javaで使用する方法

実現可能性を確認するためのサンプルコードを作成しました(下記のコードサンプル)。しかし、postContruct()メソッドとbeforeDestroy()メソッドは呼び出されません。

これを行うには?

import javax.annotation.PostConstruct; 
import javax.annotation.PreDestroy; 

public class Test { 

    public static void main (String...strings) { 
     Test test = new Test(); 
     System.out.println("Ready...."); 
     test.sayHello(); 
     System.out.println("Done..."); 

    } 

    private void sayHello() { 
     System.out.println("Hello World !! "); 
    } 

    @PostConstruct 
    public void postConstruct() { 
     System.out.println("PostConstruct is called .. "); 
    } 

    @PreDestroy 
    public void beforeDestroy() { 
     System.out.println("beforeDestroy is called "); 
    } 

} 

出力は

Ready.... 
Hello World !! 
Done... 
+5

フレームワークなしでは、不可能です。いずれかを使用するか、または1つを作成します。*可視的なフレームワークがなければ、コンパイル時にコードを変更できるようにするJava Annotation Processingなどのものを使用したいかもしれませんが、その点では実行可能かどうかはわかりません。本当に複雑なケースは '@ PreDestroy'です。あなたのコードでは、通常、シャットダウンにフックを追加する必要があります。また、( 'Object'の)' finalize'メソッドを使うこともできますが、すべてのベットはオフになっています。 –

+0

フレームワークなしでは、これらのオブジェクトを構築するのはあなただけであり、発生する唯一の方法はコンストラクタを経由することです。 – EJP

+0

POJOがPostConstructのアノテーションの種類を必要としないことを伝えないでください。おそらく、あなたは数年前に生まれ、フレームワーク上の血と肌に依存します – Arun

答えて

2

あなたの質問に言及されているコメントは、それがすでに述べています。注釈を処理するフレームワークまたはツールを使用しない場合、いいえ、これらの@PostConstructおよび@PreDestroyメソッドが呼び出される方法はありません。副注釈として、独自のAnnotationProcessorを記述することもできますが、選択したCDIコンテナ(Weld、OpenWebBeansなど)を使用できるフレームワークを作成することになるでしょう。

ここで、アノテーションなしでどのように解決できますか?それは達成したいことによって異なります。例えば、実際に問題がなければ、@PostConstructがオブジェクトの構築の後に正確に呼び出されないと、インスタンス初期化ブロックがあなたのニーズに合うかもしれません。 @PreDestroyあなたがObject.finalizeを上書きする可能性について

class Some { 

    { 
    // your initialization code... however! this is not the same as @PostConstruct 
    } 
} 

あなた自身でfinalizeの実装を提供し、それに関するいくつかの記事を読むときには、その前に注意してください。

しかし、両方のソリューションは注釈の1:1代替ではありませんが、あなたが探しているものかもしれません。

class PreDestroyPostConstruct { 

    PreDestroyPostConstruct() { 
    System.out.println("constructor"); 
    } 

    { 
    System.out.println("initialization block"); 
    } 

    @Override 
    protected void finalize() throws Throwable { 
    System.out.println("finalize"); 
    } 
} 

出力を実証:ここ

は例クラスです

PreDestroyPostConstruct obj = new PreDestroyPostConstruct(); 
obj = null; 
System.out.println("Program finishing"); 

可能な出力:

initialization block 
constructor 
finalize 
Program finishing 

注意、finalizeが前に呼び出されるという保証がないこと"Program finishing" -partとそれがcalではないことが起こることさえありますVMがシャットダウンする前に開始/終了します。

2

理論的にはあなたはそれがオブジェクトを構築した後initメソッドを呼び出し、静的なファクトリメソッドを持つことができます。

private final init(){ 
    .. your stuff after the constructor 
} 

public static MyObject of(int x){ 
    MyObject obj = new MyObject(x); 
    init(); 
    return obj; 
} 

コンストラクタ内で同じことを実行できますが、コンストラクタ内でメソッドを呼び出すのは嫌いです。その場合、そのメソッドはの最後のになるため、オーバーライドされません。

関連する問題