spring泛型注入

泛型依赖注入
Spring 4.0版本中更新了很多新功能,其中比较重要的一个就是对带泛型的Bean进行依赖注入的支持。
泛型依赖注入允许我们在使用spring进行依赖注入的同时,利用泛型的优点对代码进行精简,同时在不增加代码的情况下增加代码的复用性。
Spring默认按照字段的类进行依赖注入,而Spring4的新特性就是把泛型的具体类型也作为类的一种分类方法(Qualifier)。

背景
假设有两个实体类Student和Teacher

@Data
public class Student implements IEntity{
private long id;
}

@Data
public class Teacher implements IEntity{
private long id;
}
实体的存储,是通过仓储操作的,一般所有的实体仓储方法都是一致的,只有具体的实体类型不一样,定义仓储接口

public interface IRepository{
void add(TEntity entity);
List findAll();

}
定义仓储实现的基类,在本例中,使用List存储

public abstract class BaseRepository implements IRepository{
List datasource = new ArrayList<>();
@Override
public void add(TEntity entity){
this.datasource.add(entity);
}

@Override
public List<TEntity> findAll(){
    return datasource;
}

}
泛型依赖注入的Bean
BaseRepository 是一个抽象类,不适宜注入到spring中,定义一个可以注入的bean

@Repository()
@Scope(“prototype”)
public class DefaultRepository extends BaseRepository{
}
注意@Scope(“prototype”)注解,表示DefaultRepository的bean的作用是瞬态的,每次获取bean时都会创建一个新的bean,如果不添加作用域,默认spring的bean是单例的,这样注入的仓储实例会是同一个实例。
在test中依赖注入@Autowired IRepository studentRepository; 和@Autowired IRepository teacherRepository;,
验证这两个仓储的类型都是DefaultRepository类型,同时验证操作student不会影响到teacher。

@ExtendWith(SpringExtension.class)
@ContextConfiguration(
classes = {DemoTests.DemoTestsConfiguration.class})
public class DemoTests {

@Autowired
IRepository<Student> studentRepository;

@Autowired
IRepository<Teacher> teacherRepository;

@Test
public void test(){

    assertThat(studentIRepository.getClass())
            .isEqualTo(DefaultRepository.class);
    assertThat(teacherIRepository.getClass())
            .isEqualTo(DefaultRepository.class);

    studentIRepository.add(new Student());

    assertThat(studentIRepository.findAll())
            .hasSize(1);

    assertThat(teacherIRepository.findAll())
            .hasSize(0);
}



@ComponentScan({
        "org.example"
})
@Configuration
public static class DemoTestsConfiguration {
}

}

仓储扩展
在上一部分,所有的仓储操作,都定义在了BaseRepository中,如果遇到了仓储中未提供的方法,则需要对单个实体的仓储进行扩展。
自定义仓储接口,继承自IRepository

public interface IStudentRepository extends IRepository{
Student findById(long id);
}
实现自定义仓储接口

@Repository
public class StudentRepository extends BaseRepository implements IStudentRepository {
@Override
public Student findById(long id) {
return null;
}
}
使用例子如下

@ExtendWith(SpringExtension.class)
@ContextConfiguration(
classes = {DemoTests.DemoTestsConfiguration.class})
public class DemoTests {

@Autowired
IRepository<Teacher> teacherRepository;

@Autowired
IStudentRepository studentRepository;

@Test
public void repositoryType(){

    assertThat(studentRepository.getClass())
            .isEqualTo(StudentRepository.class);
    assertThat(teacherRepository.getClass())
            .isEqualTo(DefaultRepository.class);
}



@ComponentScan({
        "org.example"
})
@Configuration
public static class DemoTestsConfiguration {
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值