关于IOC依赖注入泛型的小案例
关于IOC自动注入泛型案例
1)、首先导入maven导入Spring的jar包和相关依赖包(写框架的三步,第一步:搭建项目 第二步:导包 第三步:配置文件)
这里就不多介绍了,maven官网都能搜寻到相关的填写的xml依赖。
2)、创建好目录目录结构
这里是我的目录创建,不用在意bean包,是我之前的测试余留,不会影响本次实验

pojo包下面对应的俩个类是空的,如下 (pojo:是Java基本对象的意思 一般用来存放Javabean对象)


dao包下指代是与数据库交互的的相关操作类,也就是管理持久层的包,代码如下(值得注意的是这里的泛型)
BaseDao类:

BookDao类:

UserDao类:

BookDao和UserDao都继承的是BaseDao的,而BaseDao是一个抽象类,他们都要实现里面的抽象方法save();

service包下指的业务层一般用来实现业务操作之后调用dao层的方法进行数据的持久化保存。代码如下(注意这里的泛型)
BaseService类:

BookService类:

UserService类:

BookService和UserService他们同样也是继承与BaseService类.

我一开始就感觉这里特别奇怪,@Autowired(自动装配)注解加在一个dao的父类引用上没有问题,父类的引用接收子类的实例没有问题,
(这里的实例并不是自己new的,而是通过ioc容器建立出来的)同样也可以调用父类特有的方法,OOP中的多态机制,可是这里的
BaseService类并没有加载在容器!!而且还是一个私有属性。这里首先澄清一个基础的观点,父类的私有属性或者私有方法被子类
继承,并不是不能被继承过来,这是可以被继承过来的,只不过常规上我们对他不能进行操作而已!俩个子类都是空白不会报错,是因为看似
空白其实已经内部含有父类的所有内容。如BookService他的内部应该是这样的:

我一下就恍然大悟,确实这符合Java的语法规则.
3)、给IOC配置文件之后添加自动配置的语句

4)、编写测试方法开始测试IOC装配泛型的机制
经过第二步可以知道,这种语法规则是可以支持的,但是同样有一个疑问父类的泛型是没有被指定的,子类继承了一个指定的泛型,所以
那个私有的属性也被注定上了泛型,这个类被加载在容器,属性被自动装配了。先打住,看看结果能不能通过。
测试方法

运行结果

已经正确运行了?!而且bookService调用的是BookDao方法,userService调用的是UserDao方法!这里面发生了什么???如此精准调用
5)、泛型依赖注入原理解剖
我们先抛开其他的不管,从运行方法来看
BookService bookService = ioc.getBean(BookService.class);//获取类型为BookService
UserService userService = ioc.getBean(UserService.class);//获取类型为UserService
bookService.save();
userService.save()
bookService找的BookService类型,步骤如图

往上翻Dao三个类的结构,发现BaseDao有俩个子类加入了容器,但泛型为Book的只有BookDao,所以这里的bookService.save()对应的是BookDao
中的save()方法,带着这个想法开始测试,再Test方法里面加入
System.out.println(bookService.getClass().getGenericSuperclass());//getClass是获取当前对象类型再getGenericSuperclass是获取父类带有泛型的类型
结果如下
com.yzc.service.BaseService<com.yzc.pojo.Book>
结果就是这样,泛型也是IOC容器的一个查找标准,严格如雷老师所说spring可以使用使用带泛型的父类类型来确定这个子类的类型。 到此就完全解决了
总结心得
ioc非常的强大,但是所有的对错都是有理可循的,就像这世界万物,只要不停止学习,一切都可以证明出来。
一个茫茫人海中的普通人

浙公网安备 33010602011771号