S SmartDocs
Series: Java java 72 lines · Updated 2026-04-09

DataInitializer.java

Java/Baasid/src/main/java/com/baasid/config/DataInitializer.java

package com.baasid.config;

import com.baasid.entity.Goods;
import com.baasid.entity.SystemUser;
import com.baasid.repository.GoodsRepository;
import com.baasid.repository.SystemUserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Profile;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

/**
 * 啟動時自動建立測試資料(僅在 {@code dev} profile 啟用)。
 * 若資料庫已有使用者資料則跳過,避免重複插入。
 */
@Component
@Profile("dev")
public class DataInitializer implements CommandLineRunner {

    private static final Logger log = LoggerFactory.getLogger(DataInitializer.class);

    private final SystemUserRepository userRepository;
    private final GoodsRepository goodsRepository;
    private final PasswordEncoder passwordEncoder;

    public DataInitializer(SystemUserRepository userRepository,
                           GoodsRepository goodsRepository,
                           PasswordEncoder passwordEncoder) {
        this.userRepository = userRepository;
        this.goodsRepository = goodsRepository;
        this.passwordEncoder = passwordEncoder;
    }

    /**
     * 應用程式啟動完成後執行:可安全假設 Repository、資料源已就緒。
     */
    @Override
    public void run(String... args) {
        if (userRepository.count() > 0) {
            log.info("資料庫已有資料,跳過初始化");
            return;
        }

        log.info("開始初始化測試資料...");

        String encodedPassword = passwordEncoder.encode("password123");

        SystemUser admin = new SystemUser("admin", encodedPassword, "管理員");
        SystemUser user01 = new SystemUser("user01", encodedPassword, "測試用戶");
        admin = userRepository.save(admin);
        user01 = userRepository.save(user01);

        createGoods("蘋果", admin);
        createGoods("香蕉", admin);
        createGoods("鍵盤", user01);

        log.info("測試資料初始化完成");
        log.info("測試帳號: admin / password123");
        log.info("測試帳號: user01 / password123");
    }

    /** 建立一筆商品並關聯建立者與最後更新者為同一使用者。 */
    private void createGoods(String name, SystemUser user) {
        Goods goods = new Goods();
        goods.setName(name);
        goods.setCrUser(user);
        goods.setUpUser(user);
        goodsRepository.save(goods);
    }
}

Related articles