| この記事の要点 |
|
方法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 / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38