知识点

相关文章

更多

最近更新

更多

Spring4新特性——泛型限定式依赖注入

2019-03-19 08:50|来源: 开涛

Spring 4.0已经发布RELEASE版本,不仅支持Java8,而且向下兼容到JavaSE6/JavaEE6,并移出了相关废弃类,新添加如Java8的支持、Groovy式Bean定义DSL、对核心容器进行增强、对Web框架的增强、Websocket模块的实现、测试的增强等。其中两个我一直想要的增强就是:支持泛型依赖注入、对cglib类代理不再要求必须有空参构造器了。具体更新请参考:

http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#new-in-4.0

1、相关代码:

1.1、实体

Java代码
  1. public class User implements Serializable {  

  2.    private Long id;  

  3.    private String name;  

  4. }  

  5.  

  6. public class Organization implements Serializable {  

  7.    private Long id;  

  8.    private String name;  

  9. }  

1.2、Repository

Java代码
  1. public abstract class BaseRepository<M extends Serializable> {  

  2.    public void save(M m) {  

  3.        System.out.println("=====repository save:" + m);  

  4.    }  

  5. }  

  6.  

  7. @Repository  

  8. public class UserRepository extends BaseRepository<User> {  

  9. }  

  10.  

  11. @Repository  

  12. public class OrganizationRepository extends BaseRepository<Organization> {  

  13. }  

对于Repository,我们一般是这样实现的:首先写一个模板父类,把通用的crud等代码放在BaseRepository;然后子类继承后,只需要添加额外的实现。

1.3、Service

1.3.1、以前Service写法

Java代码
  1. public abstract class BaseService<M extends Serializable> {  

  2.    private BaseRepository<M> repository;  

  3.    public void setRepository(BaseRepository<M> repository) {  

  4.        this.repository = repository;  

  5.    }  

  6.    public void save(M m) {  

  7.        repository.save(m);  

  8.    }  

  9. }  

  10. @Service  

  11. public class UserService extends BaseService<User> {  

  12.    @Autowired  

  13.    public void setUserRepository(UserRepository userRepository) {  

  14.        setRepository(userRepository);  

  15.    }  

  16. }  

  17.  

  18. @Service  

  19. public class OrganizationService extends BaseService<Organization> {  

  20.    @Autowired  

  21.    public void setOrganizationRepository(OrganizationRepository organizationRepository) {  

  22.        setRepository(organizationRepository);  

  23.    }  

  24. }  

可以看到,以前必须再写一个setter方法,然后指定注入的具体类型,然后进行注入;

1.3.2、泛型Service的写法

Java代码
  1. public abstract class BaseService<M extends Serializable> {  

  2.    @Autowired  

  3.    protected BaseRepository<M> repository;  

  4.  

  5.    public void save(M m) {  

  6.        repository.save(m);  

  7.    }  

  8. }  

  9.  

  10. @Service  

  11. public class UserService extends BaseService<User> {  

  12. }  

  13.  

  14. @Service  

  15. public class OrganizationService extends BaseService<Organization> {  

  16. }  

大家可以看到,现在的写法非常简洁。支持泛型式依赖注入。

这个也是我之前非常想要的一个功能,这样对于那些基本的CRUD式代码,可以简化更多的代码。

如果大家用过Spring data jpa的话,以后注入的话也可以使用泛型限定式依赖注入 :

Java代码
  1. @Autowired  

  2. private Repository<User> userRepository;  

对于泛型依赖注入,最好使用setter注入,这样万一子类想变,比较容易切换。比如https://github.com/zhangkaitao/es,如果有多个实现时,子类可以使用@Qualifier指定使用哪一个。


转自:http://jinnianshilongnian.iteye.com/blog/1989330


相关问答

更多