• 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

  • 相关阅读:
    统计单词数 OpenJ_Bailian
    整数划分 NBUT
    高精度(x ,/, +, -, %)良心模板
    binary-tree-maximum-path-sum
    2080 特殊的质数肋骨 USACO (深度优先搜索)
    1413 权势二进制
    POJ 1258
    poj 3126
    hdu 1195
    POJ 3752
  • 原文地址:https://www.cnblogs.com/zhuxiang1633/p/10231871.html
Copyright © 2020-2023  润新知