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

来源:互联网 发布:java jdk下载官网 编辑:程序博客网 时间:2024/06/05 16:02

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、实体

查看复制到剪贴板打印
  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

查看复制到剪贴板打印
  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写法

查看复制到剪贴板打印
  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的写法

查看复制到剪贴板打印
  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的话,以后注入的话也可以使用泛型限定式依赖注入 :

查看复制到剪贴板打印
  1. @Autowired  
  2. private Repository<User> userRepository; 
0 0
原创粉丝点击