Java实现Autowired自动注入
首发于Enaium的个人博客
继续使用上个文章的类容器
创建一个注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Autowired {
}
遍历所有字段包括私有的
private void autowired() {
for (Map.Entry<Class<?>, Object> classObjectEntry : classes.entrySet()) {
for (Field declaredField : classObjectEntry.getKey().getDeclaredFields()) {
declaredField.setAccessible(true);
if (classes.get(declaredField.getType()) != null) {//容器内是否有这个类的对象
try {
//赋值
declaredField.set(classObjectEntry.getValue(), classes.get(declaredField.getType()));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
在加入到容器后就调用autowired
public ClassContainer() {
List<Class<?>> scanClasses = new ArrayList<>(List.of(Test1.class, Test2.class));//注意这里Test2也被加入到了容器里
scanClasses.forEach(it -> {
try {
classes.put(it, it.getConstructor().newInstance());
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}
});
autowired();
}
public <T> T create(Class<T> klass, Object instance) {
classes.put(klass, instance);
autowired();
return (T) classes.get(klass);
}
创建Test3
public class Test3 {
public void render() {
System.out.println("Test3");
}
}
Test1使用Autowired
public class Test1 {
@Autowired
private Test2 test2;
@Autowired
private Test3 test3;
public void render() {
test2.render();
test3.render();
}
}
测试一下
public class Main {
private static final ClassContainer classContainer = new ClassContainer();
public static void main(String[] args) {
classContainer.create(Test1.class).render();
}
}
Test2正常 Test3空指针 因为不在容器里
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架