| この記事の要点 |
|
方法1: ApplicationContext から取得
もっとも単純な方法。ApplicationContext を注入して任意の Bean を取り出す:
@RestController
public class BeanDumpController {
@Autowired
private ApplicationContext ctx;
@GetMapping("/debug/beans")
public Map<String, Object> all() {
// 登録されている全 Bean 名
String[] names = ctx.getBeanDefinitionNames();
Arrays.sort(names);
Map<String, Object> result = new LinkedHashMap<>();
for (String name : names) {
Object bean = ctx.getBean(name);
result.put(name, bean.getClass().getName());
}
return result;
}
@GetMapping("/debug/bean/{name}")
public Object byName(@PathVariable String name) {
Object bean = ctx.getBean(name);
return bean.toString(); // Lombok @ToString 推奨
}
}
方法2: 型で取得 (getBeansOfType)
// 特定インターフェースの実装を全部取得
Map<String, UserRepository> repos = ctx.getBeansOfType(UserRepository.class);
repos.forEach((name, bean) -> {
System.out.println(name + " = " + bean);
});
// 親クラスからの継承も含めて
String[] names = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
ctx, DataSource.class);
// アノテーション付き Bean
Map<String, Object> beans = ctx.getBeansWithAnnotation(Service.class);
方法3: Spring Boot Actuator の /beans
本番環境でも安全に Bean 一覧を見られる方法。spring-boot-starter-actuator を依存に追加:
<!-- pom.xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency># application.properties
management.endpoints.web.exposure.include=beans,health,env,mappings
management.endpoint.beans.enabled=true
# セキュリティ: 内部 IP のみ許可することを忘れず
management.server.port=9000# curl で叩く
curl http://localhost:8080/actuator/beans | jq
# 出力例
{
"contexts": {
"application": {
"beans": {
"userService": {
"aliases": [],
"scope": "singleton",
"type": "com.example.UserServiceImpl",
"resource": "...",
"dependencies": ["userRepository", "passwordEncoder"]
}
}
}
}
}
方法4: @PostConstruct でフィールドをログ出力
起動直後に Bean の状態をログに出すパターン。設定値の確認に便利:
@Service
@Slf4j
public class MailService {
@Value("${spring.mail.host}")
private String host;
@Value("${spring.mail.port}")
private int port;
@Value("${spring.mail.username}")
private String username;
@PostConstruct
public void init() {
log.info("MailService 設定: host={}, port={}, user={}",
host, port, username);
// パスワードはログに出さない!
}
}
方法5: Jackson で JSON 化
Lombok の @ToString で出ない循環参照を避けつつフィールドを見たい場合:
@Autowired
private ObjectMapper objectMapper;
@GetMapping("/debug/bean-json/{name}")
public String dump(@PathVariable String name) throws Exception {
Object bean = ctx.getBean(name);
return objectMapper.writerWithDefaultPrettyPrinter()
.writeValueAsString(bean);
}
// 循環参照が出る場合
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
方法6: IDE デバッガ(最強)
IntelliJ IDEA / Eclipse / VS Code でブレークポイントを設定し、変数ウィンドウで Bean をインスペクト。プロキシ越しの場合は:
- IntelliJ: Evaluate Expression で
AopUtils.getTargetClass(bean)や((Advised) bean).getTargetSource().getTarget()を実行 - Lazy Loading: 遅延初期化 Bean は最初のアクセスまで未生成 →
ctx.getBean()でトリガー - CGLIB プロキシ: フィールドはターゲット側にある → 「View as: TargetSource」
方法7: DevTools の Live Reload
開発中なら spring-boot-devtools を入れると、コード変更で自動再起動 + Bean 一覧を VS Code Spring Boot Dashboard で可視化:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
方法比較
| 方法 | 本番可 | 動的 | 手間 |
|---|---|---|---|
| ApplicationContext#getBean | △ デバッグ用 endpoint で隠す | ○ | 中 |
| Actuator /beans | ◯ セキュリティ設定すれば | ○ | 低 |
| @PostConstruct ログ | ◯ | ×(起動時のみ) | 低 |
| Jackson JSON 化 | △ | ○ | 中 |
| IDE デバッガ | ×(リモートデバッグなら可) | ○ | 低 |
| DevTools Dashboard | × | ○ | 低 |
注意: 機密フィールドはマスクする
// パスワード / APIキー / トークンは Jackson で除外
public class DataSourceConfig {
private String url;
private String username;
@JsonIgnore // ← JSON 出力時に除外
private String password;
}
// Lombok @ToString でも除外
@ToString(exclude = "password")
public class User {
private String name;
private String password;
}
FAQ
Q: NoSuchBeanDefinitionException が出る
A: Bean 名のタイポ、もしくは @Component / @Service 付け忘れ。@ComponentScan のパッケージ範囲も確認。
Q: Actuator は本番で開けて大丈夫?
A: Spring Security でアクセス制限を必ずかけてください。management.server.port を別ポートにして内部 LAN のみ許可が定番。
Q: 循環依存で Bean 生成が失敗する
A: setter 注入 / @Lazy で回避。設計を見直すのが本筋。
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09