web-dev-qa-db-ja.com

メソッドレベルのSpringプロファイル?

開発中にのみ実行されるいくつかのメソッドを紹介したいと思います。

私はSpring @Profile注釈はここですか?しかし、特定のプロファイルがプロパティで構成されている場合にのみこのメソッドが呼び出されるように、クラスレベルでこの注釈を適用するにはどうすればよいですか?

spring.profiles.active=dev

以下を擬似コードとして使用します。これをどのように行うことができますか?

class MyService {

    void run() { 
       log();
    }

    @Profile("dev")
    void log() {
       //only during dev
    }
}
20
membersound

あなたが読むことができるAS http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/context/annotation/Profile.html

@Profile注釈は、次のいずれかの方法で使用できます。

カスタムステレオタイプアノテーションを作成する目的で、メタアノテーションとして@Configurationクラスを含む、@ Componentで直接または間接的にアノテーションが付けられたクラスのタイプレベルアノテーションとして @Profileでマークされ、そのクラスに関連付けられている@Beanメソッドと@Importアノテーションはすべて、指定された1つ以上のプロファイルがアクティブでない限りバイパスされます。これは、Springの動作に非常に似ています。 XML:Bean要素のプロファイル属性が指定された場合、たとえば、プロファイル 'p1'および/または 'p2'がアクティブ化されていない限り、beans要素は解析されません。同様に、@ Componentまたは@Configurationクラスが@Profile({"p1"、 "p2"})でマークされている場合、プロファイル 'p1'および/または 'p2'がアクティブ化されていない限り、そのクラスは登録/処理されません。

そのため、クラスの@Profileアノテーションは、そのすべてのメソッドとインポートに適用されます。クラスではありません。

あなたがしようとしていることは、おそらく同じインターフェースを実装する2つのクラスを持ち、プロファイルに応じてどちらかを注入することで達成できるでしょう。この質問に対する答えを見てください。

異なる環境を処理する注釈駆動の依存性注入

11
Andres

複数の@Beansアノテーションを@Profileで付けたくない将来の読者にとって、これは解決策にもなります。

class MyService {

   @Autowired
   Environment env;

   void run() { 
      if (Arrays.asList(env.getActiveProfiles()).contains("dev")) {
         log();
      }
   }

   void log() {
      //only during dev
   }
}
13
Niels Masdorp

それを追加したかっただけです メソッドレベルの現在のスプリングでこれが可能であると言う答え は明らかに間違っています。一般に、メソッドで@Profileを使用しても機能しません。動作するメソッドは、@ Beanアノテーションが付いた@Configurationクラスのみです。

Spring 4.2.4でクイックテストを実行しましたが、

  • @ConfigurationクラスBean作成メソッドの@Profileが機能する
  • Beanのメソッドの@Profileは機能しません(そして機能するとは期待されていません-ドキュメントは少しあいまいです)
  • クラスレベルの@Profileはif and only if構成クラスでBean定義と同じコンテキストにあるか、context-scanが使用されている場合、
  • env.acceptsProfiles( "profile")、Arrays.asList(env.getActiveProfiles())。contains( "profile")は機能します

テストクラス:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import Java.util.Arrays;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { ProfileTest.ProfileTestConfiguration.class })
@ActiveProfiles("test")
public class ProfileTest {
    static class SomeClass {}
    static class OtherClass {}
    static class ThirdClass {
        @Profile("test")
        public void method() {}
    }
    static class FourthClass {
        @Profile("!test")
        public void method() {}
    }

    static class ProfileTestConfiguration {
        @Bean
        @Profile("test")
        SomeClass someClass() {
            return new SomeClass();
        }
        @Bean
        @Profile("!test")
        OtherClass otherClass() {
            return new OtherClass();
        }
        @Bean
        ThirdClass thirdClass() {
            return new ThirdClass();
        }
        @Bean
        FourthClass fourthClass() {
            return new FourthClass();
        }
    }

    @Autowired
    ApplicationContext context;

    @Test
    public void testProfileAnnotationIncludeClass() {
        context.getBean(SomeClass.class);
    }
    @Test(expected = NoSuchBeanDefinitionException.class)
    public void testProfileAnnotationExcludeClass() {
        context.getBean(OtherClass.class);
    }
    @Test
    public void testProfileAnnotationIncludeMethod() {
        context.getBean(ThirdClass.class).method();
    }
    @Test(expected = Exception.class)  // fails
    public void testProfileAnnotationExcludeMethod() {
        context.getBean(FourthClass.class).method();
    }
}
10
eis

@Profileは、メソッドおよび Javaベースの構成 で使用できます。

例えばPostgreSQL(LocalDateTime)とHSQLDB(2.4.0 Timestampより前)の個別のDBタイムスタンプ:

@Autowired
private Function<LocalDateTime, T> dateTimeExtractor;

@Bean
@Profile("hsqldb")
public Function<LocalDateTime, Timestamp> getTimestamp() {
    return Timestamp::valueOf;
}

@Bean
@Profile("postgres")
public Function<LocalDateTime, LocalDateTime> getLocalDateTime() {
    return dt -> dt;
}

Spring Profilesの例 :3.もご覧ください(メソッドレベルでのSpring @Profileのサンプル)

7
GKislin

4.1で可能

@Profile注釈は、次のいずれかの方法で使用できます。

@Configurationクラスを含む、@ Componentで直接または間接的に注釈が付けられたクラスの型レベルの注釈として。カスタムステレオタイプアノテーションを作成するためのメタアノテーションとして。 任意の@Beanメソッドのメソッドレベルの注釈として

http://docs.spring.io/spring/docs/4.1.x/javadoc-api/org/springframework/context/annotation/Profile.html

7
Jorge Sanchez