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

Visual MODFLOW Flex 6.1新手入门:从数据导入到3D建模的完整工作流解析 本文为Visual MODFLOW Flex 6.1新手提供了从零开始构建地下水数值模型的完整工作流指南。详细解析了从项目规划、数据准备与导入,到构建三维概念模型、生成并运行数值模型,直至结果可视化与校准的核心步骤。帮助水文地质与环工领域初学者快速掌握这一专业软件,高效完成从数据到三维建模的全过程。 阅读详情

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、Entity

  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; 

1.4 Map依赖注入:

  1. @Autowired  
  2. 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/数组注入:

  1. @Autowired  
  2. private List<BaseService> list; 
这样会注入所有实现了BaseService的Bean;但是顺序是不确定的,如果我们想要按照某个顺序获取;在Spring4中可以使用@Order或实现Ordered接口来实现,如:

  1. @Order(value = 1)  
  2. @Service  
  3. public class UserService extends BaseService<User> {  
  4. }  
这种方式在一些需要多态的场景下是非常有用的。

1.6 @Lazy可以延迟依赖注入:

  1. @Lazy  
  2. @Service  
  3. public class UserService extends BaseService<User> {  
  4. } 

  1. @Lazy  
  2. @Autowired  
  3. private UserService userService; 
我们可以把@Lazy放在@Autowired之上,即依赖注入也是延迟的;当我们调用userService时才会注入。即延迟依赖注入到使用时。同样适用于@Bean。

1.7 @Conditional

@Conditional类似于@Profile(一般用于如我们有开发环境、测试环境、正式机环境,为了方便切换不同的环境可以使用@Profile指定各个环境的配置,然后通过某个配置来开启某一个环境,方便切换),但是@Conditional的优点是允许自己定义规则。可以指定在如@Component、@Bean、@Configuration等注解的类上,以绝对Bean是否创建等。首先来看看使用@Profile的用例,假设我们有个用户模块:

1、在测试/开发期间调用本机的模拟接口方便开发;

2、在部署到正式机时换成调用远程接口;

  1. public abstract class UserService extends BaseService<User> {  
  2. }  
  3.   
  4. @Profile("local")  
  5. @Service  
  6. public class LocalUserService extends UserService {  
  7. }  
  8.   
  9. @Profile("remote")  
  10. @Service  
  11. public class RemoteUserService extends UserService {  
  12. }  
我们在写测试用例时,可以指定我们使用哪个Profile:

  1. @ActiveProfiles("remote")  
  2. @RunWith(SpringJUnit4ClassRunner.class)  
  3. @ContextConfiguration(locations =  "classpath:spring-config.xml")  
  4. public class ServiceTest {  
  5.   
  6.     @Autowired  
  7.     private UserService userService;  
  8. }  
这种方式非常简单。如果想自定义如@Profile之类的注解等,那么@Conditional就派上用场了;假设我们系统中有好多本地/远程接口,那么我们定义两个注解@Local和@Remote注解要比使用@Profile方便的多;如:

  1. @Retention(RetentionPolicy.RUNTIME)  
  2. @Target({ElementType.TYPE, ElementType.METHOD})  
  3. @Conditional(CustomCondition.class)  
  4. public @interface Local {  
  5. }  
  6.   
  7. @Retention(RetentionPolicy.RUNTIME)  
  8. @Target({ElementType.TYPE, ElementType.METHOD})  
  9. @Conditional(CustomCondition.class)  
  10. public @interface Remote {  
  11. }  

  1. public class CustomCondition implements Condition {  
  2.   
  3.     @Override  
  4.     public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {  
  5.         boolean isLocalBean = metadata.isAnnotated("com.sishuok.spring4.annotation.Local");  
  6.         boolean isRemoteBean = metadata.isAnnotated("com.sishuok.spring4.annotation.Remote");  
  7.         //如果bean没有注解@Local或@Remote,返回true,表示创建Bean  
  8.         if(!isLocalBean && !isRemoteBean) {  
  9.             return true;  
  10.         }  
  11.   
  12.         boolean isLocalProfile = context.getEnvironment().acceptsProfiles("local");  
  13.   
  14.         //如果profile=local 且 bean注解了@Local,则返回true 表示创建bean;  
  15.         if(isLocalProfile) {  
  16.             return isLocalBean;  
  17.         }  
  18.   
  19.         //否则默认返回注解了@Remote或没有注解@Remote的Bean  
  20.         return isRemoteBean;  
  21.     }  
  22. }  

