1.泛型注入
今天在学习spring的时候遇到了不少问题,很绕
先来阐述一下自己的问题:
什么是泛型,泛型注入有什么用,service层是什么,repository层又是什么,spring各个层具体是做什么的,泛型类到底是不是个类等等,有很多疑问,我相信这些问题在以后肯定会迎刃而解,或者说"恍然大悟"
2.泛型类
写好一个泛型以后,使用的时候传入泛型类的类就可以使用了,但是这里只能传引用类,不能使用基本类型
不能对确切的泛型类型使用instanceof操作,比如
String.
class
instanceof
Class<String>这种属于非法操作,正确的是:
String.
class
instanceof
Class<?>,?表示一个具体实参,代表所有的泛型类
这里的Class<?>叫做泛型的通配符,"?"是一个实参,而不是形参,"?"表示的是所有实参的真实父类
3.泛型方法
/**
* 泛型方法的基本介绍
* @param tClass 传入的泛型实参
* @return T 返回值为T类型
* 说明:
* 1)public 与 返回值中间<T>非常重要,可以理解为声明此方法为泛型方法。
* 2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
* 3)<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
* 4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
*/public <T> T genericMethod(Class<T> tClass)throws InstantiationException ,
IllegalAccessException{
T instance = tClass.newInstance();
return instance;
}
返回类型是泛型,也就是说,只有返回类型是<T>的时候,才能被称之为泛型方法,这个时候表示,我返回一个由外部指定的对象,是什么对象,你来定
4.泛型依赖注入疑问
本来是看视频的时候讲这个依赖注入,完全看不懂,有几个原因:
spring注解,其用@repository装配了实现类,又用@Autowired装配了一个在userService的全局变量,是这个userRepository的接口类Repository,到底注入的是哪一个呢?spring的@service和@repository,等等这些注入方式,到底是如何注入的,需要查看完整的spring注解注入文档,今天来看吧
5.泛型在spring的DAO层的应用
在实际业务中,一个实体类bean肯定是要对应一个持久化bean,持久化bean负责对数据库进行数据源的存取,然后bean会接受和传输对外层面的数据
这里会出现问题:
每一个实体bean,你都需要创建与之对应的持久层bean,如果使用泛型,多个实体bean,对应同一个泛型的持久化bean,那么这样肯定是可以简化代码的
这里循序渐进的给了一个解决办法:
写了一个持久化bean的父类,BaseRepository,继承这个父类,那么这个时候,每一个具体的持久化bean,就不需要在写之前的那个打印方法,而是直接super.就可以了
比如,持久化层对数据库进行crud的时候,都是一样的,把公共方法写在父类里,这样就部分性的减少了大量的print代码,全部放在持久化父类就可以了
3.重点解释泛型,在刚才的例子中的应用:
把刚才在持久层创建的BaseRepository改写成泛型的方 ss BaseRepository<T> {
public T getBean(String beanName) {
}
public void printString(T t) {
System.out.println(t);
}
}
这里的:
public void printString(T t) {
System.out.println(t);
}
替代了刚才所说的super父类的方法的那一步,而:
public T getBean(String beanName) {
}
这一步,就完全不再需要去创建实体bean对应的持久化bean了,如果某个实体类bean,需要实现某些比较特殊的方法,那就extends,然后加一些自己的方法
上面这一段表示,连子类都不需要再创建,直接用泛型方法,传什么bean进去,就得到这个beanRepository
5.泛型依赖注入
泛型的依赖注入,其实跟普通的bean没有啥区别...都是一样的依赖注入...只不过实现泛型的类,其天然带有泛型父类的关系,我也不知道讲这个有啥用....