Files
timi-inject/src/main/java/com/imyeyu/inject/BeanContext.java
Timi f5c6dcd275 refactor: optimize string concatenation and add startup statistics
- Replace string concatenation with .formatted() method for better readability
- Add StartupStatistics class to track initialization metrics
- Add detailed startup logging with timing information
  - Scan time
  - IOC time
  - Injection time
  - PostConstruct time
  - Total startup time
- Add banner output support (banner.txt or defBanner.txt)
- Add @Lazy annotation support for lazy initialization

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-13 01:41:49 +08:00

97 lines
2.3 KiB
Java

package com.imyeyu.inject;
import com.imyeyu.inject.annotation.ScopeType;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* Bean 容器上下文
*
* @author 夜雨
* @since 2026-01-12 23:37
*/
public class BeanContext {
private final Map<String, Object> singletons = new ConcurrentHashMap<>();
private final Map<String, BeanDefinition> definitions = new ConcurrentHashMap<>();
private final Map<Class<?>, List<String>> typeIndex = new ConcurrentHashMap<>();
/**
* 注册 Bean 定义
*/
public void registerDefinition(BeanDefinition definition) {
String name = definition.getName();
if (definitions.containsKey(name)) {
throw new InjectException("Bean [%s] already registered".formatted(name));
}
definitions.put(name, definition);
typeIndex.computeIfAbsent(definition.getType(), k -> new ArrayList<>()).add(name);
}
/**
* 注册单例 Bean 实例
*/
public void registerSingleton(String name, Object bean) {
if (bean == null) {
throw new InjectException("Bean [%s] cannot be null".formatted(name));
}
singletons.put(name, bean);
if (!definitions.containsKey(name)) {
BeanDefinition definition = BeanDefinition.builder().name(name).type(bean.getClass()).scope(ScopeType.SINGLETON).build();
definitions.put(name, definition);
typeIndex.computeIfAbsent(bean.getClass(), k -> new ArrayList<>()).add(name);
}
}
/**
* 获取 Bean 定义
*/
public BeanDefinition getDefinition(String name) {
return definitions.get(name);
}
/**
* 获取单例 Bean
*/
public Object getSingleton(String name) {
return singletons.get(name);
}
/**
* 设置单例 Bean
*/
public void setSingleton(String name, Object bean) {
singletons.put(name, bean);
}
/**
* 根据类型查找 Bean 名称列表
*/
public List<String> getBeanNamesByType(Class<?> type) {
List<String> names = new ArrayList<>();
for (Map.Entry<Class<?>, List<String>> entry : typeIndex.entrySet()) {
if (type.isAssignableFrom(entry.getKey())) {
names.addAll(entry.getValue());
}
}
return names;
}
/**
* 获取所有 Bean 定义
*/
public Collection<BeanDefinition> getAllDefinitions() {
return definitions.values();
}
/**
* 检查是否包含指定名称的 Bean
*/
public boolean containsBean(String name) {
return definitions.containsKey(name);
}
}