然后我们使用这两个注解分别注解我们的Service:

  1. @Local  
  2. @Service  
  3. public class LocalUserService extends UserService {  
  4. }  

  1. @Remote  
  2. @Service  
  3. public class RemoteUserService extends UserService {  
  4. }  

首先在@Local和@Remote注解上使用@Conditional(CustomCondition.class)指定条件,然后使用@Local和@Remote注解我们的Service,这样当加载Service时,会先执行条件然后判断是否加载为Bean。@Profile就是这样实现的,其Condition是:org.springframework.context.annotation.ProfileCondition。可以去看下源码,很简单。



UNITY3D万人同屏,Dots万人同屏解决方案_类萌宠宠之战 UNITY3D弹幕游戏开发,万人同屏解决方案 阅读详情

相关推荐

AquaCrop-OSPy学习笔记02:模型输入设置

AquaCrop-OSPy的输入设置

EWBA_GIS_RS_ER的博客 3693

java map class_Java:声明一个包含两个相关泛型类型的Map(Map>,Class <?extends ClassB >>)...

另一种方法是提供自己的Map实现.如果扩展现有实现并使用新类型,则不需要太多代码:public class CompatibleHashMap extends HashMap, ClassB> {}现在,一个CompatibleHashMap< String>只允许你把ClassA< String>作为键和ClassB< String>作为价值观.编辑:正...

weixin_33128371的博客 2257

Protege本体建模实战:从零构建电影知识图谱并导入Neo4j

本体建模是知识图谱构建的基石,通过类、属性、实例和约束系统描述领域知识,为数据提供可复用的语义骨架。OWL作为本体描述语言的标准,配合Protege工具可实现可视化建模,并借助推理机验证逻辑一致性,提升模型可靠性。在工程落地中,本体模型常需导入图数据库如Neo4j,以支持高效的关联查询与业务应用。本文以影视领域为背景,完整演示Protege中定义类层级、创建对象/数据属性、填充实例,以及导出OWL文件并通过Python脚本转换为Neo4j节点与关系的全过程,同时梳理命名空间、匿名节点、编码等易踩坑点,帮助读

weixin_29047545的博客 281

java getcomponenttype_Spring 组件(一)Spring 是如何解析泛型 - ResolvalbeType

Spring 组件(一)Spring 是如何解析泛型 - ResolvalbeTypeJava Type 泛型系列文章:Spring 中大量使用反射,需要获取泛型的具体类型,为此专门提供了一个工具类解析泛型 - ResolvalbeType。ResolvableType 是对 Class,Field,Method 获取 Type 的抽象。一、ResolvalbeType 使用interface S...

weixin_36059856的博客 529

知识图谱与人工智能本体论:构建机器认知的语义基石

本文探讨了知识图谱与人工智能本体论如何作为机器认知的语义基石,让AI从‘知道数据’迈向‘理解知识’。文章详细拆解了本体论的核心构件与构建方法,并阐述了从本体到知识图谱的实践路径,包括知识获取、融合、存储及推理应用,最终分析了其在智能搜索与专家系统等场景中带来的根本性重塑。

nginx7reverse的博客 910

maya后台批量比对maya文件层级

在cg制作过程中,为了统一制作规范,提高效率我们Pipeline都会制作一个比对层级的工具下面介绍的是maya利用batch文件进行模型与绑定和材质文件进行比对层级。 直接上代码: #!usr/bin/env python # -*- encoding: utf-8 -*- """ @author:MCC @file: compareUI @time: 2018/11/21 16:29 """ i...

CGpipelineTD 1642

Spring泛形注入,CGLIB动态代理

