java 成神之路 (一)

时间:2020-12-19 16:39:16

通过注解和反射实例化一个对象(依赖注入)

适合对java反射有一点了解的人

我们都知道 spring 在 变量前面加上 @autowired @component 等注解就可以实例化该变量。它是怎么做到的呢? 反射加Bean工厂,spring扫描这些注解后通过注解从bean工厂里面取出已实例化的对象,然后通过反射赋值到该变量上面,达到了实例化含有改注解的变量。

今天我们来演示一下通过 反射加注解怎么实例化一个变量。

我们来模拟 简单一个 三层架构 MVC 工程。

java 成神之路 (一)

DAL 数据访问层

BLL 业务处理层

main 就当控制层

然后我们 实例化一个对象的时候 通常是这样

java 成神之路 (一)

通过 new 关键词 来实例化对象。

运行结果:

java 成神之路 (一)

现在我们需要把 BLL 改造成这样 也能使我们的程序整运行:
java 成神之路 (一)

首先看看 我们 @DAL 是怎么定义的:

java 成神之路 (一)

因为我们要通过反射实例化一个对象, 所以在这个注解上面加入了一个Class 变量。 后面通过传入的 Class 得到 实例化对象。

下一步是 扫描注解得到 注解有 @DAL 注解的变量

java 成神之路 (一)

下一步 通过反射 含有 DAL 实例化对象

java 成神之路 (一)

到此 完成 了 反射实例化对象并赋值到了 含有该变量的注解上面

我们来测试一下

java 成神之路 (一)

结果和前面通过 new 是一样的

我们再加多一个 adminDAL 看看

java 成神之路 (一)

java 成神之路 (一)

运行正常。

这只是个简单的列子,重要的是设计思想。

接下来我们可以 实现 一个类似 spring 的bean 容器。 只要初始化过一个的对象 都放到这个容器里面,下一次从这个 容器里面获取这个对象。
这样就可以进一步 节约开销,提升性能。

代码地址 https://github.com/linving/java_club.git