我有两个豆子。两者都实现了邮件功能。一个仅在部署到应用程序服务器时才起作用。另一个用于测试。
我们为每个开发人员和环境提供了个人资料。我想在实际测试时才连接测试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>”并添加配置文件,可能适用于一个bean,但是当一个bean用于几个bean时会遇到麻烦,因为这肯定会变得很难看。
使用类似@Profile(“!localtest”)的东西似乎也不行。
如果没有找到特定的bean,有没有人知道更好的方法来获取“连线”?
答案 0 :(得分:8)
我终于找到了一个简单的解决方案。
默认情况下,在线邮件只是连线。
@Component
public class OnlineMail implements Mailing {}
使用@Primary
注释,脱机邮件优先于OnlineMail,并避免使用Unique异常。
@Component
@Profile("localtest")
@Primary
public class OfflineMail implements Mailing {}
答案 1 :(得分:2)
试试这个:
@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”等)。
答案 2 :(得分: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 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());
}
}