1.两组泛型继承类,和一个实体类 第一组:package com.test.daselin.generate.di;public class BaseRespostory<T> {}}package com.test.daselin.generate.di;import org.springframework.stereotype.Repository;@Repository public cla

rentian1的博客 1061

语音测试(二)音频标注(praat)

通过点击红线下方的圆点进行区域划分,在区域中标注所属的类别。按住Alt+Backspace 键取消蓝色线条。

beishida123的博客 3734

Spring 中优雅的获取泛型信息

简介 Spring 源码是个大宝库,我们能遇到的大部分工具在源码里都能找到,所以笔者开源的 mica 完全基于 Spring 进行基础增强,不重复造轮子。今天我要分享的是在 Spring 中优雅的获取泛型。 获取泛型 自己解析 我们之前的处理方式,代码来源 vjtools(江南白衣)。 /** * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. * * 注意泛型必须定义在父类...

weixin_34342992的博客 445

RKNN3588——YOLOv8的PT模型转RKNN模型

1. 首先克隆rknn修改后的ultralytics版本项目到本地主要是修改了源码的ultralytics/nn/modules/head.py和ultralytics/engine/exporter.py两个文件。2. 使用修改后的ultralytics对pt模型进行模型转换,此处的format=rknn代表支持rknn后续的转换,而不是用onnx,一定要注意!!!

张飞飞的博客 7171

华为OD技术面真题 - 数据库Redis - 1

汇总华为OD技术面真题Redis方面高频真题,提供详细解答。

qq_45776114的博客 934

Spring 泛型依赖注入

Spring 4.x 中可以为子类注入子类对应的泛型类型的成员变量的引用 示例: 1.Repository  的父类 BaseRegistory public class BaseRepository { }2.Service的父类 BaseService BaseService中配置一个泛型的BaseRepository。 public class BaseServi

sky的博客 369

YOLOv8改进 | 注意力篇 | 一文带你改进GAM、CBAM、CA、ECA等通道注意力机制和多头注意力机制

官方论文地址:官方论文地址点击此处即可跳转官方代码地址:官方代码地址点击此处即可跳转GAM旨在通过设计一种机制,减少信息损失并放大全局维度互动特征,从而解决传统注意力机制在通道和空间两个维度上保留信息不足的问题。GAM采用了顺序的通道-空间注意力机制,并对子模块进行了重新设计。具体来说,通道注意力子模块使用3D排列来跨三个维度保留信息,并通过一个两层的MLP增强跨维度的通道-空间依赖性。

Snu77的博客 4万+

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

大家可以看到,现在的写法非常简洁。支持泛型式依赖注入。这个也是我之前非常想要的一个功能,这样对于那些基本的。模块的实现、测试的增强等。其中两个我一直想要的增强就是:支持泛型依赖注入、对。注入,这样万一子类想变,比较容易切换。如果有多个实现时,子。,我们一般是这样实现的:首先写一个模板父类,把通用的。方法,然后指定注入的具体类型,然后进行注入;然后子类继承后,只需要添加额外的实现。式代码,可以简化更多的代码。可以看到,以前必须再写一个。对于泛型依赖注入,最好使用。、对核心容器进行增强、对。

2301_78008478的博客 146

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spring4新特性——更好的Java泛型操作API

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33768481的博客 347

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Spring4新特性——核心容器的其他改进

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34358092的博客 286

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spring4新特性——Web开发的增强

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33766805的博客 368

Spring 4.x vs Spring 5.x

随便记录一下spring新特性,以便日后学习 Spring 4.x新特性 1. 泛型限定式依赖注入 2. 核心容器的改进 3. web开发增强 4. 集成Bean Validation 1.1(JSR-349)到SpringMVC 5. Groovy Bean定义DSL 6. 更好的Java泛型操作API 7. JSR310日期API的支持 8. 注解、脚本、

程序猿日记本 2万+
上一篇: 解决Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'(using password: YSE)
下一篇: Spring4新特性:
yangxt
博客等级 码龄20年 172粉丝 78原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值