@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文件配置
dev
dev
true
test
test
pro
pro
//环境文件夹要设置为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 servers = new ArrayList();
public List getServers() {
return this.servers;
}
}
- 在单一文件中,可用连续三个连字号(---)区分多个文件另外,还有选择的连续三个点号(...)用来表示文件结尾.
==Ymal缺点:无法使用@PropertySource注释加载YAML文件。因此,如果您需要以这种方式加载值,则需要使用属性文件。==
@ConfigurationProperties与@Value:@Value不支持宽松绑定, @ConfigurationProperties支持多属性pojo绑定
整合logback
添加logback.xml
==只需要改动文件地址,不用导依赖,改配置==
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 list = new ArrayList();
FieldError error = (exception.getBindingResult().getFieldErrors()).get(0);
HashMap 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/这种是媒体资源,链式调用可以写多个资源地址==
springboot默认的拦截器写好了静态资源访问方式,因此在yml里面配置不管用,需要通过WebMvcConfigurer覆盖他的拦截器
配置访问后缀符
//打开后缀匹配开关
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseRegisteredSuffixPatternMatch(true);
}
//将后缀符匹配到url方法上
@Bean
public ServletRegistrationBean servletRegistrationBean(DispatcherServlet dispatcherServlet) {
ServletRegistrationBean servletServletRegistrationBean = new ServletRegistrationBean<>(dispatcherServlet);
servletServletRegistrationBean.addUrlMappings("*.do");
servletServletRegistrationBean.addUrlMappings("*.html");
servletServletRegistrationBean.addUrlMappings("*.png");
servletServletRegistrationBean.addUrlMappings("*.jpg");
return servletServletRegistrationBean;
}
配置拦截器、过滤器、监听器
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事务(普通事务)
- 数据库事务中的本地事务,通过connection对象控制管理,只支持一个库不能多个库
- JTA事务
- 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)