Spring注入泛型类
大家好今天教大家使用Spring框架注入泛型类
问题描述:
在Dao层存在的BookDao与UserDao对数据库进行操作,那么就需要在BookService中使用到不同的Dao对象,Spring使如何区分相同的Dao的不同实现类的呢?
回答是Spring使用到了以泛型作为注入条件自动进行注入,代码描述如下:
bean:
package T.pojo;
public class User {
}
public class Book {
}
dao层:
package T.dao;
import T.pojo.User;
import org.springframework.stereotype.Repository;
@Repository
// 继承BaseDao并带有子类的泛型User
public class UserDao extends BaseDao<User>{
@Override
public void save() {
System.out.println("UserDao Save...");
}
}
package T.dao;
import org.springframework.stereotype.Repository;
@Repository
// 抽象方法定义接口,Spring在查找
public abstract class BaseDao<T> {
public abstract void save();
}
package T.dao;
import T.pojo.Book;
import org.springframework.stereotype.Repository;
@Repository
// 继承BaseDao并带有子类的泛型Book
public class BookDao extends BaseDao<Book>{
@Override
public void save() {
System.out.println("BookDao save ...");
}
}
package T.dao;
import org.springframework.stereotype.Repository;
@Repository
public abstract class BaseDao<T> {
public abstract void save();
}
service层:
package T.service;
import T.pojo.User;
import org.springframework.stereotype.Service;
@Service
// 继承自BaseService,同时自带了属于自己的泛型
public class UserService extends BaseService<User>{
}
package T.service;
import T.pojo.Book;
import org.springframework.stereotype.Service;
@Service
// 继承自BaseService,同时自带了属于自己的泛型
public class BookService extends BaseService<Book>{
}
package T.service;
import T.dao.BaseDao;
import org.springframework.beans.factory.annotation.Autowired;
// 没有注解!但是它是父类,子类有注解,并不影响Spring进行查找
public class BaseService<T>{
@Autowired
// 使用泛型自动注入对应的Dao类,泛型声明为User的,就注入UserDao作为子类
// 泛型声明为Book的,就注入BookDao作为子类
private BaseDao<T> baseDao;
public void save(){
System.out.println("自动注入Dao:"+baseDao);
// 这里还有多态的使用,调用子类save的方法。
baseDao.save();
}
}
测试:
package T;
import T.service.BookService;
import T.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
ApplicationContext ioc = new ClassPathXmlApplicationContext("bean6.xml");
@Test
public void test1(){
UserService userService= ioc.getBean(UserService.class);
BookService bookService = ioc.getBean(BookService.class);
userService.save();
bookService.save();
}
}
需要注意的是:在BaseService中,生成了BaseDao对象,继承自BaseService对象调用save方法时,BaseService会根据子类的泛型使用@Autowired进行注入,「private BaseDao T baseDao」,就完成了注入,然后调用方法。
「private BaseDao T baseDao」这行代码使用多态进行实现。
总结一下就是,使用继承传递泛型参数,Spring根据不同的泛型参数使用@Autowire注入对象。