知识点
相关文章
更多最近更新
更多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、实体
public class User implements Serializable {
private Long id;
private String name;
}
public class Organization implements Serializable {
private Long id;
private String name;
}
1.2、Repository
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.3、Service
1.3.1、以前Service写法
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.2、泛型Service的写法
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的话,以后注入的话也可以使用泛型限定式依赖注入 :
@Autowired
private Repository<User> userRepository;
对于泛型依赖注入,最好使用setter注入,这样万一子类想变,比较容易切换。比如https://github.com/zhangkaitao/es,如果有多个实现时,子类可以使用@Qualifier指定使用哪一个。
转自:http://jinnianshilongnian.iteye.com/blog/1989330
相关问答
更多-
国内正儿八经的Spring4学习视频_谁与争锋_有且只有尚硅谷[2022-03-14]
谢谢楼主,共同发展 -
国内正儿八经的Spring4学习视频_谁与争锋_有且只有尚硅谷[2023-12-15]
谢谢楼主,共同发展 查看更多答案>> -
myeclipse怎么添加spring4 支持啊?[2022-03-01]
在网上搜了很多关于4.x的头文件的配置可是没有一个说的,没办法后来想到了spring-framework-reference.doc 解压打开运行beans.xml里面就有现成的,直接copy过来就可以了; 注意里面有很多不好分辨的,所以你需要下载的是类似下面的:spring-framework-4.0.0.RELEASE-dist.zip 在下载的同时,最好将该版本以.doc结尾的也下下来,因为这个是spring的开发文档 -
国内正儿八经的Spring4学习视频_谁与争锋_有且只有尚硅谷[2022-09-12]
谢谢楼主,共同发展 查看更多答案>> -
spring实现控制反转与依赖注入[2023-05-29]
互相埋藏对象来实现的 -
经过3天的搜索后发现了这个问题! Spring 3将在ClassName上自动装配bean,Spring 4在full.package.name.ClassName上执行此操作。 在我打电话的控制器中 import a.b.c.Languages; import a.b.c.LanguagesTableDto; @Autowired @Qualifier("languagesDtoMapper") private DtoMapper
p ... -
Spring 4不会自动限定自动布线上的泛型类型(Spring 4 not automatically qualifying generic types on autowire)[2024-02-20]
我假设Spring将@Async方法的类转换为其他类,并且此过程去除了类型信息,这意味着它不能将bean分开。 是。 这正是发生的情况。 Spring 4支持通过完整的通用签名注入bean。 给定注射目标 @Autowired private DomainRepositoryrepository; 和一个ProjectRepositoryImpl类型的bean,Spring将正确地解析并注入该字段(或方法参数或构造函数参数)。 然而 ,在你的代码中,你实际上并没有一个类型为Projec ... -
你能否将记录器界面更改为: interface ILogger
where T : BaseClass Could you change the logger interface to be : interface ILogger where T : BaseClass -
并非所有通用信息都在运行时丢失: import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; public class Main { public static List
list; public static void main(String[] args) throws ... -
如果有的话,附加有错误的堆栈跟踪。 在所有使用属性访问器的一致情况之前: abstract class BaseBO
> implements BO { DAOClass dao; public DAOClass getDao() { return dao; } //... } 很可能你需要一个BaseBO.dao属性的set ...