说明:spring 4.x 后允许子类注入子类对应带泛型类型的成员变量的引用,说白了就是任何实现了xxService<T> 类的子类(明确了泛型类型)例如:xxService<User>,都可以被xxService<T>这个父类接受,即由spring 注入给这个父类。
举例:
User.java
package com.yaspeed.spring.beans.generic.di;
public class User {
}
泛型类 BaseRepository<T>
package com.yaspeed.spring.beans.generic.di;
public class BaseRepository<T> {
}
泛型类BaseService<T> 有个成员变量,类型为BaseRepository<T> , 任何实现了BaseRepository<T>的子类,例如BaseRepository extends BaseRepository<User> 指定了泛型类型,即子类BaseReposiotry可以放入spring容器,然后注入给BaseRepository<T>类型的变量。
package com.yaspeed.spring.beans.generic.di;
import org.springframework.beans.factory.annotation.Autowired;
public class BaseService<T> {
@Autowired
protected BaseRepository<T> repository;
public void add(){
System.out.println("BaseService add....");
System.out.println(repository);
}
}
将UserRepository 子类和UserService 子类放入spring容器中
package com.yaspeed.spring.beans.generic.di;
import org.springframework.stereotype.Repository;
@Repository
public class UserRepository extends BaseRepository<User>{
}
package com.yaspeed.spring.beans.generic.di;
import org.springframework.stereotype.Service;
@Service
public class UserService extends BaseService<User>{
}
测试方法:子类UserRepository 注入给了BaseRepository<T>类型的变量
package com.yaspeed.spring.beans.generic.di;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext cxt = new ClassPathXmlApplicationContext("beans-generic-di.xml");
UserService userService = (UserService) cxt.getBean("userService");
System.out.println(userService);
userService.add();
}
}