docs.spring.io/spring/docs…html
官方文档 😃😃😃😃😃😃😃java
@Component
@Configuration
复制代码
@Repository
复制代码
@Service
复制代码
1. @Controller
2. @RestController = @Controller + @ResponseBody
3. 通知类,切面编程,其实就是给@RequestMapping 上加了多元注解,
@ControllerAdvice(assignableTypes = {MyController.class})
内部经常使用注解
3.1 @ExceptionHandler({Throwable.class})
@ExceptionHandler({Throwable.class})
public ResponseEntity<String> res(Throwable throwable){
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(throwable.getMessage());
}
3.2 @ModelAttribute("acceptLanguage")
@ModelAttribute
public void addAttribute(Model model) {
model.addAttribute("attribute", "The Attribute");
}
3.3 @CookieValue
3.4 @InitBinder : 应用到全部@RequestMapping注解方法,在其执行以前初始化数据绑定器 ,好比:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
}
3.5 @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 返回状态
4. @RequestMapping
5. ResponseEntity 对象
复制代码
@Data
@ConfigurationProperties(prefix = "anthony")
public class MyProperties {
@value(${"anthony.name"})
String name;
String age;
String info;
//在对象初始化以后立 马执行
@PostConstruct
public void doFirst() {
System.out.println("name = " + name);
System.out.println("age = " + age);
System.out.println("info = " + info);
this.info = "modify";
}
}
// 若是不用EnableConfigurationProperties 须要将MyProperties加上一个@Configuration最好
@EnableConfigurationProperties(MyProperties.class)
@RestController
public class MyController {
@Autowired
MyProperties properties;
}
复制代码
@RunWith(SpringRunner.class)
@SpringBootTest
class SpringValidatorApplicationTests {
@Test
@After
@Before
public void test(){
}
}
复制代码
@Data
public class MYData {
@NotNull(message = "状态不能为空")
@Min(value = 18,groups = Adult.class)
@PositiveOrZero(message = "正数或者0")
private Integer age;
public interface Adult{}
public interface Minor{}
}
@RequestMapping("/live")
public String live(@Validated({MYData.Adult.class}) MYData foo, BindingResult bindingResult) {
if(bindingResult.hasErrors()){
for (FieldError fieldError : bindingResult.getFieldErrors()) {
//...
}
return "fail";
}
return "success";
}
@NotBlank
@NotEmpty
@NotNull(message = "状态不能为空")
@Min(value = 18,message = "错了")
@PositiveOrZero(message = "正数或者0")
@Validated({MYData.Adult.class}) 只会对 groups标记的作校验 其余不会进行 ,因此要么你注意一点
@Valid 不能够进行分组检测
BindingResult 能够获取失败结果
复制代码
1. 自定义log注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
String value() default "";
}
2. 自定义 log aop 类
@Aspect
@Component
public class LogAspect {
private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);
// 能够将 加上 @log 注解的类 环绕通知
@Pointcut("@annotation(com.spring.springvalidator.aop.Log)")
public void logPointCut() {
}
//环绕通知
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
Object result =null;
try {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
logger.info("doBefore : 请求地址 : " + request.getRequestURL().toString());
logger.info("doBefore : HTTP METHOD : " + request.getMethod());
logger.info("doBefore : CLASS_METHOD : " + point.getSignature().getDeclaringTypeName() + "."
+ point.getSignature().getName());
// 执行方法
result = point.proceed();
logger.info("doBefore : 方法参数 : " + Arrays.toString(point.getArgs()));
logger.info("doBefore : 方法返回值 : " + result);
logger.info("doAfterReturning");
return result;
} catch (Exception e) {
logger.error("doAfterThrowing : {} ", e.getMessage());
throw new RuntimeException("runtime exception");
} finally {
logger.info("doAfter");
}
}
复制代码
@Aspect
@Component
public class WebLogAspect2 {
private static final Logger logger = LoggerFactory.getLogger(WebLogAspect2.class);
//切点
//两个..表明全部子目录,最后括号里的两个..表明全部参数
@Pointcut("execution( * com.spring.springvalidator.web.*.*(..))")
public void logPointCut() {
}
//前置通知
@Before("logPointCut()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
logger.info("doBefore");
}
// 成功返回
@AfterReturning("logPointCut()")
public void doAfterReturning(JoinPoint joinPoint){
logger.info("doAfterReturning");
}
// 失败返回
@AfterThrowing("logPointCut()")
public void doAfterThrowing(JoinPoint joinPoint){
logger.info("doAfterThrowing");
}
//前置通知
@After("logPointCut()")
public void doAfter(JoinPoint joinPoint){
logger.info("doAfter");
}
}
执行顺序 通常是 :
doBefore do(controller) doAfter doAfterReturning\doAfterThrowing 或者 环绕通知, @Around("logPointCut()") public Object aroundLog(ProceedingJoinPoint pjp) {
Object reValue = null;
try {
// 请求参数 :
Object[] args = pjp.getArgs();
logger.info("doBefore");
reValue = pjp.proceed(args);
logger.info("成功返回值 : {} ", reValue);
logger.info("doAfterReturning");
return reValue;
} catch (Throwable throwable) {
logger.info("doAfterThrowing");
throw new RuntimeException(throwable);
} finally {
logger.info("doAfter");
}
}
doBefore doAfterReturning/doAfterThrowing doAfter
复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
/** * 添加拦截器 * @param registry */
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 设置
System.out.println("前置拦截1");
return true;
}
});
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 设置
System.out.println(handler);
System.out.println("前置拦截2");
response.setStatus(400);
return false;
}
});
}
}
复制代码