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指定使用哪个。