SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件

环境:

 

从上文找到 maven home对conf/settings.xml中的mirros和profiles进行粘贴


      
        nexus-aliyun
        central
        Nexus aliyun
        http://maven.aliyun.com/nexus/content/groups/public
      
  
 
  
         
              jdk-1.8
              
                true
                1.8
              
              
                1.8
                1.8
                1.8
              
         
  

 Spring家族

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第1张图片

 SpringBoot2基于Spring Framework5,而Spring Framework是基于Java8

 SpringBoot是更高级的应用,整合Spring家族其他成员,简化配置

特点:社区活跃,经常升级

官方文档:Spring Boot   点击GA标记版本的Reference DOC

idea:

  确认maven使用的是自己安装的,如下

注意修改Groupid

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第2张图片创建出来可以运行

 建立主程序类   com.i7i8i9./boot/main/

MainApplication
@SpringBootApplication   //告诉SPringBoot这是一个SpringBoot应用,这是主程序类
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}

 建立一个controller

    

//@ResponseBody   //可以卸载某个方法上,也可以写在类上,代表所有方法均返回字符串写给浏览器而不是跳转页面
//@Controller
@RestController   //以上二者合体
public class HelloConroller {


    @RequestMapping("/hello")
    public String handle01(){
        return "Hello,i7i8i9";
    }
}

强大能力

     springboot整合了其他框架,包括tomcat,所有配置都可以在一个properties中完成

比如修改端口号SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第3张图片

    具体可以配置哪些,参照官方文档

https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

 部署

fat jars Getting Started

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第4张图片

选中clean ,package 点击右侧的执行箭头

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第5张图片

完成后在target中找到

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第6张图片

 复制到一个文件夹,对其执行cmd 之后  java -jar   即可看到网站已经启动

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第7张图片

 注意cmd不要使用快速编辑模式,否则鼠标点一下就会卡住

cmd窗口头部白框右键

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第8张图片

pom说明

     parent是做依赖管理的,声明了是2.3.4.RELEASE,则其它依赖可以不必指定版本


        org.springframework.boot
        spring-boot-starter-parent
        2.3.4.RELEASE
    

点击中间的spring-boot-starter-parent可以进入爷爷项目


  4.0.0
  
    org.springframework.boot
    spring-boot-dependencies
    2.3.4.RELEASE
  
  spring-boot-starter-parent
  pom
  spring-boot

再点击parent中的spring-boot-dependencies,可以进入太爷项目

其中有properties声明了依赖版本


    5.15.13
    2.7.7
    1.9.82
    2.12.0
    1.9.6
    3.16.1
    4.0.6
    4.0.3
    2.1.4
    

比如在pom中配置mysql驱动

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第9张图片

 配置之后点击右侧maven的 刷新,就可以引入新依赖到external lib

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第10张图片

其版本符合太爷归档

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第11张图片

 不想用其裁决的驱动

比如想用mysql5

1)先从太爷拿到当前key

8.0.21

2)来到maven仓库,搜索mysql,找到for java

 想使用

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第12张图片

 3)那么修改pom properties,添加类似太爷key,增加version要求,重新刷新mvn 依赖

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第13张图片

Starters 场景启动器

简化开发

Spring Boot Reference Documentation

Developing with Spring Boot

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第14张图片

 只要引入一个Starter,官方的依赖全部引入

Starter官方命名方式都类似 spring-boot-starter-*

第三方命名就是thirdpartyproject-spring-boot-starter.

引入一个web starter,分析其依赖树

spring-boot-starter-web

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第15张图片

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第16张图片

另外从其太爷中可以看到最基本的依赖

spring-boot-starter

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第17张图片

 自动配置

1)自动配好tomcat

  根据Starter-web场景启动器引入

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第18张图片

 配置tomcat

2)自动配好springmvc

  根据Starter-web场景启动器引入

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第19张图片

 自动配好SpringMvc常用组件

3)自动配好web常见功能,如字符编码拦截器

    比如:dispatcherServlet   characterEncodingFilter保证返回中文不乱码

文件上传解析器multipartResolver

   在main中验证

