第3章—高级装配—条件化的Bean】的更多相关文章

条件化的Bean 通过活动的profile,我们可以获得不同的Bean.Spring 4提供了一个更通用的基于条件的Bean的创建方式,即使用@Conditional注解. @Conditional根据满足某个特定的条件创建一个特定的Bean.比如,当某一个jar包在一个类路径下时,自动配置一个或者多个Bean.或者只有一个Bean创建时,才会创建另一个Bean.总的来说,就是根据特定条件来控制Bean的创建行为,这样我们可以利用这个特性进行一些自动配置. 下面的示例将以不同的操作系统作为条件,…
Condition:满足某个特定条件的情况下创建bean 条件化配置bean: a:@Conditional 指定一个class ,它指明了通过条件对比的类.如果没有指定class则通过Conditon接口进行条件对比: b:@Conditional 指定的类可以是任意实现了Condition接口的类 c:指定的类需要重写matches方法 1.例子1: @Bean @Conditional(MagicExistsConditon.class) //条件化的创建bean public Magic…
1. 概念 默认情况下,Spring中定义的bean在应用程序启动时会全部装配,不管当前运行的是哪个环境(Dev,QA或者Prod),也不管当前运行的是什么系统(Windows或者Linux),但有些使用场景下,我们可能需要条件化的装配某些bean,即当满足某一条件时,装配某些bean,当不满足某一条件时,就忽略掉某些bean. 这个条件可以很简单,比如当某个jar包存在时,当存在某个环境变量时,也可以很复杂. 针对这个使用场景,Spring中提供了@Conditional注解来实现条件化的be…
定义profile <beans> //root <beans profile="dev"> <bean id=.../> </beans> <beans profile="qa"> <bean id=.../> </beans> <beans profile="prod"> <bean id=.../> </beans> &l…
01.条件化配置bean @Bean @Conditional(MagicExistsCondition.class)---->条件化创建bean public MagicBean magicBean(){ return new MagicBean(); } 02.条件接口 public interface Condition{ boolean matches(ConditionContext ctxt, AnnotatedTypeMetadata metadata); } 03.条件类实现 p…
[Java Web开发学习]Spring4条件化的bean 转载:https://www.cnblogs.com/yangchongxing/p/9071960.html Spring4引入了@Conditional注解,可以用到带有@Bean注解的地方,若给定的条件计算为true则创建bean,否则bean被忽略 用法:@Conditional(PlayerCondition.class),设置为@Conditional注解的类必须是任意实现了org.springframework.conte…
如果你希望一个bean在特定的条件下才会出现: 应用的类路径下包含特定的库时才创建 只有当某个特定的bean也声明之后才会创建 某个特定的环境变量设定之后才创建某个bean 在Spring 4之前,很难实现这种级别的条件化配置,但是Spring4引入了一个新的@Conditional注解,它可以用到带有@Bean注解的方法上.如果给定的条件计算结果为true,就会创建这个bean,否则的话,这个bean会被忽略. 示例:设置了magic环境属性才去实例化MagicBean @Bean @Cond…
bean的作用域 bean的默认作用域 Spring定义了多种作用域,可以基于这些作用域创建bean,包括: 单例(Singleton):在整个应用中,只创建bean的一个实例. 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例. 会话(Session):在web应用中,为每个会话创建一个bean实例. 请求(Request):在web应用中,为每个请求创建一个bean实例. 单例是默认的作用域,但是正如之前所描述,对于易变的类型,这并不…
配置profile bean 3.1.@profile注解是spring提供的一个用来标明当前运行环境的注解. 我们正常开发的过程中经常遇到的问题是,开发环境是一套环境,qa测试是一套环境,线上部署又是一套环境.这样从开发到测试再到部署,会对程序中的配置修改多次,尤其是从qa到上线这个环节,让qa的也不敢保证改了哪个配置之后能不能在线上运行. 为了解决上面的问题,我们一般会使用一种方法,就是配置文件,然后通过不同的环境读取不同的配置文件,从而在不同的场景中跑我们的程序. 那么,spring中的@…
一.bean的作用域 在默认情况下,Spring应用上下文中所有bean都是作为以单例(singleton)的形式创建的.也就是说,不管给定的一个bean被注入到其他bean多少次,每次所注入的都是同一个实例.如果你所使用的类是易变的(mutable),它们会保持一些状态,因此重用是不安全的.在这种情况下,将class声明为单例的bean就不是什么好主意了,因为对象会被污染,稍后重用的时候会出现意想不到的问题. 1.Spring定义了多种作用域,可以基于这些作用域创建bean,包括: 单例(Si…
01.类级别条件创建 @Configuration @Profile("dev") public class Aclass{}---->影响整个类,包括类的注解.开发环境,类中的配置才生效 02.方法级别条件创建 @Configuration poublic class AClass{ @Bean @Profile("dev")---->与@Bean一起使用,仅仅影响整个方法 public DataSource createDataSource(){ .…
看<Spring源码深度解析>笔记 1.@Condition: 按照一定的条件进行判断,满足条件给容器中注册bean:实例: 根据系统给容器中注册Bean,如果是windows注册(“bill”): 如果是linus,注册(“linus”) @Bean("bill") public Person person01(){ return new Person("Bill Gates",62); } @Bean("linus") publi…
最近在读spring实战一书,个人感觉内容通俗易懂,学到了一些之前并不知道的知识,于是打算在博客里记录一下这些知识点便于后期记忆: 今天要记录的就是spring的条件化创建bean,针对条件化创建bean方面spring有两方面处理机制,分别是spring3.1引入的profile机制和4.0引入的通过@Conditional注解来定义条件化的bean,下面进行一一介绍.其中例子全部copy书中的案例 一.profile机制 书中是通过要创建三个分别适用于开发,生产和qa环境的DataSourc…
上篇介绍了如何基于profile来条件化创建bean,spring会根据profile的激活状态来进行创建;这篇介绍如何基于spring4.0引入的@Conditional和Condition接口来更加完美的创建bean: 假设你希望一个或多个bean只有在应用的类路径下包含特定的库时才创建.或者我们希望某个bean只有当另外某个特定的bean也声明了之后才会创建.我们还可能要求只有某个特定的环境变量设置之后,才会创建某个bean.在Spring 4之前,很难实现这种级别的条件化配置,但是Spr…
根据不同的环境来装配不同的bean 企业级开发中,我们一般有多种环境,比如开发环境.测试环境.UAT环境和生产环境.而系统中有些配置是和环境强相关的,比如数据库相关的配置,与其他外部系统的集成等. 如何才能实现一个部署包适用于多种环境呢? Spring给我们提供了一种解决方案,这便是条件化装配bean的机制.最重要的是这种机制是在运行时决定该注入适用于哪个环境的bean对象,不需要重新编译构建. 下面使用Spring的profile机制实现dataSource对象的条件化装配. 1.给出开发环境…
前言: 在上一章装配Bean中,我们看到了一些最为核心的bean装配技术.你可能会发现上一章学到的知识有很大的用处.但是,bean装配所涉及的领域并不仅仅局限于上一章 所学习到的内容.Spring提供了多种技巧,借助它们可以实现更为高级的bean装配功能.在本章中,我们将会深入介绍一些这样的高级技术. 使用情景: 在开发软件的时候,有一个很大的挑战就是将应用程序从一个环境迁移到另外一个环境.开发阶段中,某些环境相关做法可能并不适合迁移到生产环境中,甚至即便迁移过去也无法正常工作.数据库配置.加密…
主要内容: ●Spring profile ●条件化的bean声明 ●自动装配与歧义性 ● Spring表达式语言 本章介绍一些高级的装配技术,可实现更为高级的装配功能. 环境与profile 软件开发时,有一个很大的挑战就是讲应用程序从一个环境迁移到另外一个环境,开发环境可能并不适合迁移到生产环境,比如:数据库配置.加密算法以及外部系统的集成可能会发生变化. 比如数据库配置: ● 在开发环境中可能使用的是嵌入式数据库,并预先加载测试数据,bean配置类可能会在一个带有@Bean注解的方法上使用…
前言 前面讲解了bean的核心装配技术,其可应付很多中装配情况,但Spring提供了高级装配技术,以此实现更为高级的bean装配功能. 高级装配 配置profile bean 将所有不同bean定义放置在一个或多个profile中,在将应用部署到每个环境时,要确保对应的profile处于激活状态.如配置了如下数据源,并使用profile注解定义. JavaConfig配置profile 开发环境中的数据源配置 package com.hust.grid.leesf.ch3; import jav…
高级装配 一.环境与Profile 一)配置profile bean 环境的改变导致配置改变(需求:通过环境决定使用哪个bean),可以通过Spring的Profile解决. Profile可以在程序运行时根据环境的改变决定使用哪个bean.所以一个部署单元能适应所有环境. 1.在Java文件中配置  @Configuration public class UserConfig { @Bean @Profile("dev") //dev激活时才创建使用该bean public User…
Spring高级装配要学习的内容包括: Spring profile 条件化的bean声明 自动装配与歧义性 bean的作用域 Spring表达式语言 以上属于高级一点的bean装配技术,如果你没有啥特别的需求的话用的还比较少.但是用于解决变态一点的需求还是要学一下留个备份. 环境与Profile 直接上情形吧,一个项目现在有三个阶段,不同阶段使用的dataSource的来源不一样,分别是: 开发阶段:使用嵌入式的Hypersonic数据库 QA阶段:使用不同DataSource配置,比如Com…
一.Spring profile 在开发软件的时候,有一个很大的挑战就是将应用程序从一个环境迁 移到另外一个环境.开发阶段中,某些环境相关做法可能并不适合迁 移到生产环境中,甚至即便迁移过去也无法正常工作.数据库配置. 加密算法以及与外部系统的集成是跨环境部署时会发生变化的几个典 型例子.例--配置profile bean Spring为环境相关的bean所提供的解决方案其实与构建时的方案没有 太大的差别.当然,在这个过程中需要根据环境决定该创建哪个bean 和不创建哪个bean.不过Sprin…
目录 spring profile 条件化的bean声明 自动装配与歧义性 bean的作用域 Spring表达式语言 一.环境与profile 配置profile  bean 在软件开发的时候,有一个很大的挑战就是将应用程序从一个环境迁移到另外一个环境.数据库配置.加密算法以及与外部系统的集成是夸环境部署时会发生变化的几个典型例子. 以下是两个不同环境的DataSource   bean. package springdemo.test1.entity.datasource; import ja…
1.  profile profile可以决定bean在什么环境下才被装配(开发环境.测试环境.线上环境等) @Profile(“dev”)可以用在class之前,也可以用在类之前(Spring3.2),表示类或者方法返回类只有在dev环境激活时才被创建:也可以在XML文件中配置. 激活profile:作为DispatcherServelet的初始化参数 作为web应用的上下文参数 作为JNDI条目 作为环境变量 作为JVM的系统属性 在集成测试类上,使用@ActiveProfile注解设置 2…
[环境与Profile] 暂略 [条件化的bean] 暂略 [处理自动装配歧义性] 暂略 [ bean 的作用域] 在 @Componen . @Bean 下以及 XML 中的声明方式如下所示, @Component("LonelyHeartsClub") @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) // Singleton 作用域是默认的,Prototype 作用域需要特别声明,每次注入都会创建一个新的 Bean 实例 public…
学习了profile bean之后,发现有的时候bean还是有根据环境来选择的余地的,那么假设我们希望某个bean只有当另外某个特定的bean也声明了之后才会创建.我们还可能要求只有某个特定的环境变量设置之后,才会创建某个bean. 在Spring 4之前,很难实现这种级别的条件化配置,但是Spring 4引入了一个新的@Conditional注解,它可以用到带有@Bean注解的方法上.如果给定的条件计算结果为true,就会创建这个bean,否则的话,这个bean会被忽略. 今天就来学习下 条件…
Spring高级装配 目录 一.Profile(根据开发环境创建对应的bean) 二.条件化的创建bean(根据条件创建bean) 三.处理自动装配歧义性(指定首选bean.限定符限制bean) 四.Bean的作用域(单例.原型.会话.请求) 五.配置文件信息注入(.properties文件的使用,SpEL的使用) 一.根据开发环境创建对应的bean 在一个项目的开发过程中,一般要经过开发.测试.生产等三个阶段,分别对应三种环境.因为在各个环境可能数据库配置.加密算法等的不同,所以将应用从一个环…
前言: 当讨论依赖注入的时候,我们通常所讨论的是将一个bean引用注入到另一个bean的属性或构造器参数中.bean装配的另外一个方面指的是将一个值注入到bean的属性或者构造器参数中.在没有学习使用怎么注入外部值时,我们正常是直接将值写死在代码中.如将专辑的名字装配到BlankDisc bean的构造器或title属性中. 例如,我们可能按照这样的方式来组装BlankDisc: 如果使用XML的话,那么值也会是硬编码的:  如果我们可能会希望避免硬编码值,而是想让这些值在运行时再确定.为了实现…
Ext JS 6学习文档-第6章-高级组件 高级组件 本章涵盖了高级组件,比如 tree 和 data view.它将为读者呈现一个示例项目为 图片浏览器,它使用 tree 和 data view 组件.以下是本章将要讨论的主题: Trees Data views 拖放 图片浏览器 — 一个示例项目 本章的主要目标是探索 tree panel 和 data view 并且使用他们来构建一个示例项目图片浏览器.图片浏览器的最终展示效果如下图. 这个项目中的最重要的组件是 tree panel 和…
条件化 bean 有时候我们要满足某种情况才将bean 初始化放入容器中. 基于环境初始化不同的 bean 1.申明接口并创建两个实现类 public interface Teacher { void startWorking(); } public class JavaTeacher implements Teacher { public void startWorking() { System.out.println("开始 Java 教学"); } } public class…
高级装配用来适应开发和生产 不同环境下的软切换 一.环境与profile 1.开发环境下的profile package com.bonc.config; import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.con…