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

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

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

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

Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC

Spring4新特性——Groovy Bean定义DSL

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

Spring4新特性——JSR310日期API的支持

Spring4新特性——注解、脚本、任务、MVC等其他特性改进

接上一篇《Spring4新特性——泛型限定式依赖注入》,接下来我们看看Spring4的其他改进。

1、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}

2、List/数组注入:

@Autowired
private List<BaseService> list;

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

@Order(value = 1)
@Service
public class UserService extends BaseService<User> {
}

这种方式在一些需要多态的场景下是非常有用的。

3、@Lazy可以延迟依赖注入:

@Lazy
@Service
public class UserService extends BaseService<User> {
}
@Lazy@Autowiredprivate UserService userService;

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

4、@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 {
}

我们在写测试用例时,可以指定我们使用哪个Profile:

@ActiveProfiles("remote")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations =  "classpath:spring-config.xml")
public class ServiceTest {@Autowiredprivate UserService userService;
}

这种方式非常简单。如果想自定义如@Profile之类的注解等,那么@Conditional就派上用场了;假设我们系统中有好多本地/远程接口,那么我们定义两个注解@Local和@Remote注解要比使用@Profile方便的多;如:

@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 {@Overridepublic 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,表示创建Beanif(!isLocalBean && !isRemoteBean) {return true;}boolean isLocalProfile = context.getEnvironment().acceptsProfiles("local");//如果profile=local 且 bean注解了@Local,则返回true 表示创建bean;if(isLocalProfile) {return isLocalBean;}//否则默认返回注解了@Remote或没有注解@Remote的Beanreturn 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。可以去看下源码,很简单。

5、基于CGLIB的类代理不再要求类必须有空参构造器了:

这是一个很好的特性,使用构造器注入有很多好处,比如可以只在创建Bean时注入依赖,然后就不变了,如果使用setter注入,是允许别人改的。当然我们可以使用spring的字段级别注入。如果大家使用过如Shiro,我们可能要对Controller加代理。如果是类级别代理,此时要求Controller必须有空参构造器,有时候挺烦人的。spring如何实现的呢?其内联了objenesis类库,通过它来实现,可以去其官网看看介绍。这样就支持如下方式的构造器注入了:

@Controller
public class UserController {private UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}
}

org.springframework.cglib.proxy.Enhancer在其github和maven仓库中的source中竟然木有,其github:https://github.com/spring-projects/spring-framework/tree/master/spring-core/src/main/java/org/springframework/cglib;难道忘了吗?

转载于:https://my.oschina.net/qjx1208/blog/200803

Spring4新特性——核心容器的其他改进相关推荐

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

    2019独角兽企业重金招聘Python工程师标准>>> Spring4新特性--泛型限定式依赖注入 Spring4新特性--核心容器的其他改进 Spring4新特性--Web开发的增 ...

  2. Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC

    http://sishuok.com/forum/blogPost/list/7798.html 在之前的<跟我学SpringMVC>中的<第七章 注解式控制器的数据验证.类型转换及 ...

  3. MySQL8.0 - 新特性 - 安全及权限相关改进

    MySQL8.0里引入了不少关于权限的改动,从这些改动可以看出来,权限管理更加的规范和遍历了,这和我们之前为rds mysql增加了大量权限管理很类似,想来Oracle也是通过这些改动为其云业务服务的 ...

  4. oracle关闭数据库容器,Oracle12cr1新特性之容器数据库(CDB)和可插拔数据库(PDB) 的启动和关闭...

    Oracle12c中引入的多宿主选项(multitenant option)允许一个容器数据库容纳多个独立的可插拔数据库(PDB).本文将说明如何启动和关闭容器数据库(CDB)和可插拔数据库(PDB) ...

  5. 【Java】JDK1.8新特性Date类----日期/时间改进

    一.为什么我们需要新的Java日期/时间API? 1.8之前JDK自带的日期处理类非常不方便,我们处理的时候经常是使用的第三方工具包,比如commons-lang包等.不过1.8出现之后这个改观了很多 ...

  6. Spring4.1新特性——Spring MVC增强

    2019独角兽企业重金招聘Python工程师标准>>> 1.GroovyWebApplicationContext  在Spring 4.1之前没有提供Web集成的Applicati ...

  7. Spring 4.x版本新特性

    文章目录 版本历史 Spring 3.x Spring 4.x Spring 5.x Spring 4.x 各个子版本特性 Spring 4.0.x Spring 4.2.x Spring 4.3.x ...

  8. 傲游3.0.22.1000_Beta 10项新特性,超有料更新

    除了10多项新特性, 还有一些功能细节改进, 以及大量问题修正. 其中包括地址栏无法输入, 点击连接打开下载页面等用户反馈集中的问题. 这些新特性是: 全新Beta图标 支持自定义搜索栏, 头像等界面 ...

  9. MySQL5.5复制新特性

    MySQL5.5复制新特性 一.MySQL5.5复制改进 MySQL5.5版本对MySQL Replication进行了多项的改良,以提供数据的完整性,性能和应用灵活性更高水平. 1.Semisync ...

最新文章

  1. ORACLE查询删除重复记录
  2. tomcat更改端口
  3. Azure Redis Cache (3) 创建和使用P级别的Redis Cache
  4. PHP Warning: date() [function.date]解决方案
  5. php 加密保存mysql_PHP及MYSQL中字符串加密函数
  6. cloudare mysql 密码修改_CentOS7.3 LAMP环境搭建私有云NextCloud过程记录
  7. Output Arcade Utility Tool for Mac(Arcade音色库破解导入工具)
  8. SqlZoo.net习题答案:Using the SELECT statement.【nobel】
  9. Linux 之 shell 比较运算符
  10. 农业银行王敬东——金融科技时代商业银行战略模式选择初探
  11. allennlp 版本关系
  12. Madis模拟黏滞阻尼器
  13. Jabber Frame(超时传输帧)
  14. 【研究】英文论文阅读——英语poor的研究人员的福利
  15. 如何使用Redis Streams
  16. python入门容器-列表ListDay05
  17. 什么是数据不平衡问题,应该如何解决
  18. Unity3D 网页插件Embedded Browser(ZFBrowser)PC端打包文件无法加载网页解决方法
  19. Python实现 鱼群算法库
  20. Activiti学习(一)之工作流的介绍和使用

热门文章

  1. 全球及中国卫星通信设备市场应用需求分析与投资潜力预测报告2022年
  2. 全球及中国木材加工行业运行状况与投资产值预测报告2022版
  3. 全球及中国润滑油市场产销规模及营销竞争分析报告2021-2027年
  4. 中国互联网+政务建设发展现状及市场规模预测报告2022-2027年版
  5. 中国覆铜板(CCL)行业竞争现状及投资战略研究报告2021年版
  6. redmine上传大文件报错Request Entity Too Large
  7. Visual C++下对匿名管道的编程实现
  8. 2019最新Python学习路线图:如何用Python创建微信机器人
  9. Android LayoutInflater源码解析:你真的能正确使用吗?
  10. C#.NET常见问题(FAQ)-命名空间namespace如何理解