springboot环境配置+使用

@SpringBootApplication内部分为三个注解

  • @EnableAutoConfiguration启用Spring Boot的自动配置机制
  • @ComponentScan:对应用程序所在的软件包启用@Component扫描
  • @Configuration:允许在上下文中注册额外的beans或导入其他配置类
  • @Bean向容器中添加实体bean,可以通过@Conditional来添加条件是否添加此bean
  • @Autowired(required = false)注入bean对象,如果没有就会报错,可以添加required=false来设置可以为空


Starters类路径依赖项

Spring Boot提供了一些“Starters”,可让您将jar添加到类路径中。我们的示例应用程序已经在POM的parent部分使用了spring-boot-starter-parent。spring-boot-starter-parent是一个特殊的启动器,提供有用的Maven默认值。它还提供了一个 dependency-management 部分,以便您可以省略version标签中的“祝福”依赖项。


springboot启动方式

 //方式一
    public static void main(String[] args) {
    //这个方法里面首先要创建一个SpringApplication对象实例,然后调用这个创建好的SpringApplication的实例方法
        SpringApplication.run(Application.class, args);
    }
    //方式二
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(MySpringConfiguration.class);
        app.run(args);
    }
    //方式三
    public static void main(String[] args) {
        new SpringApplicationBuilder()
            .sources(Parent.class)
            .child(Application.class)
            .run(args);
    }

SpringApplicationBuilder:链式调用,常见的用例是设置活动配置文件和默认属性以设置应用程序的环境:


外部资源配置

  • 启动程序上面添加
//添加注解
@PropertySource(value= "classpath:properties/config.properties",encoding = "UTF-8",ignoreResourceNotFound = true)

//获取属性
@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...

}



多个环境配置yml文件

//pom文件配置
<profiles>
        <profile>
            <!-- 开发环境 -->
            <id>dev</id>
            <properties>
                <profiles.active>dev</profiles.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <!-- 测试环境 -->
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
            </properties>
        </profile>
        <profile>
            <!-- 生产环境 -->
            <id>pro</id>
            <properties>
                <profiles.active>pro</profiles.active>
            </properties>
        </profile>
    </profiles>  
//环境文件夹要设置为resources类型

加载Yaml文件

  • YamlPropertiesFactoryBean将YML加载为properties
  • YamlMapFactoryBean将Yml加载为Map
  • spring.profiles.active添加加载的配置,可以通过这个设置不同环境加载不同的配置
application-dev.yml
application-pro.yml
srping.profiles.active=dev;
  • YAML列表表示为具有[index]解除引用的属性键
my:
servers:
    - dev.example.com
    - another.example.com
//转换为
my.servers[0]=dev.example.com
my.servers[1]=another.example.com
  • 绑定前面yml中的属性,也可用@Value绑定其中的属性
@ConfigurationProperties(prefix="my")
public class Config {

    private List<String> servers = new ArrayList<String>();

    public List<String> getServers() {
        return this.servers;
    }
}
  • 在单一文件中,可用连续三个连字号(---)区分多个文件另外,还有选择的连续三个点号(...)用来表示文件结尾.
    ==Ymal缺点:无法使用@PropertySource注释加载YAML文件。因此,如果您需要以这种方式加载值,则需要使用属性文件。==

<font color="red"> @ConfigurationProperties与@Value:@Value不支持宽松绑定, @ConfigurationProperties支持多属性pojo绑定</font>


整合logback

添加logback.xml

 <!--设置存储路径变量,./代表相对路径,项目根目录-->
    <property name="LOG_HOME" value="./clientA/log"/>

==只需要改动文件地址,不用导依赖,改配置==


JSON

spring Boot提供三个JSON映射库集成

  • Gson:可以快速的将一个 Json 字符转成一个Java对象,或者将一个 Java 对象转化为Json字符串
//默认不对空属性序列化
private static Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
 /** 对属性值为 null 的字段进行序列化*/
String personStrFinal = new GsonBuilder().serializeNulls().create().toJson(person);
  • Jackson
  • JSON-B
    ==对比:jackson效率更快,Gson功能更多可以做更多的操作,一般使用Gson==


HttpMessageConverter

  • 是用来处理request和response里的数据的。Spring内置了很多
  • AbstractHttpMessageConverter:可以针对某个类进行操作
    ==要求:
    第一个是pom文件中加入jackson的jar包,第二个是在配置文件中加入MappingJackson2HttpMessageConverter==

全局异常处理

@RestControllerAdvice
/*@ControllerAdvice(annotations = {PCInfoController .class}) 配置你需要拦截的控制器,
@ControllerAdvice(basePackages = "com.demo") 配置你需要路径下的控制器*/
public class UserCheckExection {
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Object checkExectionHandler(HttpServletRequest request, MethodArgumentNotValidException exception) {
       List<FieldError> list = new ArrayList();
        FieldError error = (exception.getBindingResult().getFieldErrors()).get(0);
        HashMap<String,Object> map = new HashMap<>();
        map.put("msg",error.getDefaultMessage());
        map.put("code","12306");
        return map;
    }
}




