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. 扫雷游戏制作过程(C#描述):第五节、菜单操作(续)

    前言 这里给出教程原文地址. 该项目已经放在github上托管. 发布版已经分享到百度网盘 菜单操作(续) 接着节前一章节的内容,我们继续完善菜单栏的功能. 我们首先,先完善Rank的选项,我们希望我 ...

  2. 201521123122 《java程序设计》 第三周学习总结

    1. 本章学习总结 你对于本章知识的学习总结 链接点击此处 2. 书面作业 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private s ...

  3. 201521123017 《Java程序设计》第13周学习总结

    1. 本周学习总结 2. 书面作业 Q1.网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 1.2 te ...

  4. 201521123033《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  5. Rabbitmq集群安装配置

    Rabbitmq集群安装与配置 一.rabbitmq安装环境准备 1.安装环境准备 这里,我们以两个节点为例进行安装,一个节点为内存节点,另一个节点为硬盘节点,具体可根据自己需要分配节点. 安装系统 ...

  6. Java swing(awt):事件监听机制的实现原理+简单示例

    (1)实现原理 事件监听机制的实现: 参考图:事件模型_ActionEvent 为了节省资源,系统无法对某个事件进行实时的监听.故实现的机制是当发生某个事件后,处理代码将被自动运行,类似钩子一般.(回 ...

  7. eclipse复制到IDEA中文不匹配,编译失败

    今天使用把eclipse的包复制到Intellij Idea下,结果在编译的时候,它说我的数据是GBK,而Idea默认的数据是UTF-8,因此出错了... 解决:在项目中直接把对象的encoding. ...

  8. OC——继承

    继承的其中一个很重要的目的是为了实现多态.我们现在先来看看OC的继承. 一.继承 父类: 头文件 // // Peason.h // 01-继承和多态 // // Created by zhangji ...

  9. struts1.3整合spring2.5(将spring委托给struts方式)

    前提是配置完struts1.3 导包 spring-2.5.6.jar //spring核心包 spring-webmvc-struts-2.5.5.jar //struts整合spring使用 lo ...

  10. MMORPG战斗系统随笔(二)、浅谈场寻路Flow Field PathFinding算法

    转载请标明出处http://www.cnblogs.com/zblade/ 今天给大家带来一篇游戏中寻路算法的博客.去年,我加入一款RTS的游戏项目,负责开发其中的战斗系统,战斗系统的相关知识,属于游 ...