public class MainApplication {
    public static void main(String[] args) {
         //返回IOC容器
        ConfigurableApplicationContext applicationContext= SpringApplication.run(MainApplication.class,args);
        //查看容器中的组件
       String[] names= applicationContext.getBeanDefinitionNames();
        for (String name:names) {
            System.out.println(name);
        }
    }
}

运行会输出

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainApplication
org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory
helloConroller
org.springframework.boot.autoconfigure.AutoConfigurationPackages
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
propertySourcesPlaceholderConfigurer
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration$TomcatWebSocketConfiguration
websocketServletWebServerCustomizer
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat
tomcatServletWebServerFactory
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
servletWebServerFactoryCustomizer
tomcatServletWebServerFactoryCustomizer
org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor
org.springframework.boot.context.internalConfigurationPropertiesBinderFactory
org.springframework.boot.context.internalConfigurationPropertiesBinder
org.springframework.boot.context.properties.BoundConfigurationProperties
org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata
server-org.springframework.boot.autoconfigure.web.ServerProperties
webServerFactoryCustomizerBeanPostProcessor
errorPageRegistrarBeanPostProcessor
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletConfiguration
dispatcherServlet
spring.mvc-org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletRegistrationConfiguration
dispatcherServletRegistration
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration
taskExecutorBuilder
applicationTaskExecutor
spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration
error
beanNameViewResolver
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$DefaultErrorViewResolverConfiguration
conventionErrorViewResolver
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
errorAttributes
basicErrorController
errorPageCustomizer
preserveErrorControllerTargetClassPostProcessor
spring.resources-org.springframework.boot.autoconfigure.web.ResourceProperties
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration
requestMappingHandlerAdapter
requestMappingHandlerMapping
welcomePageHandlerMapping
mvcConversionService
mvcValidator
mvcContentNegotiationManager
mvcPathMatcher
mvcUrlPathHelper
viewControllerHandlerMapping
beanNameHandlerMapping
routerFunctionMapping
resourceHandlerMapping
mvcResourceUrlProvider
defaultServletHandlerMapping
handlerFunctionAdapter
mvcUriComponentsContributor
httpRequestHandlerAdapter
simpleControllerHandlerAdapter
handlerExceptionResolver
mvcViewResolver
mvcHandlerMappingIntrospector
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter
defaultViewResolver
viewResolver
requestContextFilter
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
formContentFilter
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration
mbeanExporter
objectNamingStrategy
mbeanServer
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration
springApplicationAdminRegistrar
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration
org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration
applicationAvailability
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration
lifecycleProcessor
spring.lifecycle-org.springframework.boot.autoconfigure.context.LifecycleProperties
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$Jackson2ObjectMapperBuilderCustomizerConfiguration
standardJacksonObjectMapperBuilderCustomizer
spring.jackson-org.springframework.boot.autoconfigure.jackson.JacksonProperties
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration
jacksonObjectMapperBuilder
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$ParameterNamesModuleConfiguration
parameterNamesModule
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperConfiguration
jacksonObjectMapper
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
jsonComponentModule
org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration$StringHttpMessageConverterConfiguration
stringHttpMessageConverter
org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration
mappingJackson2HttpMessageConverter
org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration
org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration
messageConverters
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration
spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties
org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration
taskSchedulerBuilder
spring.task.scheduling-org.springframework.boot.autoconfigure.task.TaskSchedulingProperties
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration
restTemplateBuilder
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration$TomcatWebServerFactoryCustomizerConfiguration
tomcatWebServerFactoryCustomizer
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
characterEncodingFilter
localeCharsetMappingsCustomizer
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
multipartConfigElement
multipartResolver
spring.servlet.multipart-org.springframework.boot.autoconfigure.web.servlet.MultipartProperties
org.springframework.aop.config.internalAutoProxyCreator

4)默认的包结构

   主程序所在的包及其下面的所有子包里面的组件都会被默认扫描进来

但是其主程序所在包外面的包不会被扫描,也就是注解无效

