- 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>
97 lines
2.3 KiB
Java
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);
|
|
}
|
|
}
|