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")