1 @RequestMapping("/login") 2 @ResponseBody 3 public User login(User user){ 4 return user; 5 }
1 '{"userName":"xxx","pwd":"xxx"}'
1 @RequestMapping("/login") 2 public void login(User user, HttpServletResponse response){ 3 response.getWriter.write(JSONObject.fromObject(user).toString()); 4 }
1 @PostMapping(value = "/log/runtime/info") 2 public CommonResponse getMesosClusterInfo(@RequestBody QueryLogRequest request) throws BearException { 3 CommonResponse commonResponse = new CommonResponse(); 4 commonResponse.setData(request); 5 return commonResponse; 6 }
1 <servlet> 2 <servlet-name>servletName</servlet-name> 3 <servlet-class>ServletClass</servlet-class> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>serveltName</servlet-name> 7 <url-pattern>url</url-pattern> 8 </servlet-mapping>
1 /** 2 * EntityManager profile. 3 */ 4 @Primary 5 @Bean(name = "entityManagerPrimary") 6 public EntityManager entityManager(EntityManagerFactoryBuilder builder) { 7 return entityManagerFactoryPrimary(builder).getObject().createEntityManager(); 8 }
使用场景:若是在@Autowired自动注入时有多个候选实现类的Bean,能够经过@Qualifier在自动注入的地方传入一个限定名(也就是类的别名)来选取指定的实现类,此时自动注入的策略就从 byType 转变成 byName,一样在JPA的多数源实现中也使用到了@Qualifier。html
1 @Configuration 2 public class DataSourceConfig { 3 @Bean(name = "primaryDataSource") 4 @Qualifier("primaryDataSource") 5 @Primary 6 @ConfigurationProperties(prefix = "spring.datasource.primary") 7 public DataSource primaryDataSource() { 8 return DataSourceBuilder.create().build(); 9 } 10 11 @Bean(name = "secondaryDataSource") 12 @Qualifier("secondaryDataSource") 13 @ConfigurationProperties(prefix = "spring.datasource.secondary") 14 public DataSource secondaryDataSource() { 15 return DataSourceBuilder.create().build(); 16 } 17 }
⚠️注意:lombok中的@Builder注解默认生成的构造器是“default”的,能够被同package的类调用(default限制不一样package类的调用),而咱们但愿构造器设为private,此时须要用到“@AllArgsConstructor(access = AccessLevel.PRIVATE)”。因此最终写法:java
1 @Builder 2 @AllArgsConstructor(access = AccessLevel.PRIVATE)
springboot默认是logback日志,初始构建日志有颜色,但因为某种操做以后颜色消失了,一种解决方法是在相应目录resource下增长logback.xml,以下:git
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!-- Logback configuration. See http://logback.qos.ch/manual/index.html --> 4 <configuration scan="true" scanPeriod="10 seconds"> 5 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 6 <encoder> 7 <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 : 8 |%blue(%thread) 线程 如 :DiscoveryClient-CacheRefreshExecutor-0--> 9 <pattern>%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%green(%logger:%line) |%black(%msg%n)</pattern> 10 </encoder> 11 </appender> 12 13 <!-- 日志输出级别 --> 14 <root level="INFO"> 15 <appender-ref ref="STDOUT" /> 16 </root> 17 </configuration>
效果以下:github
若是采用log4j日志打印,可使用log4j.properties文件配置,该文件默认从resources目录下读取,好比:web
1 #设置日志打印级别 2 log4j.rootLogger = INFO, FILE 3 4 log4j.appender.FILE=org.apache.log4j.RollingFileAppender 5 #设置日志存放位置 6 log4j.appender.FILE.File=/home/log/report-start.log 7 #每一个日志达到100MB时切块 8 log4j.appender.FILE.MaxFileSize=100MB 9 #保存10个备份日志文件 10 log4j.appender.FILE.MaxBackupIndex=10 11 log4j.appender.FILE.Append=true 12 log4j.appender.FILE.Threshold=INFO 13 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 14 log4j.appender.FILE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p %-60c %x - %m%n
Repository层里定义该方法:spring
@Transactional
@Modifying
@Query(value = "truncate table t",nativeQuery = true)
public void truncateTable(); 数据库
@Transactional和@Modifying很重要apache
今天看大佬代码,发现个很好玩的东西,他用切面作url的访问量和时长统计,这么棒的小例子收了,若是有侵权立刻删除哈😂。json
1 // 实体类,存数据库 2 @Data 3 @Entity 4 @AllArgsConstructor 5 @NoArgsConstructor 6 @Accessors(chain = true) 7 @Table(name = "user_action") 8 @EntityListeners(AuditingEntityListener.class) 9 public class UserActionEntity { 10 @Id 11 @GeneratedValue 12 private Long id; 13 14 @Column 15 private String email; 16 17 @Column 18 private String uri; 19 20 @Column 21 private Long duration; 22 23 @Column 24 @CreatedDate 25 private Date date; 26 27 @Column 28 private String ip; 29 30 @Column 31 private String action; 32 }
再写注解
1 @Inherited 2 @Documented 3 @Target({ElementType.METHOD}) 4 @Retention(RetentionPolicy.RUNTIME) 5 public @interface UserAction { 6 String value(); 7 }
而后在访问以前设置start-time,访问以后统计时长
1 @Aspect 2 @Component 3 @Order(4) 4 public class UserActionAspect { 5 private final UserActionDao userStatisticDao; 6 private static final String START_TIME = "startTime"; 7 8 @Autowired 9 public UserActionAspect(UserActionDao userStatisticDao) { 10 this.userStatisticDao = userStatisticDao; 11 } 12 13 @Pointcut(value = "@annotation(yidian.data.bear.annotation.UserAction)") 14 public void userActionAspect() { 15 //fix the target 16 } 17 18 @Before("userActionAspect()") 19 public void doBefore(JoinPoint joinPoint) { 20 Signature signature = joinPoint.getSignature(); 21 Method method = ((MethodSignature) signature).getMethod(); 22 UserAction annotation = method.getAnnotation(UserAction.class); 23 if (null == annotation) { 24 return; 25 } 26 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder 27 .getRequestAttributes()).getRequest(); 28 request.setAttribute(START_TIME, Instant.now()); 29 } 30 31 @AfterReturning(pointcut = "userActionAspect()") 32 public void doAfterReturning(JoinPoint joinPoint) { 33 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder 34 .getRequestAttributes()).getRequest(); 35 Instant endTime = Instant.now(); 36 Instant startTime = (Instant) request.getAttribute(START_TIME); 37 long duration = endTime.toEpochMilli() - startTime.toEpochMilli(); 38 String ip = request.getRemoteAddr(); 39 String uri = request.getRequestURI(); 40 String email = request.getHeader("email"); 41 Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); 42 String action = method.getAnnotation(UserAction.class).value(); 43 UserActionEntity userAction = new UserActionEntity(); 44 userAction.setUri(uri).setDuration(duration).setEmail(email).setAction(action).setIp(ip); 45 userStatisticDao.save(userAction); 46 } 47 }
最后在ctroller里边方法上加注解就欧了
1 @UserAction(value = "xxx")