嵌入式Servlet容器

  • tomcat(springboot-web-starter中已经嵌入tomcat)
  • Jetty(使用需要exclusion中排除tomcat)
  • Undertow



访问静态资源并不需要经过控制器

@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    //第一个参数是在访问url中加的路径,第二个参数是资源在目录中的真实路径
       registry.addResourceHandler("/**").addResourceLocations("classpath:/static1/")
       .addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/");
    }
}

==第二个参数格式"classpath:/html/"(代表resources下html目录)也可写成file:/html/这种是媒体资源,链式调用可以写多个资源地址==
<font color="red">springboot默认的拦截器写好了静态资源访问方式,因此在yml里面配置不管用,需要通过WebMvcConfigurer覆盖他的拦截器</font>



配置访问后缀符

//打开后缀匹配开关
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseRegisteredSuffixPatternMatch(true);
    }
//将后缀符匹配到url方法上
    @Bean
    public ServletRegistrationBean servletRegistrationBean(DispatcherServlet dispatcherServlet) {
        ServletRegistrationBean<DispatcherServlet> servletServletRegistrationBean = new ServletRegistrationBean<>(dispatcherServlet);
        servletServletRegistrationBean.addUrlMappings("*.do");
        servletServletRegistrationBean.addUrlMappings("*.html");
        servletServletRegistrationBean.addUrlMappings("*.png");
        servletServletRegistrationBean.addUrlMappings("*.jpg");
        return servletServletRegistrationBean;
    }



配置拦截器、过滤器、监听器

<a href="https://www.cnblogs.com/hhhshct/p/8808115.html">参考配置地址</a>

erueka服务关不掉,删除依赖,注释配置和注解都无效

==删除maven仓库里面的包==


项目启动后自动运行的两个类

  • CommandLineRunner
  • ApplicationRunner
  • ==区别:CommandLineRunner将启动函数传入的参数不封装传入run方法,ApplicationRunner封装了参数在ApplicationArguments类中==
  • 共同点:可以重复创建,需要用线程执行内容,因为他们会影响主线程运行
  • 通过@Order(2)来标准顺序
  • 参数类型String... 可填可不填,数组类型


Apache Solr搜索引擎

Elasticsearch搜索引擎



RabbitMQ是一个基于AMQP协议的轻量级,可靠,可扩展且可移植的消息代理

  • YML配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=secret



REST(包括get、post、delete等请求方式请求)

  • spring内置(REST相较于httpclient代码更简洁,效率待验证)
//配置中加入restTemplate
@Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
//
public Object weather(@ApiParam(value = "语言") @RequestParam(value = "language") String language, @ApiParam(value = "地址") @RequestParam(value = "location") String location) throws URISyntaxException, IOException {
        URI uri = new URIBuilder()
                .setScheme("https").setHost("api.seniverse.com").setPath("/v3/weather/now.json")
                .setParameter("key", "w99tf57ghc86thhv")
                .setParameter("language", language)
                .setParameter("location", location)
                .build();
        return restTemplate.getForObject(uri, Object.class);



JavaMailSender

  • SimpleMailMessage(实例)
  • MimeMailMessage(实例)


JAVA 事务

  • JDBC事务(普通事务)
    1. 数据库事务中的本地事务,通过connection对象控制管理,只支持一个库不能多个库
  • JTA事务
    1. JTA事务比JDBC更强大,支持分布式事务(当然也支持本地事务)包含jdbc、jms等java组件事务回滚
  • 容器管理事务:常见hibnate、spring等容器
  • 编程式事务:通过代码对事务进行控制,粒度更小
  • 声明式事务:xml或注解方式实现,实现建立在aop上,在方法开始前创建一个事务,在执行完目标方法之后检查事务情况再进行提交或回滚
//value可不写
@Transactional(value = "rabbitTxManage", rollbackFor = Exception.class)



Quartz Scheduler

  • JobDetail:定义一个特定的工作。可以使用JobBuilderAPI构建JobDetail个实例
  • Calendar
  • Trigger:定义何时触发特定作业。
  • QuartzJobBean作业类


测试spring-boot-starter-test

  • JUnit:单元测试Java应用程序的事实标准。
  • Spring测试和Spring Boot测试:Spring Boot应用程序的实用程序和集成测试支持。
  • AssertJ:一个流畅的断言库。
  • Hamcrest:匹配器对象库(也称为约束或谓词)。
  • Mockito:一个Java 模拟框架。
  • JSONassert:JSON的断言库。
  • JsonPath:JSON的XPath。
  • ==springboot项目单元测试默认会扫描所有类启动程序,只需添加类就可以不启动程序==

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = DemoApplicationTests.class)


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,728评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,220评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 171,936评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,976评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,981评论 6 399
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,468评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,843评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,817评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,353评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,384评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,510评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,113评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,833评论 3 338
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,290评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,419评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,055评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,577评论 2 365

推荐阅读更多精彩内容