定义父类时,使用泛型指定某种类型,并在父类中使用依赖注入,在子类继承父类后,在子类中指定具体的泛型的具体类型,并且子类会继承父类的依赖注入。如果父类依赖注入的是某个接口或父类,那么在子类继承父类的依赖注入后,会自动注入接口的实现类或父类的继承子类;如果父类依赖注入的是某个独立的类,那么子类继承父类的依赖注入后,也会注入这个独立类。下面示例演示
1、创建两个父类BaseDao和BaseService,两个父类中使用泛型,并在BaseService中依赖注入BaseDao。
BaseDao类:
package com.lzj.spring.generic;
/*使用泛型*/
public class BaseDao<T> {
public void select(T variable){
System.out.println("select:" + variable);
}
}
BaseService类:
package com.lzj.spring.generic;
import org.springframework.beans.factory.annotation.Autowired;
/*使用泛型*/
public class BaseService<T> {
/*指定依赖注入,供子类来继承*/
@Autowired
private BaseDao<T> dao;
public void update(T entity){
System.out.println("update:" + entity);
dao.select(entity);
}
}
2、创建UserDao和UserService两个子类分别实现BaseDao和BaseService父类。
UserDao类:
package com.lzj.spring.generic;
import org.springframework.stereotype.Repository;
/*在子类中指定泛型的具体类型,并把该类的bean注入到IOC容器中*/
@Repository
public class UserDao extends BaseDao<User> {
}
UserService类:
package com.lzj.spring.generic;
import org.springframework.stereotype.Service;
/*在子类中指定泛型的具体类型,并把该类的bean注入到IOC容器中*/
@Service
public class UserService extends BaseService<User> {
}
UserService 类继承了BaseService类,同时也把BaseService中的依赖注入关系继承过来了。@Autowired private BaseDao<T> dao;
在BaseService实例中获取的dao是注入的BaseDao的子类的bean。
User类:
package com.lzj.spring.generic;
public class User {
}
3、在配置文件bean.xml中配置扫描范围:
<context:component-scan base-package="com.lzj.spring.generic"></context:component-scan>
4、创建测试类:
package com.lzj.spring.generic;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
UserService userService = (UserService) ctx.getBean("userService");
userService.update(new User());
}
}
输出结果:
update:com.lzj.spring.generic.User@1a8a8f7c
select:com.lzj.spring.generic.User@1a8a8f7c
从输出结果可以看出,在IOC容器中有UserService和UserDao两个子类对应的bean,UserDao的bean注入到了UserService的bean中,因此UserService在继承父类BaseDao时,同时用把依赖注入关系继承过来了。