7

豆が二つあります。どちらもメール機能を実装しています。1 つは、アプリケーション サーバーにデプロイされている場合にのみ機能します。もう 1 つはテスト用に使用されます。

各開発者と環境のプロファイルがあります。実際にテストするときだけ、テスト Bean を配線したい。テストしていないときは、他の Bean を使用する必要があります。これをアーカイブするにはどうすればよいですか?

@Component
@Profile("localtest")
public class OfflineMail implements Mailing {}

ソリューションのアプローチ:

「デフォルト」を使用してこれをどこかで読みましたが、「dev」のようなプロファイルの「デフォルト」へのフォールバックはないようです:

@Component
@Profile("default")
public class OnlineMail implements Mailing {}

→配線用ビーンが見つからないという例外。

プロファイルを除外する:

@Component
public class OnlineMail implements Mailing {}

-> 「localtest」プロファイルの実行時に固有の例外をスローします。

すべてのプロファイルを追加:

@Component
@Profile("prod")
@Profile("integration")
@Profile("test")
@Profile("dev1")
@Profile("dev2")
@Profile("dev3")
...
public class OnlineMail implements Mailing {}

これは実際に機能していますが、私たちの開発者は「dev<WindowsLogin>」を使用してプロファイルを追加する番号が付けられていません。

@Profile("!localtest") のようなものを使用してもうまくいかないようです。

「特定のBeanが見つからない場合、デフォルトでワイヤー」を取得するより良い方法を知っている人はいますか?

4

3 に答える 3

10

私はついに簡単な解決策を見つけました。

オンラインメールはデフォルトで有線接続されています。

@Component
public class OnlineMail implements Mailing {}

アノテーションを使用すると@Primary、オフラインメールがOnlineMailよりも優先され、一意の例外が回避されます。

@Component
@Profile("localtest")
@Primary
public class OfflineMail implements Mailing {}
于 2013-03-10T11:09:24.100 に答える
2

これを試して:

@Component
@Profile("production")
public class OnlineMail implements Mailing {}

@Component
@Profile("localtest")
public class OfflineMail implements Mailing {}

次に @ActiveProfiles("localtest") を使用してテストを実行し、DEFAULTプロファイルとして「production」を使用して本番環境を実行します。

また、Spring の次のバージョンでSPR-10338ActiveProfilesResolverが導入されることを願っています (「dev1」、「dev2」などを避けるため)。

于 2013-03-05T14:08:35.310 に答える
0

Spring は、@Profile による Bean の注入を非常にうまくサポートします。

interface Talkative {
    String talk();
}

@Component
@Profile("dev")
class Cat implements Talkative {
        public String talk() {
        return "Meow.";
    }
}

@Component
@Profile("prod")
class Dog implements Talkative {
    public String talk() {
        return "Woof!";
    }
}

単体テストで動作

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContex-test.xml"})
@ActiveProfiles(value = "dev")
public class InjectByDevProfileTest
{
    @Autowired
    Talkative talkative;

    @Test
    public void TestTalkative() {
        String result = talkative.talk();
        Assert.assertEquals("Meow.", result);

    }
}

Main() で動作:

@Component public class Main {

        public static void main(String[] args) {
            // Enable a "dev" profile
            System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "dev");
            ApplicationContext context =
                    new ClassPathXmlApplicationContext("applicationContext.xml");
            Main p = context.getBean(Main.class);
            p.start(args);
        }

        @Autowired
        private Talkative talkative;

        private void start(String[] args) {
            System.out.println(talkative.talk());
        }
    }

デモ コードについては、こちらを確認してください: https://github.com/m2land/InjectByProfile

于 2016-05-13T12:52:48.083 に答える