spring boot2.0

1. Spring boot 简介

1.1 spring boot的三大特性

  • 组件自动装配:Web mvc, Web Flux,JDBC等

激活:@EnableAutoConfiguration

配置:/META-INF/spring.factories

实现:XXXAutoConfiguration

  • 嵌入式web容器:Tomcat、Jetty以及underTow
  • 生产准备特性

 2.2. 传统Servlet

  • Servlet组件:Servlet、Filter、Listener
  • Servlet注册:Servlet注解、Spring Bean 、Registration Bean 
  • 异步非阻塞:异步Servlet(Servlet3.0)、非阻塞Servlet(Servlet3.1)

 2. 自动装配

  spring模式注解装配:

  • 定义:声明在应用中扮演“组件”角色的注解
  • 举例:@Component  , @Service , @Configuration
  • 装配:<context:component:scan  />  或者 @ComponentScan()

2.1 Spring framework 手动装配自定义注解

  自定义模式注解:注解的‘’派生性、层次性‘’。

/**
 *  Component -> Repository -> FirstLevelRepository (每个注解中都要定义value属性)
 */

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repository
public @interface FirstLevelRepository {

    String value() default "";
}

  使用自定义注解:

@FirstLevelRepository(value = "myRepository")
public class MyRepository {
    public void show(){
        System.out.println("my repository...");
    }
}

  启动测试:

@ComponentScan(basePackages = {"com.vstudy.web.repository"})
public class FirstLevelBootstrap {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(FirstLevelBootstrap.class)
                .web(WebApplicationType.NONE)
                .run(args);
        MyRepository myRepository = (MyRepository) context.getBean("myRepository");
        myRepository.show();
        context.close();
    }
}

2.2 @Enable装配,自动装配相同领域的功能组件集合- - 基于模块注解

  定义:预备相同领域的功能组件集合,组合形成一个独立的单元 

  举例:@EnableWebMvc    @EnableAutoConfiguration等。

  实现:注解方式、变成方式

   

   Enable自动装配

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
//@Import(HelloWorldConfiguration.class)
@Import(HelloWorldImportSelector.class)   // 装入Bean到容器中
public @interface EnableHelloWorld { }

   将Bean放入容器的配置

@Configuration
public class HelloWorldConfiguration {

    @Bean
    public String helloWorld() { // 方法名即 Bean 名称
        return "Hello,World 2018";
    }

}

   启动测试:

@EnableHelloWorld
public class EnableHelloWorldBootstrap {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(EnableHelloWorldBootstrap.class)
                .web(WebApplicationType.NONE)
                .run(args);

        // helloWorld Bean 是否存在
        String helloWorld =
                context.getBean("helloWorld", String.class);
        System.out.println("helloWorld Bean : " + helloWorld);
        // 关闭上下文
        context.close();
    }
}
EnableHelloWorldBootstrap.java

 2.3 条件装配

  定义:在装配bean的前置判断

  举例:@Profile   @Condition

  实现:注解方式、编程方式

 注解方式:

@Profile("java7")   @Profile("java8")

public interface SumService {

    /**
     * 计算多个整的的和
     * @param values  多个整数
     * @return
     */
    Integer sum(Integer ... values);
}
SumService.java

  java7的实现:

@Profile("java7")  // 当jdk环境为java7时,Service注解生效
@Service
public class Java7SumServiceImpl implements SumService {
    @Override
    public Integer sum(Integer... values) {
        System.out.println("java 7的方式实现求和");
        Integer sum = 0;
        for (int i = 0; i < values.length; i++) {
            sum += values[i];
        }
        return sum;
    }
}
Java7SumServiceImpl .java

  java8的实现:

/**
 * Java 7 for循环实现 {@link SumService}
 */

@Profile("java8")  // 当jdk环境为java7时,Service注解生效
@Service
public class Java8SumServiceImpl implements SumService {
    @Override
    public Integer sum(Integer... values) {
        System.out.println("java 8 的方式实现求和");
        Integer sum = Stream.of(values).reduce(0, Integer::sum);

        return sum;
    }
}
Java8SumServiceImpl

  测试:

@SpringBootApplication(scanBasePackages = "com.vstudy.web.service")
public class SumServiceBootstrap {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(SumServiceBootstrap.class)
                .web(WebApplicationType.NONE)
                .profiles("java8")   //这里的profile参数和设定的环境对应
                .run(args);

        // CalculateService Bean 是否存在
        SumService calculateService = context.getBean(SumService.class);

        System.out.println("calculateService.sum(1...10) : " +
                calculateService.sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

        // 关闭上下文
        context.close();
    }
}
SumServiceBootstrap

 2.4 Spring Boot自动装配

  定义: 基于约定大于配置的原则,实现Spring组件自动装配目的

  装配:模式装配、@Enable模块、条件装配、工厂加载机制

  实现:

  • 激活自动装配:@EnableAutoConfiguration
  • 实现自动装配:XxxAutoConfiguration
  • 配置自动装配实现:META-INF/spring.factories

@EnableAutoConfiguration -> spring.factories -> EnableAutoConfiguration -> HelloWorldAutoConfiguration ->

@EnableHelloWord -> HelloWorldConfiguration ->Hello World

1) 激活自动装配

//激活自动装配
@EnableAutoConfiguration
public class EnableAutoConfigBootstrap {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(EnableAutoConfigBootstrap.class)
                .web(WebApplicationType.NONE)
                .run(args);

        // helloWorld Bean 是否存在
        String helloWorld =
                context.getBean("helloWorld", String.class);
        System.out.println("helloWorld Bean : " + helloWorld);
        // 关闭上下文
        context.close();
    }
}
EnableAutoBootstrap.java

2) spring.factories 配置自动装配

# 自动装配
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.vstudy.web.configuration.HelloWorldAutoConfiguration

3)实现自动装配:

@Configuration // Spring 模式注解装配
@EnableHelloWorld // Spring @Enable 模块装配
//@ConditionalOnSystemProperty(name = "user.name", value = "Mercy") // 条件装配
public class HelloWorldAutoConfiguration {
}

 总结:

  • @Configuration类配置方式代替xml配置方式。
  • 注解也层次性和派生性
  • 在注解类(@EnableXxx)上可以使用@Import将配置类(可以不写@Configuration)放入spring容器中,该配置类的配置会生效,@Enable装配的粒度相对于@XxxAutoConfiguration较小
  • 在@XxxAutoConfiguration(模块)上可以使用@EnableXxx完成模式装配,也可以在配置类中配置模块的其他信息。

3 SpringApplication

3.1 SpringApplication运行

SpringApplication.run(DemoApplication.class, args);

end

原文地址:https://www.cnblogs.com/zhuxiang1633/p/10231871.html