如果一定要用则给主程序增加扫描注解 ,扩大扫描范围

@SpringBootApplication(scanBasePackages = "com.i7i8i9") 

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第20张图片

或者用@ComponentScan指定也可以:

经分析得出@SpringBootApplication是由三个注解合成

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第21张图片

 可以把这三个一起复制到主程序

 SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第22张图片

5)各种配置拥有默认值

  比如上传文件大小默认为1M

  SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第23张图片

 这些参数最终都映射到到了java类

 进一步在console也可以找到这个类

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第24张图片

 所以配置文件中的值最终绑定在某个类上,而这个类会在springboot主程序所创建的IOC容器中创建对象

6)按需加载所有配置项

 全部配置集中在

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第25张图片

 上层依赖

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第26张图片

 在其里面有

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第27张图片


  org.springframework.boot
  spring-boot-autoconfigure
  2.3.4.RELEASE
  compile

注解

   增加config文件夹,在其下建立配置类

在配置类中,通过在方法上标注@Bean 给容器注册组件,默认单实例

@Configuration  //告诉Springboot这是一个配置类,等同于以前的xml
public class Myconfig {
    @Bean
    public User baby(){//给容器中添加组件,以方法名作为组件id,返回类型就是组件类型,返回的值就是组件在容器中的实例
        return new User("a",12);

    }
    @Bean
    public Pet tom01(){
        return new Pet("jack");

    }
}

再次运行本项目,执行后可以在输出中看到,这些注释生效了,生成了对象实例

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第28张图片

1)通过配置生成的是唯一的对象

Pet ak01=applicationContext.getBean("tom01", Pet.class);
Pet ak02=applicationContext.getBean("tom01", Pet.class);
System.out.println("组件"+(ak02==ak01));

true

2)配置类本身也是组件

Myconfig helloConfig=applicationContext.getBean(Myconfig.class);
System.out.println(helloConfig);

输出

组件true
com.i7i8i9.boot.config.Myconfig$$EnhancerBySpringCGLIB$$52ab910e@78d39a69
 

3)代理默认为true

通过点击@configurtaion可以看到

boolean proxyBeanMethods() default true;

等价于

@Configuration(proxyBeanMethods=true)

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第29张图片

 为true就是 Full模式

为false就是lite模式

主要用于组件依赖

举例:

User打算养宠物

    

public class User {
    private  String name;
    private  Integer age;
    private Pet pet;

    public Pet getPet() {
        return pet;
    }

    public void setPet(Pet pet) {
        this.pet = pet;
    }

修改配置类

@Configuration(proxyBeanMethods=true)  //告诉Springboot这是一个配置类,等同于以前的xml
public class Myconfig {
    @Bean
    public User baby(){//给容器中添加组件,以方法名作为组件id,返回类型就是组件类型,返回的值就是组件在容器中的实例
       User zs=new User("xx",22)
               zs.setPet(tom01());
        return zs;

    }
    @Bean
    public Pet tom01(){
        return new Pet("jack");

    }
}
public class MainApplication {
    public static void main(String[] args) {
         //返回IOC容器
        ConfigurableApplicationContext applicationContext= SpringApplication.run(MainApplication.class,args);
        //查看容器中的组件
       String[] names= applicationContext.getBeanDefinitionNames();
        for (String name:names) {
            System.out.println(name);
        }

        Pet ak01=applicationContext.getBean("tom01", Pet.class);
        Pet ak02=applicationContext.getBean("tom01", Pet.class);
        System.out.println("组件"+(ak02==ak01));
        Myconfig helloConfig=applicationContext.getBean(Myconfig.class);
        System.out.println(helloConfig);
        Pet pet1=helloConfig.tom01();
        Pet pet2=helloConfig.tom01();
        User usr=helloConfig.baby();
        System.out.println("组件"+(pet1==pet2));
        //因为usr里面有个pet属性,也就是依赖于pet,如果代理设置为ture,则user创建pet时会先在spring容器中查找是否存在
        //存在就不单独创建,这是真正的依赖
        System.out.println(usr.getPet()==pet1);
    }
}

果设置为false,则baby创建pet时不会去容器中检查,也就是实际上没有形成依赖,

优点是启动速度快些

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第30张图片

新注解1   @Import ()

