7.泛型的依赖注入
示例:
1.bean层:
1.1
public class Book {}-------->模拟的两个实体类中没有具体属性
1.2
public class User {}
2.service层
2.1Book的service类:
@Service---------------->加入了service标签
public class BookService extends BaseService<Book>{
}
2.2User的service类:
@Service---------------->加入了service标签
public class UserService extends BaseService<User>{-------------->两个均没有自己的独有方法,因为集成了BaseService类
}
2.3BaseService
public class BaseService<T> {---------->注意1:该类没有注解 注意2:该类有泛型
@Autowired----------------------->自动注入的注解
private BaseDao<T> baseDao;
public void service(){
baseDao.save();
}
}
3.dao层
3.1抽象出基本的dao层方法
public abstract class BaseDao<T> {--------->注意1:该类没有注解 注意2:该类有泛型
public abstract void save();----------->定义了抽象方法:供其他类重写
}
3.2book的dao层方法
@Repository----------------------------->加入标签,将组件加载到容器中
public class BookDao extends BaseDao<Book>{----------->加入book的泛型
public void save() {------------------------------>重写父类方法
System.out.println("book的保存方法!");
}
}
3.3user的dao层方法
@Repository----------------------------->加入标签,将组件加载到容器中
public class UserDao extends BaseDao<User>{----------->加入user的泛型
public void save() {------------------------------>重写父类方法
System.out.println("用户的保存方法!");
}
}
3.测试代码:使用的是springtest的测试
@ContextConfiguration(locations = "classpath:ioc.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class Test {
@Autowired
BookService bookService;
@Autowired
UserService userService;
@org.junit.Test
public void test(){
bookService.service();--->输出:book的保存方法!
userService.service();--->输出:用户的保存方法!
}
}
结论:
1.service层的继承研究
父类service:
public class BaseService<T> {----->类上并没有注解,即这个父类不会被加载到容器中
@Autowired--------------->但是带有@Autowired标签,按照之前的结论:当一个类有@Autowired自动注入时,这个类必须是容器中的组件:
----->不然:1.无法从容器中获取该组件 2.无法自动注入
private BaseDao<T> baseDao;
public void service(){
System.out.println("自动注入dao:"+baseDao+" 当前对象:"+this);
baseDao.save();
}
}
子类service:
@Service------------>有标签,所以子类在容器中,并且继承BaseService类,继承父类的所有属性和方法(虽然父类的属性是私有属性,按照常规无法继承,
------------>实质是可以继承,只是无法使用)
public class BookService extends BaseService<Book>{
}
则真实子类为:
@Service
public class BookService extends BaseService<Book>{
@Autowired
private BaseDao<T> baseDao;
public void service(){
System.out.println("自动注入dao:"+baseDao+" 当前对象:"+this);
baseDao.save();
}
}
这时:@Autowired标签的类在组件中,可以自动装配