Spring高级装配

目录

一、Profile(根据开发环境创建对应的bean)

二、条件化的创建bean(根据条件创建bean)

三、处理自动装配歧义性(指定首选bean、限定符限制bean)

四、Bean的作用域(单例、原型、会话、请求)

五、配置文件信息注入(.properties文件的使用,SpEL的使用)

一、根据开发环境创建对应的bean

  在一个项目的开发过程中,一般要经过开发、测试、生产等三个阶段,分别对应三种环境。因为在各个环境可能数据库配置、加密算法等的不同,所以将应用从一个环境迁移到另一个环境就变成了一个很大的挑战。

  Spring在3.1版本中引入bean profile的功能。在使用profile时,可以将不同的bean整理到一个或多个profile中,当应用部署到某个环境时,这个环境对应的profile中的bean就会处于与激活(active)状态。

1.配置bean的profile

  在Java中使用@Profile注解指定某个bean属于哪个profile。

  如果是JavaConfig配置Spring。我们可以在配置类上添加@Profile,来指定当前的配置类中所有的bean的Profile。

  如果是XML配置Spring。可以在<beans>中添加profile=”xx”,来指定标签中的所有<bean>的profile。

2.激活profile

  激活Profile需要依赖两个属性spring.profiles.active和spring.profiles.default。

  如果设置了active属性,Spring会用此确定哪些profile会被激活(active可以指定多个)。

  如果没有设置active属性,Spring会使用default的值。

  如果都没有设置,Spring只会创建没有指定Profile的bean。

  可以通过在web.xml设置这个两个值

 <web-app xxx>

    <!--在上下文中添加默认profile-->

  <context-param>

  <param-name>spring.profiles.default</param-name>

  <param-name>dev</param-value>

  </context-param>

  <servlet>

  ......

    <!--为servlet设置默认profile-->

  <init-param>

    <param-name>spring.profiles.default</param-name>

    <param-name>dev</param-value>

  </init-param>

  </servlet>

</web-app>

当Spring启动时,指定了对应的Profile的bean会被创建,如果一个bean没有指定profile,则它总会被创建。

二、条件化的创建bean

  Spring4.x之后,引入@Conditional注解,来实现bean只有满足某个条件才创建。如果给定条件计算为true,就会创建这个bean。

  @Conditional中需要传入一个类类型,而这个类需要实现Condition接口;

  Public interface Condition{

    Boolean matches(ConditionContext ctxt,AnnotatedTypeMetadata metadata);

  }

  此接口只有一个matches方法,两个形参ConditionContext和AnnotatedTypeMetadata。

    ConditionContext对象可以做如下的事

    getRegistry()返回的对象可以检查bean的注册情况

    getBeanFactory返回的对象可以检查bean是否存在,探查bean的属性

    getEnvironment返回的对象可以检查环境变量是否存在和值是多少

    getResourceLoader返回的对象可以获取加载的资源

    AnnotatedTypeMetadata对象能检查带有@Bean注解的方法还有什么其他的注解。

三、处理自动装配歧义性

  Spring的自动装配可以给应用开发带来很大的便利,但是上一章中可以知道,如果在注入时使用接口,变量名也是接口名,且实现该接口的Bean有多个时,注入会出现错误。

