回答:
実際には違いはないと思いますが、動作には優先順位があります。@PostConstruct、init-methodBeanPostProcessorsです。
@PostConstructJSR-250アノテーションinit-methodですが、Springは初期化メソッドを持っています。@PostConstructメソッドがある場合、これは最初に呼び出されてから、初期化メソッドが呼び出されます。afterPropertiesSet、まず@PostConstructそれから、と呼ばれafterPropertiesSet、その後init-method。詳細については、Springのリファレンスドキュメントを確認してください。
JSR 250仕様以前は、xmlでのinit-methodの使用が、Spring固有のクラス/注釈からJavaクラス(Bean)を分離するため、推奨されていました。SpringインフラストラクチャBeanに依存する必要のないライブラリを構築する場合次に、initメソッドの使用が推奨されました。作成中、uは初期化メソッドとして呼び出す必要のあるメソッドを指定できます。
現在、Java EEにJSR 250仕様が導入され、これらのアノテーションがSpringでサポートされるようになったため、Springフレームワークへの依存がある程度軽減されました。
しかし、これらを追加するとコードが読みやすくなることを認めざるを得ないため、両方のアプローチに長所と短所があります。
@postconstructは春の一部ではありません。これは、javaxパッケージの一部です。どちらも同じです。init-methodを使用して、xmlファイルに追加する必要があります。@ postconstructを使用する場合、xmlに追加する必要はありません。以下の記事をご覧ください。
下のBean作成ライフサイクルコールバックの図を見るとわかるように。
この3つのステップは、Bean作成ライフサイクルコールバックで発生します。
@PostConstruct呼ばれることが言及されています。InitializingBeanが実装されている場合は、afterPropertiesSet()呼び出されます。init-methodまたはが含まれている場合@Bean(initmethod="..")は、initメソッドを呼び出します。この図は、Pro Spring 5:Spring Frameworkとそのツールの詳細ガイドからのものです
とはBeanの初期化(メソッド)のフェーズで処理されるため 、との間に違いがある可能性があります。一方、メソッドはフェーズの完了後に(この場合は、フェーズの開始前に)呼び出されます。編集:したがって、シーケンスは次のとおりです:1)フェーズ、2)メソッドが呼び出されます、3)フェーズ、メソッドを呼び出します@PostConstructinit-method@PostConstructpostProcessAfterInitializationAbstractAutowireCapableBeanFactory.initializeBean()CommonAnnotationBeanPostProcessorinitpostProcessBeforeInitializationpostProcessAfterInitialization
postProcessBeforeInitializationinitpostProcessAfterInitialization@PostConstruct
(補足として、受け入れられた回答からの声明
@ PostConstruct、init-methodはBeanPostProcessorsです
は正しくありません:@PostConstructはによって処理されBeanPostProcessor、initメソッドは正しくありません。)
後に実行されるように()で構成されている一部の(潜在的にカスタム)がそのメソッドで何か深刻なことをしている場合は、違いがありBeanPostProcessorます。
そこnoですデフォルトのSpring構成を持つ任意の違いすべてのため、後に実行されるように構成されているが、中に何もしない方法は。Ordered.getOrder()CommonAnnotationBeanPostProcessorpostProcessBeforeInitializationBeanPostProcessorsBeanPostProcessorsCommonAnnotationBeanPostProcessorpostProcessBeforeInitialization
結論として、受け入れられた回答などは正しいです... 99%のケースで、この投稿は「悪魔は詳細にある」というコンセプトに敬意を表するためのものです
ここに完全なコード:https : //github.com/wkaczurba/so8519187(spring-boot)
注釈の使用:
@Slf4j
@Component
public class MyComponent implements InitializingBean {
@Value("${mycomponent.value:Magic}")
public String value;
public MyComponent() {
log.info("MyComponent in constructor: [{}]", value); // (0) displays: Null
}
@PostConstruct
public void postConstruct() {
log.info("MyComponent in postConstruct: [{}]", value); // (1) displays: Magic
}
@Override // init-method; overrides InitializingBean.afterPropertiesSet()
public void afterPropertiesSet() {
log.info("MyComponent in afterPropertiesSet: [{}]", value); // (2) displays: Magic
}
@PreDestroy
public void preDestroy() {
log.info("MyComponent in preDestroy: [{}]", value); // (3) displays: Magic
}
}
取得:
org.springframework.contextを更新しています...
コンストラクタでMyComponentの:[ヌル]
MyComponentのpostConstruct中:[マジック]
MyComponentのafterPropertiesSet中:[マジック]
...
起動時にJMX露光用の豆を登録
0.561秒(JVMが1.011のために実行されている)で開始DemoApplication
閉会org.springframework.context ..シャットダウン時のJMX公開Beanの登録解除
...
preDestroyのMyComponent:[Magic]