Spring Boot的前世今生
- Spring的特点
- 使用SpringMVC构建一个Web项目
- 什么是Spring Boot
- Spring Boot的特性
- Spring注解的发展过程
- Spring 1.x
- Spring 2.x
- Spring3.x(里程碑)
- Spring4.x(完善)
- Spring5.x(优化)
Spring的特点
Spring的核心模块有:核心容器(Spring Core)、应用上下文(Spring Context)、面向切面编程(Spring AOP) JDBC和DAO模块(Spring DAO)、对象实体映射(Spring ORM)、WEB、MVC。
除了以上和核心模块,Sping可以集成其他模块或插件,但是集成其他模块或插件时会引入复杂的配置,如何将配置轻量化,是Spring Boot诞生的基础。
使用SpringMVC构建一个Web项目
在没有SpringBoot的情况下,创建一个Web程序需要有以下步骤:
- 创建一个项目结构(maven/gradle)
- 引入依赖,spring mvc、servlet api等
- 配置web.xml, DispatcherServlet
- 启动SpringMVC的配置:Dispatcher-servlet.xml
- 创建一个controller用来发布请求
- 发布到jsp/servlet容器
其中创建controller是我们最为关心的事情。而在SpringBoot中,创建完项目后,只需要关注业务代码的编写即可,其他的工作有SpringBoot代替完成。
什么是Spring Boot
SpringBoot是约定由于配置理念下的一个产物。例如:
- 只要依赖spring-boot-starter-web, 就会自动内置一个Tomcat容器。
- 默认项目结构
- 默认提供了配置文件application.properties
- starter启动依赖,如果是一个webstarter默认去构造一个SpringMVC应用。
#Spring Boot和微服务
为什么SpringCloud会采用SpringBoot来作为基础框架?
- SpringCloud关注的是服务治理领域的解决方案,而服务治理是依托于服务架构之上的,它需要一个承载框架。
- SpringBoot可以认为它是一套快速配置Spring应用的脚手架,它可以快速开发单个微服务。所以SpringCloud的版本和SpringBoot版本的兼容性存在很大关联。
Spring Boot的特性
- 自动装配:EnableAutoConfiguration
- 启动依赖:Starter,依赖于自动装配的技术
- 监控:Actuator
- 命令行操作:CLI
Spring注解的发展过程
为了彻底理解SpringBoot的自动装配过程,必须先了解Spring注解驱动的发展过程。
Spring 1.x
在SpringFramework1.x时代,Java5刚发布,业界兴起了使用Annotation的技术封,SpringFramework提供了@Transactional等注解,但是XML的配置是唯一选择。
<bean name="" class="">
Spring 2.x
SpringFramework2.x时代,Annotation中添加了@Required、@Repository以及AOP相关的@Aspect等注解,同时也提升了XML配置能力,也就是可扩展的XML。
2.5版本是一代的分水岭,它引入了核心的Annotation
- @Autowired:依赖注入
- @Qualifier:依赖查找
- @Component、@Service组件声明
- @Controller、@RequestMapping等SpringMVC的注解
尽管Spring2.x时代提供了不少的注解,但是仍然没友脱离XML配置驱动,例如:context:annotation-config、context:componet-scan,前者的职责是注册Annotation处理器,后者是负责扫描classpath下指定包路径下被Spring模式直接类标注的类,将他们注册称为Spring Bean
Spring3.x(里程碑)
SpringFramework3.x时代是一个里程碑式的时代,它的功能特性开始出现了非常大的扩展,比如全面拥抱Java5以及Spring Annotation。更重要的是提供了配置类的注解@Configuration,它出现的首要任务就是取代XML配置方式。
- @Configuration(去XML化),核心目的:把Bean对象如何更加便捷的方式去加载到SpringIOC容器中。
- @Component-Scan、@Service、@Repository、@Controller
- @Import
- @Enable(模块驱动)
public class TaskService {
@Scheduled(fixedRate = 3000)
public void reportCurrentTime(){
System.out.println("current Time: " + new Date());
}
}
@ComponentScan
@Configuration
@EnableScheduling
public class TaskConfiguration {
@Bean
public TaskService taskService(){
return new TaskService();
}
}
public class TaskMain {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(TaskConfiguration.class);
}
}
上述代码实例中使用模板驱动@EnableScheduing启动schedule模块,将相关组件的Bean自动装配到IOC容器中。其源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(SchedulingConfiguration.class)
@Documented
public @interface EnableScheduling {
}
@Configuration
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public class SchedulingConfiguration {
@Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() {
return new ScheduledAnnotationBeanPostProcessor();
}
}
Spring4.x(完善)
- @Condition(条件配置)
@Configuration
public class SpringConfiguration {
/**
* 在某个环境下不装在
* 或者不满足某个条件的时候,不装在
* 或者,如果已经装载过了,就不重复装载
* 。。。
* @return
*/
@Conditional(GpCondition.class)
@Bean
public DemoService demoService(){
return new DemoService();
}
}
public class GpCondition implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//TODO
if(1==1){
return true;
}else {
return false;
}
}
}
public class ConditionMain {
public static void main(String[] args) {
ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfiguration.class);
System.out.println(context.getBean(DemoService.class));
}
}
Spring5.x(优化)
- @Indexed