对于这种情况,Spring提供两种方案来解决问题。在可选的多个Bean中设置某一个为首选的bean或者使用限定符来将bean的选择范围缩小。

  1. 设置首选Bean

    在JavaConfig中给生成Bean的函数添加@Primary注解

    在XML中给<bean>中添加 primary=”true”属性

    在@Component注解后添加@Primary注解

  设置首选Bean是一个非常方便的方式,但是当我们标志了多个首选Bean时,就会无法工作。所以解决歧义问题更强大的方式是限定。

  注:在使用@Primary进行设置首选Bean时,发现会出现@Primary检测不到的情况,我将文件删除后重新写发现又可以检测到了,不知道是不是IDE缓存的问题,有待考证。

  2.限定自动装配bean

  1. 2.1在添加@Autowired注解实现自动注入时,我们可以再添加一个@Qualifier(“id”)注解,其中传入我们想注入的bean的id。
  1. 2.2在添加@Component注解生成Bean时添加@Qualifier(“特征词”)注解,为这个Bean分配一个特征词,这时就可以在注入时根据特征词来限定装配。
  1. 2.3当多个Bean有相同的特征词的时候,依然会出现问题,那么我们就可以自定义限定符注解来实现一个Bean有多个特征词:

    @Target({ElementType.CONSTRUCTOR,ElementType.FIELD,

      ElementType.METHODElementType.TYPE})

    @Retention(RetentionPolicy.RUNTIME)

    @Qualifier

    Public  @interface  此处填写特征词{}

  这时就可以在生成Bean时添加多个特征词注解,然后在注入时同时可以添加多个注解,直到将范围缩小到只有一个bean。

四、Bean的作用域

  Spring应用上下文中生成的Bean默认都是单例形式的,然而在应用中有些类是易变的,会保持一些状态,因此如果是单例的就会造成问题。

Spring定义多个作用域,可以基于这些作用域来创建bean:

  单例(Singleton):在应用中只创建一个实例

  原型(Prototype):每次注入或通过Spring应用上下文获取时创建一个新实例

  会话(Session):在Web应用中,为每个会话创建一个bean

  请求(Request):在Web应用中,为每个请求创建一个bean

使用:

  在JavaConfig中,添加注解@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

  在XML中,在<bean>中添加scope=”prototype”属性

五、配置文件信息注入

  在应用开发过程中,我们可能需要使用配置文件来设置某些值,那么如何通过Spring来将配置文件的值注入到程序中呢?

  Spring提供两种方式实现,属性占位符和SpEL表达式

  首先我们需要声明配置文件的源,在JavaConfig中使用注解:

  @PropertySource(“classpath:/app.properties”)

  1.通过Environment来检索属性

    @Autowired

    Environment env;

    可以通过Environmentget的getProperty()获取值;

2.通过占位符来检索属性

  2.1开启占位符功能

    在spring中如果想使用占位符,需要配置PropertySourcesPlaceholderConfigurer。

    在JavaConfig中,使用如下代码:

    @Bean

    Public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){

      return new PropertySourcesPlaceholderConfigurer()

    }

如果是使用XML配置,可以使用context命名空间的

  <context:property-placeholder>

  2.2如何使用占位符?

    如果在XML配置文件中,直接通过${keyname}就可以获取

    如果在JavaConfig中,可以使用@Value(“$(key)”)注解,类型@Autowired

3.使用SpEL表达式

  使用SpEl可以将值装配到bean属性和构造器参数中。

  注:SpEL表达式要放到#{...}中,属性占位符放到${...}中。

  3.1 SpEL可以获取bean的引用、属性和调用方法。

  3.2 SpEL 可以调用类的静态方法或属性,如T(java.lang.Math).PI

  3.3 SpEL 可以进行计算,条件判断,正则匹配(matches)