   给容器中自动创建引入class的对象,本质是调用其无参构造器,注意这不是通过

applicationContext.getBean得来的,所以与其生成不同的对象

比如在配置文件中写

@Import({HelloConroller.class, DBHelper.class}),默认组件名字就是全类名
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods=false)  //告诉Springboot这是一个配置类,等同于以前的xml
public class Myconfig {
    @Bean
    public User baby(){//给容器中添加组件,以方法名作为组件id,返回类型就是组件类型,返回的值就是组件在容器中的实例
       User zs=new User("xx",22);
               zs.setPet(tom01());
        return zs;

    }
    @Bean
    public Pet tom01(){
        return new Pet("jack");

    }
}

 让主程序输出结果

public class MainApplication {
    public static void main(String[] args) {
         //返回IOC容器
        ConfigurableApplicationContext applicationContext= SpringApplication.run(MainApplication.class,args);
        //查看容器中的组件
       String[] names= applicationContext.getBeanDefinitionNames();
        for (String name:names) {
            System.out.println(name);
        }

        Pet ak01=applicationContext.getBean("tom01", Pet.class);
        Pet ak02=applicationContext.getBean("tom01", Pet.class);
        System.out.println("组件"+(ak02==ak01));
        Myconfig helloConfig=applicationContext.getBean(Myconfig.class);
        System.out.println(helloConfig);
        Pet pet1=helloConfig.tom01();
        Pet pet2=helloConfig.tom01();
        User usr=helloConfig.baby();
        System.out.println("组件"+(pet1==pet2));
        //因为usr里面有个pet属性,也就是依赖于pet,如果代理设置为ture,则user创建pet时会先在spring容器中查找是否存在
        //存在就不单独创建,这是真正的依赖
        System.out.println(usr.getPet()==pet1);
        String[] beanNamesForTypes=applicationContext.getBeanNamesForType(User.class);
        System.out.println("==================");
        for (String s:beanNamesForTypes
             ) {
            System.out.println(s);
        }
    }
}

最后输出:

==================
com.i7i8i9.boot.bean.User
baby

可见User.class的对象有两个,一个是getBean得来的,一个是Import得来的 

新注解2

条件装配 ,满足条件时才会注入相应的组件

搜索到该类

 

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第31张图片

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第32张图片

选中Conditional  按下cirl+H 

SpringBoot2-从环境,properties文件,fat jar,包结构,单实例,注解@import 创建对象,@Conditional @ImportResource兼容XML文件_第33张图片

比如On代表有,missing代表没有 

举例 @ConditionalOnBean(name ="tom01") //表示如果没有tome01这个依赖,那么也不需要生成baby

甚至可以给它标记在类上,则没有它,类中对象都不生成


public class Myconfig {
    @ConditionalOnBean(name ="tom01") //表示如果没有tome01这个依赖,那么也不需要生成baby
    @Bean
    public User baby(){//给容器中添加组件,以方法名作为组件id,返回类型就是组件类型,返回的值就是组件在容器中的实例
       User zs=new User("xx",22);
               zs.setPet(tom01());
        return zs;

    }
   // @Bean
    public Pet tom01(){  //或生成名称为tom01的组件
        return new Pet("jack");

    }
}

   boolean tom=applicationContext.containsBean("tom");//false
        System.out.println("tom="+tom);  
        boolean u=applicationContext.containsBean("baby");//没有conditional就是true,有了就是false
        System.out.println("user="+u);

新注解3ImportResource

   表示在配置类中导入类似bean1.xml文件,以避免逐个去重写

@ImportResource("classpath:beans.xml")

注意XML文件存放地址,跟Spring不同,否则会报

Caused by: java.io.FileNotFoundException: class path resource [bean2.xml] cannot be opened because it does not exist

 

  

验证 结果为true

 boolean dog= applicationContext.containsBean("dog");
        System.out.println("dog"+dog);

你可能感兴趣的:(java,spring,分布式)