@zero1036
2019-02-01T02:41:17.000000Z
字数 10655
阅读 4908
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 Beanpublic class RuleDAOImpl{public String getRule(){}}
package com.tg.user.servicepublic 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 classConsider 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 {// ...}@Configurationpublic @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})@ComponentScanpublic 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})@ComponentScanpublic 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;#ErrorError: 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()
@Configurationpublic class CustomCorsConfiguration extends WebMvcConfigurerAdapter {@Overridepublic 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 作为应用服务器 |
参考自:此处输入链接的描述