@zero1036
2019-02-01T10:41:17.000000Z
字数 10655
阅读 4663
Java-Spring
如果项目中需要访问资源时,Springboot必须通过插件spring-boot-maven-plugin
运行
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springboot-1</artifactId>
<dependencies>
<!--必要依赖项-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!--以插件spring-boot-maven-plugin启动-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.1.RELEASE</version>
</plugin>
</plugins>
</build>
</project>
项目基础结构如下:
user-service:
user-contract:
com.tg.user.contract: 【contract包】
com.tg.user.contract.User 【Model or Contract类】
user-dao:
com.tg.user.dao: 【dao包】
com.tg.user.dao.mapper.RuleMapper 【Mapper类】
com.tg.user.dao.mapper.RuleDAOImpl 【DAO实现类】
user-api:
com.tg.user: 【api包】
com.tg.user.service.AdminService 【controller or service类】
com.tg.user.Application 【Application入口】
示例代码:
package com.tg.user.dao.mapper
//注意区分@Repository、@Service、@Controller@Component之间的应用场景
@Repository //用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean
public class RuleDAOImpl{
public String getRule(){}
}
package com.tg.user.service
public class AdminService{
@Autowire //自动注入
private RuleDAOImpl ruleDAO;
}
注意事项:
package
包中,否则报错:Annotation-specified bean name 'errorPageFilter' for bean class [org.springframework.boot.web.support.ErrorPageFilter] conflicts with existing, non-compatible bean definition of same name and class
Consider defining a bean of type 'com.tg.user.dao.mapper.RuleDAOImpl' in your configuration
。原理:SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!“Application类”是指SpringBoot项目入口类。这个类的位置很关键:如果Application类所在的包为:com.tg.user,则只会扫描com.tg.user包及其所有子包,如果service或dao所在包不在com.tg.user及其子包下,则不会被扫描!参考:Spring boot中@Autowired注解无法自动注入的错误博文:https://rensanning.iteye.com/blog/2363467
彻底关闭自动装配的方法:spring.boot.enableautoconfiguration=false
类注解 @SpringBootApplication = @EnableAutoConfiguration + @ComponentScan + @Configuration
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
// ...
}
@Configuration
public @interface SpringBootConfiguration {
// ...
}
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
// ...
}
可以执行自动导入配置类:@EnableAutoConfiguration可以通过@Import实现自定义导入
@Configuration
@Import({
DispatcherServletAutoConfiguration.class,
EmbeddedServletContainerAutoConfiguration.class,
ErrorMvcAutoConfiguration.class,
HttpEncodingAutoConfiguration.class,
HttpMessageConvertersAutoConfiguration.class,
JacksonAutoConfiguration.class,
MultipartAutoConfiguration.class,
ServerPropertiesAutoConfiguration.class,
WebMvcAutoConfiguration.class
})
@ComponentScan
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}
配置类也可自行导入
@Configuration
@Import({
DispatcherServletAutoConfiguration.class,
EmbeddedServletContainerAutoConfiguration.class,
ErrorMvcAutoConfiguration.class,
HttpEncodingAutoConfiguration.class,
HttpMessageConvertersAutoConfiguration.class,
JacksonAutoConfiguration.class,
MultipartAutoConfiguration.class,
ServerPropertiesAutoConfiguration.class,
WebMvcAutoConfiguration.class
})
@ComponentScan
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}
编写配置类的方法:举例:WebMvcAutoConfiguration
@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
@Bean
@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new OrderedHiddenHttpMethodFilter();
}
// ...
}
最简单方法,不过要注意以下三点:
1、输入方式不是缺${}
,否则会报错如下:
#Properties Config:
jedis.pool.config.maxTotal=100
#Code:
@Value("jedis.pool.config.maxTotal")
private int maxTotal;
#Error
Error: Unsatisfied dependency expressed through field 'maxTotal'; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "jedis.pool.config.maxTotal"
2、检查Properties配置是否正确,不要忘了要添加到application.properties
#Properties Config:
jedis.pool.config.maxTotal=${jedis.pool.config.maxTotal}
否则报错:
nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'jedis.pool.config.maxTotal' in string value "${jedis.pool.config.maxTotal}"
3、注解变量不要以static与final修饰
SLF4J——Simple Logging Facade For Java,它是一个针对于各类Java日志框架的统一Facade抽象。Java日志框架众多——常用的有java.util.logging, log4j, logback,commons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)。而SLF4J定义了统一的日志抽象接口,而真正的日志实现则是在运行时决定的——它提供了各类日志框架的binding。
Logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J。同时也是Spring Boot自带的日志系统。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<jmxConfigurator/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- 典型的日志pattern -->
<encoder>
<pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="serverAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/server.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 以日期切分日志,同理,可以使用%d{yyyy-MM-dd_HH-mm}来定义精确到分的日志切分方式。 -->
<fileNamePattern>logs/server.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 保留 30天数据,默认无限-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>[%date{ISO8601}] [%X{PtxId}] %logger{80} %thread [%level] - %msg%n</pattern>
</encoder>
</appender>
<!-- 这些日志不要打印debug,不然数量太多 -->
<logger name="org.springframework" level="WARN"/>
<logger name="org.spring" level="WARN"/>
<logger name="io.grpc.netty" level="WARN"/>
<logger name="org.eclipse.jetty" level="WARN"/>
<logger name="jndi" level="WARN"/>
<logger name="redis.clients" level="WARN"/>
<logger name="application" level="WARN"/>
<logger name="org.apache" level="WARN"/>
<!-- root -->
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="serverAppender"/>
</root>
</configuration>
%d{HH:mm:ss.SSS}
——日志输出时间%thread
——输出日志的进程名字,这在Web应用以及异步任务处理中很有用%-5level
——日志级别,并且使用5个字符靠左对齐%logger{36}
——日志输出者的名字%msg
——日志消息%n
——平台的换行符示例日志:
[2017-04-23 16:41:37,178] [INFO] c.w.p.s.r.CodeConsumer SimpleAsyncTaskExecutor-1 - 正在处理发奖确认消息,请求流水号:null;客户Id:148;发奖成功:false
示例:
<configuration>
<jmxConfigurator />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- 典型的日志pattern -->
<encoder>
<pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="serverAppender" class="ch.qos.logback.core.rolling.RollingFileAppender" >
<file>logs/server.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/server.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 保留 30天数据,默认无限-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>[%date{ISO8601}] [%X{PtxId}] %logger{80} %thread appName [%level] - %msg%n</pattern>
</encoder>
</appender>
<!-- 这些日志不要打印debug,不然数量太多 -->
<logger name="org.springframework" level="WARN" />
<logger name="org.spring" level="WARN" />
<logger name="io.grpc.netty" level="WARN" />
<logger name="org.eclipse.jetty" level="WARN" />
<logger name="jndi" level="WARN" />
<logger name="redis.clients" level="WARN" />
<logger name="application" level="WARN" />
<logger name="com.whtr.dolphin.scenter" level="DEBUG"/>
<logger name="io.grpc.internal.SerializingExecutor" level="OFF"/>
<logger name="org.apache" level="WARN" />
<!-- root -->
<root level="INFO">
<appender-ref ref="console" />
<appender-ref ref="serverAppender" />
</root>
</configuration>
<fileNamePattern>
:定义日志文件的划分方式,例:logs/server.%d{yyyy-MM-dd}.log
以日期切分日志,同理,可以使用%d{yyyy-MM-dd_HH-mm}来定义精确到分的日志切分方式。<maxHistory>
:定义数据保留日数,默认为无限Spring boot默认使用jackson序列化与反序列化请求与回复。契约bean可以使用Date类型,并通过@JsonFormat
处理日期格式转换问题。如下:注意需要增加入参timezone=GMT+8设置时区,否则会少两个小时。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
public Date getCreateDate() {
return createDate;
}
通过WebMvcConfigurerAdapter增加授权域名:allowedOrigins()
@Configuration
public class CustomCorsConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
super.addCorsMappings(registry);
registry.addMapping("/redPacketAdminService/active").allowedOrigins("http://almonds-yingxiao-port80-wm-sit.k8s.ppmoney.io");
registry.addMapping("/test/foot").allowedOrigins("http://almonds-yingxiao-port80-wm-sit.k8s.ppmoney.io");
}
}
Spring Boot 推荐的基础 POM 文件
名称 | 说明 |
---|---|
spring-boot-starter | 核心 POM,包含自动配置支持、日志库和对 YAML 配置文件的支持。 |
spring-boot-starter-amqp | 通过 spring-rabbit 支持 AMQP。 |
spring-boot-starter-aop | 包含 spring-aop 和 AspectJ 来支持面向切面编程(AOP)。 |
spring-boot-starter-batch | 支持 Spring Batch,包含 HSQLDB。 |
spring-boot-starter-data-jpa | 包含 spring-data-jpa、spring-orm 和 Hibernate 来支持 JPA。 |
spring-boot-starter-data-mongodb | 包含 spring-data-mongodb 来支持 MongoDB。 |
spring-boot-starter-data-rest | 通过 spring-data-rest-webmvc 支持以 REST 方式暴露 Spring Data 仓库。 |
spring-boot-starter-jdbc | 支持使用 JDBC 访问数据库 |
spring-boot-starter-security | 包含 spring-security |
spring-boot-starter-test | 包含常用的测试所需的依赖,如 JUnit、Hamcrest、Mockito 和 spring-test 等 |
spring-boot-starter-velocity | 支持使用 Velocity 作为模板引擎 |
spring-boot-starter-web | 支持 Web 应用开发,包含 Tomcat 和 spring-mvc |
spring-boot-starter-websocket | 支持使用 Tomcat 开发 WebSocket 应用 |
spring-boot-starter-ws | 支持 Spring Web Services |
spring-boot-starter-actuator | 添加适用于生产环境的功能,如性能指标和监测等功能 |
spring-boot-starter-remote-shell | 添加远程 SSH 支持 |
spring-boot-starter-jetty | 使用 Jetty 而不是默认的 Tomcat 作为应用服务器 |
spring-boot-starter-log4j | 添加 Log4j 的支持 |
spring-boot-starter-logging | 使用 Spring Boot 默认的日志框架 Logback |
spring-boot-starter-tomcat | 使用 Spring Boot 默认的 Tomcat 作为应用服务器 |
参考自:此处输入链接的描述