@PostConstruct使い方

@PostConstructとは

  • 初期化メソッド
  • オブジェクトの初期化部分
  • オブジェクト生成後、別途初期化作業を行うために実行するメソッドに宣言する。
  • PostConstructアノテーション付きのinitメソッドはWASが上がるときに実行される。

メリット

  1. コンストラクタが呼び出された時、beanはまだ初期化されないです。(挿入された依存性がない。)
    でも、@PostConstructを使うとこで、beanが初期帰化されるときの同時に依存性を確認できます。
  2. bean lifecycleで一回だけ実行されることを保証できます。(WASが上がるときにbeanが生成されるときの1回だけ初期化されるため。)なので、PostConstructアノテーションを使うことでbeanが何回も初期化されることを防ぐことができます。

適用例

自分がWebSocketの勉強をしていた時に作成したコードの一部です。

@Slf4j
@RequiredArgsConstructor
@Service
public class ChatService {

    private final ObjectMapper objectMapper;
    private Map<String, ChatRoom> chatRooms;

    @PostConstruct
    private void init() {
        chatRooms = new LinkedHashMap<>();
    }

    public List<ChatRoom> findAllRoom() {
        return new ArrayList<>(chatRooms.values());
    }

    public ChatRoom findRoomById(String roomId) {
        return chatRooms.get(roomId);
    }

    public ChatRoom createRoom(String name) {
        String randomId = UUID.randomUUID().toString();
        ChatRoom chatRoom = ChatRoom.builder()
                .roomId(randomId)
                .name(name)
                .build();
        chatRooms.put(randomId, chatRoom);
        return chatRoom;
    }

    public <T> void sendMessage(WebSocketSession session, T message) {
        try {
            session.sendMessage(new TextMessage(objectMapper.writeValueAsString(message)));
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
    }
}

終わりに

サンプルコードや資料を調べていたら、Serviceアノテーションがついているクラス内で使用している場合が多かったのですが、それについては調べないとなりませんね。。

コメントを残す