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(); } }
2.3 条件装配
定义:在装配bean的前置判断
举例:@Profile @Condition
实现:注解方式、编程方式
注解方式:
@Profile("java7") @Profile("java8")
public interface SumService { /** * 计算多个整的的和 * @param values 多个整数 * @return */ Integer sum(Integer ... values); }
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; } }
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; } }
测试:
@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(); } }
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(); } }
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