32366

[code]

    @Component
    public class Test {
        // MessageSourceインスタンス
        private static MessageSource messageSource;
    
        // MessageSource DIインスタンス
        @Autowired
        private MessageSource diMessageSource;
    
        private static Locale locale = new Locale("ja_JP");
    
        // 初期化
        @PostConstruct
        public void init() {
            MessageUtils.messageSource = diMessageSource;
        }
    
        // プロパティから文字列読み出し
        public static String getMessage(String id) {
            return messageSource.getMessage(id, null, locale);
    }
    
[/code]

こんな感じのクラスを

jp.co.TestProject(プロジェクト名).testこのパッケージ配下に置いていた場合は  
初期化処理が呼ばれた後に実施されていたのですが  
jp.co配下に移動させると  
なぜかプロパティ文字列読み出しが先に呼ばれてしまいます。

コンストラクタが先に呼ばれるものと思っていたのですが異なるのでしょうか？


CC BY-SA 3.0
2016-12-20T07:45:18.460
31262
2017-02-04T11:23:26.673
2016-12-20T07:47:29.610
5044
12842
question
java spring-boot
Javaのコンストラクタ


パッケージ移動云々に関しては原因がよくわからないため、以下の点のみに注目して回答します。

> コンストラクタが先に呼ばれるものと思っていたのですが異なるのでしょうか？  
>  質問を「init()が呼ばれる前に、getMessage()が呼ばれることはあり得るか？」と解釈しました。  
>  @PostConstructが付与されたメソッドはTestクラスがインスタンス化される際に呼ばれます。  
>  （＝インスタンス化されなければ呼ばれません）  
>  そして、質問にあるTestクラスのgetMessageメソッドはstaticメソッドです。  
>  staticメソッドはクラスをインスタンス化せずとも呼び出せます。

つまり、Testクラスをインスタンス化する処理よりも先に、getMessage()を呼び出す処理があるならば、先にgetMessageが呼ばれることはありえます。


CC BY-SA 3.0
2017-02-03T10:20:14.020
32366
2017-02-04T11:23:26.673
2017-02-04T11:23:26.673
20272
20272
31262
answer


> コンストラクタが先に呼ばれるものと思っていたのですが異なるのでしょうか？

initメソッドは @PostConstruct が指定されていますが、正確にはコンストラクタではありません。

<http://www.techscore.com/tech/Java/JavaEE/Servlet/14-2/#servlet2.5_2.2>


CC BY-SA 3.0
2017-02-03T13:27:13.910
32368
2017-02-03T13:27:13.910
354
31262
answer