public class BaseDao<T> { public void save(T entity){ System.out.println("Save:" + entity); } }
3 两个实现类UserDao 和 RoleDao
1 2 3 4 5 6 7
@Repository public class RoleDao extends BaseDao<Role>{ }
@Repository public class UserDao extends BaseDao<User>{ }
4 baseService
1 2 3 4 5 6 7 8 9
public class BaseService<T> { @Autowired private BaseDao<T> dao;//这里会自动根据实际类型传入User或Role public void addNew(T entity){ System.out.println("addNew by " + dao); dao.save(entity); } }
5 UserService 和RoleService
1 2 3 4 5 6 7 8
@Service public class RoleService extends BaseService<Role>{ }
//若注解没有指定 bean 的 id, 则类名第一个字母小写即为 bean 的 id @Service public class UserService extends BaseService<User>{ }
for (String candidate : candidateNames) { if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, descriptor)) { addCandidateEntry(result, candidate, descriptor, requiredType); } }
其中函数 isAutowireCandidate 往里面找
1 2 3 4 5 6 7
publicbooleanisAutowireCandidate(BeanDefinitionHolder bdHolder, DependencyDescriptor descriptor){ if (!super.isAutowireCandidate(bdHolder, descriptor)) { // If explicitly false, do not proceed with any other checks... returnfalse; } return checkGenericTypeMatch(bdHolder, descriptor); }
看到这里有范型检查相关的内容,再往深入找,会看到这段代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
if (checkGenerics) { // Recursively check each generic ResolvableType[] ourGenerics = getGenerics(); ResolvableType[] typeGenerics = other.as(ourResolved).getGenerics(); if (ourGenerics.length != typeGenerics.length) { returnfalse; } if (matchedBefore == null) { matchedBefore = new IdentityHashMap<>(1); } matchedBefore.put(this.type, other.type); for (int i = 0; i < ourGenerics.length; i++) { if (!ourGenerics[i].isAssignableFrom(typeGenerics[i], matchedBefore)) { returnfalse; } } }
所以 spring 其实是利用反射机制,获取类型的范型的,然后做了比较返回了合适的 bean 进行注入的。