Spring4新特性——泛型限定式依賴注入 html
Spring4新特性——核心容器的其餘改進 git
Spring4新特性——Web開發的加強 github
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC spring
Spring4新特性——Groovy Bean定義DSL 框架
Spring4新特性——更好的Java泛型操做API socket
Spring4新特性——JSR310日期API的支持 測試
Spring4新特性——註解、腳本、任務、MVC等其餘特性改進 this
Spring 4.0已經發布RELEASE版本,不只支持Java8,並且向下兼容到JavaSE6/JavaEE6,並移出了相關廢棄類,新添加如Java8的支 持、Groovy式Bean定義DSL、對核心容器進行加強、對Web框架的加強、Websocket模塊的實現、測試的加強等。其中兩個我一直想要的增 強就是:支持泛型依賴注入、對cglib類代理再也不要求必須有空參構造器了。具體更新請參考: spa
http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#new-in-4.0 .net
一、相關代碼:
1.一、實體
Java代碼
- public class User implements Serializable {
- private Long id;
- private String name;
- }
-
- public class Organization implements Serializable {
- private Long id;
- private String name;
- }
1.二、Repository
Java代碼
- public abstract class BaseRepository<M extends Serializable> {
- public void save(M m) {
- System.out.println("=====repository save:" + m);
- }
- }
-
- @Repository
- public class UserRepository extends BaseRepository<User> {
- }
-
- @Repository
- public class OrganizationRepository extends BaseRepository<Organization> {
- }
對於Repository,咱們通常是這樣實現的:首先寫一個模板父類,把通用的crud等代碼放在BaseRepository;而後子類繼承後,只須要添加額外的實現。
1.三、Service
1.3.一、之前Service寫法
Java代碼
- public abstract class BaseService<M extends Serializable> {
- private BaseRepository<M> repository;
- public void setRepository(BaseRepository<M> repository) {
- this.repository = repository;
- }
- public void save(M m) {
- repository.save(m);
- }
- }
- @Service
- public class UserService extends BaseService<User> {
- @Autowired
- public void setUserRepository(UserRepository userRepository) {
- setRepository(userRepository);
- }
- }
-
- @Service
- public class OrganizationService extends BaseService<Organization> {
- @Autowired
- public void setOrganizationRepository(OrganizationRepository organizationRepository) {
- setRepository(organizationRepository);
- }
- }
能夠看到,之前必須再寫一個setter方法,而後指定注入的具體類型,而後進行注入;
1.3.二、泛型Service的寫法
Java代碼
- public abstract class BaseService<M extends Serializable> {
- @Autowired
- protected BaseRepository<M> repository;
-
- public void save(M m) {
- repository.save(m);
- }
- }
-
- @Service
- public class UserService extends BaseService<User> {
- }
-
- @Service
- public class OrganizationService extends BaseService<Organization> {
- }
你們能夠看到,如今的寫法很是簡潔。支持泛型式依賴注入。
這個也是我以前很是想要的一個功能,這樣對於那些基本的CRUD式代碼,能夠簡化更多的代碼。
若是你們用過Spring data jpa的話,之後注入的話也可使用泛型限定式依賴注入 :
Java代碼
- @Autowired
- private Repository<User> userRepository;
對於泛型依賴注入,最好使用setter注入,這樣萬一子類想變,比較容易切換。好比https://github.com/zhangkaitao/es,若是有多個實現時,子類可使用@Qualifier指定使用哪個。