通过注解和反射实例化一个对象(依赖注入)
适合对java反射有一点了解的人
我们都知道 spring 在 变量前面加上 @autowired @component 等注解就可以实例化该变量。它是怎么做到的呢? 反射加Bean工厂,spring扫描这些注解后通过注解从bean工厂里面取出已实例化的对象,然后通过反射赋值到该变量上面,达到了实例化含有改注解的变量。
今天我们来演示一下通过 反射加注解怎么实例化一个变量。
我们来模拟 简单一个 三层架构 MVC 工程。
DAL 数据访问层
BLL 业务处理层
main 就当控制层
然后我们 实例化一个对象的时候 通常是这样
通过 new 关键词 来实例化对象。
运行结果:
现在我们需要把 BLL 改造成这样 也能使我们的程序整运行:
首先看看 我们 @DAL 是怎么定义的:
因为我们要通过反射实例化一个对象, 所以在这个注解上面加入了一个Class 变量。 后面通过传入的 Class 得到 实例化对象。
下一步是 扫描注解得到 注解有 @DAL 注解的变量
下一步 通过反射 含有 DAL 实例化对象
到此 完成 了 反射实例化对象并赋值到了 含有该变量的注解上面
我们来测试一下
结果和前面通过 new 是一样的
我们再加多一个 adminDAL 看看
运行正常。
这只是个简单的列子,重要的是设计思想。
接下来我们可以 实现 一个类似 spring 的bean 容器。 只要初始化过一个的对象 都放到这个容器里面,下一次从这个 容器里面获取这个对象。
这样就可以进一步 节约开销,提升性能。