開発中にのみ実行されるいくつかのメソッドを紹介したいと思います。
私はSpring @Profile
注釈はここですか?しかし、特定のプロファイルがプロパティで構成されている場合にのみこのメソッドが呼び出されるように、クラスレベルでこの注釈を適用するにはどうすればよいですか?
spring.profiles.active=dev
以下を擬似コードとして使用します。これをどのように行うことができますか?
class MyService {
void run() {
log();
}
@Profile("dev")
void log() {
//only during dev
}
}
あなたが読むことができる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つのクラスを持ち、プロファイルに応じてどちらかを注入することで達成できるでしょう。この質問に対する答えを見てください。
複数の@Beans
アノテーションを@Profile
で付けたくない将来の読者にとって、これは解決策にもなります。
class MyService {
@Autowired
Environment env;
void run() {
if (Arrays.asList(env.getActiveProfiles()).contains("dev")) {
log();
}
}
void log() {
//only during dev
}
}
それを追加したかっただけです メソッドレベルの現在のスプリングでこれが可能であると言う答え は明らかに間違っています。一般に、メソッドで@Profileを使用しても機能しません。動作するメソッドは、@ Beanアノテーションが付いた@Configurationクラスのみです。
Spring 4.2.4でクイックテストを実行しましたが、
テストクラス:
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();
}
}
@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のサンプル)
4.1で可能
@Profile注釈は、次のいずれかの方法で使用できます。
@Configurationクラスを含む、@ Componentで直接または間接的に注釈が付けられたクラスの型レベルの注釈として。カスタムステレオタイプアノテーションを作成するためのメタアノテーションとして。 任意の@Beanメソッドのメソッドレベルの注釈として