繁体   English   中英

Spring默认配置有Profile

[英]Spring default wiring with Profile

我有两个豆子。 两者都实现了邮件功能。 一个仅在部署到应用程序服务器时才起作用。 另一个用于测试。

我们为每个开发人员和环境提供配置文件 我想在实际测试时才连接测试bean。 不测试时应该使用另一个bean。 我该如何存档?

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

解决方法:

使用“默认”我在某处读到了这个内容,但对于像“dev”这样的配置文件似乎没有回退到“默认”:

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

- >没有找到布线的bean的例外情况。

离开个人资料:

@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>”并添加配置文件,可能适用于一个bean,但是当一个bean使用它时会遇到麻烦,因为这肯定会变得很难看。

使用类似@Profile(“!localtest”)的东西似乎也不行。

有没有人知道更好的方法来获得“如果没有找到特定的bean,默认连线”?

我终于找到了一个简单的方法。

默认情况下,在线邮件刚刚连线。

@Component
public class OnlineMail implements Mailing {}

使用@Primary注释,脱机邮件优先于OnlineMail,并避免使用Unique异常。

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

尝试这个:

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

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

然后使用@ActiveProfiles(“localtest”)运行测试,并使用“production”作为DEFAULT配置文件运行生产环境。

另外我希望在下一版本的Spring ActiveProfilesResolver中引入SPR-10338 - 它可能对你有所帮助(避免“dev1”,“dev2”等)。

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公共类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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM