zoukankan      html  css  js  c++  java
  • Spring高级装配

    Spring高级装配

    目录

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

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

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

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

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

     

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

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

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

    1.配置beanprofile

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

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

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

    2.激活profile

      激活Profile需要依赖两个属性spring.profiles.activespring.profiles.default

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

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

      如果都没有设置,Spring只会创建没有指定Profilebean

      可以通过在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启动时,指定了对应的Profilebean会被创建,如果一个bean没有指定profile,则它总会被创建。

    二、条件化的创建bean

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

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

      Public interface Condition{

        Boolean matches(ConditionContext ctxt,AnnotatedTypeMetadata metadata);

      }

      此接口只有一个matches方法,两个形参ConditionContextAnnotatedTypeMetadata

        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;

        可以通过EnvironmentgetgetProperty()获取值;

    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

     

  • 相关阅读:
    mysql 组合聚集函数
    mysql distinct()函数 去重
    mysql sum()函数 , 计算总和
    mysql max()函数,min()函数,获取最大值以及最小值
    mysql count() 函数,对结果统计计数
    三个实例演示 Java Thread Dump 日志分析
    借助LVS+Keepalived实现负载均衡
    配置Tomcat成为系统服务
    快速理解Docker
    tomcat 启动时设置 java 参数,mark
  • 原文地址:https://www.cnblogs.com/chenkeyu/p/7704940.html
Copyright © 2011-2022 走看看