Spring ControllerのInitメソッド(アノテーション版)


105

コントローラを新しいアノテーションバージョンに変換しています。以前のバージョンでは、springmvc-servlet.xmlでinitメソッドを指定するために使用しました:

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>

アノテーションバージョンを使用してinitメソッドを指定するにはどうすればよいですか?


回答:


238

使用できます

@PostConstruct
public void init() {
   // ...
}

1
そうです、その「Common Annotations 1.0」、Java1.7も動作します。
Grim

SecurityContextHolderのUserを使用する必要がある場合、PostConstructの時点では初期化されていません。ステートレスメソッドのように使用する必要があります。(getUser()... {return Security ... user();}
Joao Polo

パブリックまたはプライベート
anshulkatta 2017

20

または、クラスにInitializingBeanインターフェースを実装してafterPropertiesSet()、Beanの構築時にApplicationContextが呼び出すコールバック関数()を提供することもできます。


4

Springで初期化プロセスをインターセプトする方法はいくつかあります。すべてのBeanを初期化し、それらをautowire / injectする必要がある場合、少なくとも2つの方法で、これを確実に行うことができます。私は2つ目のテストテットしか持っていませんが、どちらも同じように機能すると思います。

@Beanを使用している場合は、次のようにinitMethodで参照できます。

@Configuration
public class BeanConfiguration {

  @Bean(initMethod="init")
  public BeanA beanA() {
    return new BeanA();
  }
}

public class BeanA {

  // method to be initialized after context is ready
  public void init() {
  }

} 

@Componentを使用している場合は、次のように@EventListenerで注釈を付けることができます。

@Component
public class BeanB {

  @EventListener
  public void onApplicationEvent(ContextRefreshedEvent event) {
  }
}

私の場合、レガシーシステムがあり、Spring Bootが選択されたフレームワークであるIoC / DIを利用しています。古いシステムでは、テーブルに多くの循環依存関係がもたらされるため、セッター依存関係を頻繁に使用する必要があります。@PostConstructを信頼できないため、セッターによる自動配線/注入がまだ行われていないため、いくつかの問題がありました。順序はコンストラクタであり、@ PostConstructは自動配線されたセッターです。最後にすべてのBeanに対して「同時に」実行される@EventListenerアノテーションを使用してそれを解決しました。この例では、InitializingBeanの実装も示しています。

2つのクラス(@Component)があり、相互に依存しています。この例では、クラスは1つだけ表示されているため、同じように見えます。

@Component
public class BeanA implements InitializingBean {
  private BeanB beanB;

  public BeanA() {
    log.debug("Created...");
  }

  @PostConstruct
  private void postConstruct() {
    log.debug("@PostConstruct");
  }

  @Autowired
  public void setBeanB(BeanB beanB) {
    log.debug("@Autowired beanB");
    this.beanB = beanB;
  }

  @Override
  public void afterPropertiesSet() throws Exception {
    log.debug("afterPropertiesSet()");
  }

  @EventListener
  public void onApplicationEvent(ContextRefreshedEvent event) {
    log.debug("@EventListener");
  } 
}

これは、コンテナの起動時の呼び出しの順序を示すログ出力です。

2018-11-30 18:29:30.504 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : Created...
2018-11-30 18:29:30.509 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : Created...
2018-11-30 18:29:30.517 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : @Autowired beanA
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : @PostConstruct
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : afterPropertiesSet()
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : @Autowired beanB
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : @PostConstruct
2018-11-30 18:29:30.518 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : afterPropertiesSet()
2018-11-30 18:29:30.607 DEBUG 3624 --- [           main] com.example.demo.BeanA                   : @EventListener
2018-11-30 18:29:30.607 DEBUG 3624 --- [           main] com.example.demo.BeanB                   : @EventListener

ご覧のとおり、@ EventListenerは、すべての準備が整って構成された後に最後に実行されます。


-2
public class InitHelloWorld implements BeanPostProcessor {

   public Object postProcessBeforeInitialization(Object bean,
             String beanName) throws BeansException {
       System.out.println("BeforeInitialization : " + beanName);
       return bean;  // you can return any other object as well
   }

   public Object postProcessAfterInitialization(Object bean,
             String beanName) throws BeansException {
       System.out.println("AfterInitialization : " + beanName);
       return bean;  // you can return any other object as well
   }

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.