Spring4新特性:泛型限定式依赖注入
来源:互联网 发布:linux sigpipe 编辑:程序博客网 时间:2024/06/05 22:43
http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#new-in-4.0
1、相关代码:
1.1、Entity
- public class User implements Serializable {
- private Long id;
- private String name;
- }
- public class Organization implements Serializable {
- private Long id;
- private String name;
- }
- 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> {
- }
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);
- }
- }
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;
1.4 Map依赖注入:
- @Autowired
- private Map<String, BaseService> map;
这样会注入:key是bean名字;value就是所有实现了BaseService的Bean,假设使用上一篇的例子,则会得到:
{organizationService=com.sishuok.spring4.service.OrganizationService@617029,userService=com.sishuok.spring4.service.UserService@10ac73b}
1.5 List/数组注入:
- @Autowired
- private List<BaseService> list;
- @Order(value = 1)
- @Service
- public class UserService extends BaseService<User> {
- }
1.6 @Lazy可以延迟依赖注入:
- @Lazy
- @Service
- public class UserService extends BaseService<User> {
- }
- @Lazy
- @Autowired
- private UserService userService;
1.7 @Conditional
@Conditional类似于@Profile(一般用于如我们有开发环境、测试环境、正式机环境,为了方便切换不同的环境可以使用
@Profile指定各个环境的配置,然后通过某个配置来开启某一个环境,方便切换)
,但是@Conditional的优点是允许自己定义规则。可以指定在如@Component、@Bean、@Configuration等注解的类上,以绝对Bean是否创建等。首先来看看使用@Profile的用例,假设我们有个用户模块:
1、在测试/开发期间调用本机的模拟接口方便开发;
2、在部署到正式机时换成调用远程接口;
- public abstract class UserService extends BaseService<User> {
- }
- @Profile("local")
- @Service
- public class LocalUserService extends UserService {
- }
- @Profile("remote")
- @Service
- public class RemoteUserService extends UserService {
- }
- @ActiveProfiles("remote")
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(locations = "classpath:spring-config.xml")
- public class ServiceTest {
- @Autowired
- private UserService userService;
- }
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.TYPE, ElementType.METHOD})
- @Conditional(CustomCondition.class)
- public @interface Local {
- }
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.TYPE, ElementType.METHOD})
- @Conditional(CustomCondition.class)
- public @interface Remote {
- }
- public class CustomCondition implements Condition {
- @Override
- public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
- boolean isLocalBean = metadata.isAnnotated("com.sishuok.spring4.annotation.Local");
- boolean isRemoteBean = metadata.isAnnotated("com.sishuok.spring4.annotation.Remote");
- //如果bean没有注解@Local或@Remote,返回true,表示创建Bean
- if(!isLocalBean && !isRemoteBean) {
- return true;
- }
- boolean isLocalProfile = context.getEnvironment().acceptsProfiles("local");
- //如果profile=local 且 bean注解了@Local,则返回true 表示创建bean;
- if(isLocalProfile) {
- return isLocalBean;
- }
- //否则默认返回注解了@Remote或没有注解@Remote的Bean
- return isRemoteBean;
- }
- }
然后我们使用这两个注解分别注解我们的Service:
- @Local
- @Service
- public class LocalUserService extends UserService {
- }
- @Remote
- @Service
- public class RemoteUserService extends UserService {
- }
首先在@Local和@Remote注解上使用@Conditional(CustomCondition.class)指定条件,然后使用@Local和@Remote注解我们的Service,这样当加载Service时,会先执行条件然后判断是否加载为Bean。@Profile就是这样实现的,其Condition是:org.springframework.context.annotation.ProfileCondition。可以去看下源码,很简单。
- Spring4新特性:泛型限定式依赖注入
- Spring4新特性:泛型限定式依赖注入
- Spring4新特性:泛型限定式依赖注入
- Spring4新特性:泛型限定式依赖注入
- Spring4新特性——泛型限定式依赖注入
- Spring4新特性——泛型限定式依赖注入
- Spring4新特性——泛型限定式依赖注入
- Spring4新特性——泛型限定式依赖注入
- Spring4新特性——泛型限定式依赖注入
- Spring4.0新特性--泛型依赖注入
- Spring4.0之后的新特性--泛型依赖注入
- Spring-13:泛型依赖注入(Spring4.X新特性)
- Spring之泛型依赖注入---spring4.0的新特性
- Spring4学习笔记-泛型依赖注入
- 浅谈spring4泛型依赖注入
- spring4.0之泛型依赖注入
- Spring -- 4.0新特性 -- 泛型依赖注入
- Spring 4.x 新特性:泛型依赖注入
- [Fix Bug]Spring 通配符的匹配很全面, 但无法找到元素
- 欢迎使用CSDN-markdown编辑器
- Linux地址映射的全过程(Linux内核源代码情景分析读书笔记连载#)
- 里氏七大原则
- MQSeriesQueueManager 队列管理器:
- Spring4新特性:泛型限定式依赖注入
- bzoj1036: [ZJOI2008]树的统计Count
- C语言之文件复制
- 讯飞实训之二维数组结构图
- CSS 页面重绘和回流
- 51nod 1258 FFT 多项式求逆 伯努利数
- spring中@autowired和@resource的区别
- 意甲官网在中国地区被假网劫持,竟声称赞助?
- Hive统计新增,日活和留存率, 使用sqoop导出到MYSql