Spring高级装配的更多相关文章

  1. Spring高级装配(一) profile

    Spring高级装配要学习的内容包括: Spring profile 条件化的bean声明 自动装配与歧义性 bean的作用域 Spring表达式语言 以上属于高级一点的bean装配技术,如果你没有啥 ...

  2. Spring高级装配bean

    目录 spring profile 条件化的bean声明 自动装配与歧义性 bean的作用域 Spring表达式语言 一.环境与profile 配置profile  bean 在软件开发的时候,有一个 ...

  3. (二)spring 高级装配-Condition -条件化的bean

    Condition:满足某个特定条件的情况下创建bean 条件化配置bean: a:@Conditional 指定一个class ,它指明了通过条件对比的类.如果没有指定class则通过Condito ...

  4. (一)spring 高级装配-@Profile

    1.环境与profile 示例:数据库配置 a:通过@Bean注解,通过EmbeddedDatabaseBuilder创建数据源 @Bean(destroyMethod="shutdown& ...

  5. Spring高级装配(二) 条件化的bean

    如果你希望一个bean在特定的条件下才会出现: 应用的类路径下包含特定的库时才创建 只有当某个特定的bean也声明之后才会创建 某个特定的环境变量设定之后才创建某个bean 在Spring 4之前,很 ...

  6. (三)Spring 高级装配 bean的作用域@Scope

    1.默认情况下,spring通过@Autowared注入的bean是单例的bean,但有些情况是不满足的,例如:购物车,每个会话,或每个用户登录使用的购物车都是独立的 spring的定义的作用域: a ...

  7. Spring实战(四)Spring高级装配中的bean profile

    profile的原意为轮廓.剖面等,软件开发中可以译为“配置”. 在3.1版本中,Spring引入了bean profile的功能.要使用profile,首先要将所有不同的bean定义整理到一个或多个 ...

  8. 【Spring 核心】高级装配

    高级装配用来适应开发和生产 不同环境下的软切换 一.环境与profile 1.开发环境下的profile package com.bonc.config; import javax.sql.DataS ...

  9. 【Spring】高级装配

    前言 前面讲解了bean的核心装配技术,其可应付很多中装配情况,但Spring提供了高级装配技术,以此实现更为高级的bean装配功能. 高级装配 配置profile bean 将所有不同bean定义放 ...

随机推荐

  1. 201521123056 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  2. 201521123095 《Java程序设计》第2周学习总结

    1. 本周学习总结 学会了使用码云管理代码,使用eclipse关联jdk源代码: 还学习了Java语言中各种数据类型以及运算符. 2. 书面作业 1.使用Eclipse关联jdk源代码,并查看Stri ...

  3. 201521123059 《Java程序设计》第一周学习总结

    第一周学习总结 1.本周学习总结 开学第周我们开始了JAVA学习,刚开始还有点懵,连熟悉相关的软件都要摸索很久,最后在看老师给的一些教程和课本的情况下安装了JDK和eclipse等软件,并进行了一次实 ...

  4. Java 课程设计 "Give it up"小游戏(团队)

    JAVA课程设计 "永不言弃"小游戏(From :Niverse) 通过Swing技术创建游戏的登陆注册界面,使用mySQL数据库技术完成用户的各项信息保存和游戏完成后的成绩保存. ...

  5. java课程设计-算术运算测试

    1. 团队名称.团队成员介绍 团队名称:cococo 团队成员 组长:网络1514叶城龙 201521123109 组员:网络1514余腾鑫 201521123108 2. 项目git地址 http: ...

  6. JVM菜鸟进阶高手之路五

    转载请注明原创出处,谢谢! 参考gc,发现大概一小时运行一次FGC,特别奇怪,笨神一看这样的问题就知道是system gc导致的,rmi默认一小时主动触发一次,由于没有gc日志,通过jstat命令观察 ...

  7. idea启动tomcat报错:Error during artifact deployment. See server log for details.

    出现这种情况的原因老夫猜想是改变了artifact然而tomcat的配置中的artifact没有重新配就会出现这种报错 打开tomcat配置 删除原来的artifact 新添加artifact 保存 ...

  8. angular smart-table组件如何定制化之初步研究

    table表运用在后台管理用得频繁,一般bootstrap的class="table"就能满足样式需求以及分页需求,但是每个产品经理需求不一样,比如说分页:bootstrap分页实 ...

  9. display:flex css

    本文介绍下flex的用法和属性 这个一个自适应的3列盒子 <div class="flex"> <div style="background-color ...

  10. PuTsangTo-单撸游戏开发03 碰撞与跳跃瑕疵版

    继续上一部分,游戏的定位是横版平台动作类游戏,所以得有跳跃动作,首先想到的就是物理引擎,不过在2D游戏里,仅为了角色的跳跃而引入物理引擎,目前想来有些不至于,仅使用cocos默认带有的碰撞系统也足够了 ...