我正在将Spring REST应用程序迁移到Spring Boot微服务。我有些疑问:
我知道spring boot有一个 var cpaclassids = FetchProductTypes(ids);
var cpaclids = string.Join(",", cpaclassids);
var query = (from x in partJoinTableRepository.GetPartJoinQuery() join y in partRepository.GetPartsQuery() on x.PartId equals y.Id
join z in partProductTypeReposiotry.GetPartProductTypesQuery() on x.PartId equals z.PartId where y.IsSkipped == 0 && (y.IsDisabled != "Y" || y.IsDisabled == null) && z.CreatedDate == x.CreatedDate && x.CreatedDate == Convert.ToDateTime(fromDate) select x).Cast<PartJoinTable>();
var predicate1 = PredicateBuilder.True(query);
predicate1 = predicate1.And(x => cpaclassids.Contains(x.ProductTypeId.ToString()));
int lst = query.Where(predicate1).Select(x => x.PartId).Distinct().ToList().Count();
,它调用SpringApplication中存在的静态main()
。因此,当我们在Eclipse IDE中将其作为“ Java Applicaton”运行时,此run()
被调用,而main()
注释起到了神奇的作用。但是,当我在Websphere Application Server上部署此应用程序时,它如何工作,因为现在不会调用@SpringBootApplication
。然后如何在不调用main()
的情况下加载所有bean。
答案 0 :(得分:2)
Spring Boot隐式启动嵌入式服务器,该服务器包含在spring-boot-starter-tomcat
依赖项中。这就是main()
方法在启动环境中起作用的原因。
典型的解决方案是创建两个配置文件-一个用于启动开发,另一个用于部署-那么您可能有几个起点。
开发配置:
@Configuration
@Profile(Profiles.DEV)
@Import(AppConfig.class)
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class)
.profiles(Profiles.DEV)
.run(args);
}
}
部署配置(用于WAS,tomcat等):
@Configuration
@Profile(Profiles.DEPLOY)
@Import(AppConfig.class)
public class ApplicationTomcat extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application
.profiles(Profiles.DEPLOY)
.sources(ApplicationTomcat.class);
}
}
个人资料:
public class Profiles {
public final static String DEV = "dev";
public final static String DEPLOY = "deploy";
}
在您的部署配置文件中,不要忘记排除spring-boot-starter-tomcat
依赖性并将其与war
捆绑在一起。
通过这种方式,您可以以标准方式在WAS(或tomcat,...)上部署应用程序,也可以使用main()
方法在本地启动应用程序。