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来作为基础框架?

  1. SpringCloud关注的是服务治理领域的解决方案,而服务治理是依托于服务架构之上的,它需要一个承载框架。
  2. SpringBoot可以认为它是一套快速配置Spring应用的脚手架,它可以快速开发单个微服务。所以SpringCloud的版本和SpringBoot版本的兼容性存在很大关联。

Spring Boot的特性

  1. 自动装配:EnableAutoConfiguration
  2. 启动依赖:Starter,依赖于自动装配的技术
  3. 监控:Actuator
  4. 命令行操作: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