import java.lang.annotation.Annotation;
public class Test {
public static void main(String[] args) {
// 反射
for(Annotation a:TestController.class.getAnnotations()){
System.out.println(a);
}
}
}
Ⅲ、取注解里的属性值
注解:MyAnnotation.java
String message() default “aaa”;
拿值:
package com.lv.controller;
import com.lv.annotation.MyAnnotation;
import java.lang.annotation.Annotation;
public class Test {
public static void main(String\[\] args) {
// 反射
for(Annotation a:TestController.class.getAnnotations()){
if(a instanceof MyAnnotation){
System.out.println(((MyAnnotation) a).message());
}
}
}
}
Ⅳ、判断在该类有无该注解
测试:
package com.lv.controller;
import com.lv.annotation.MyAnnotation;
import java.lang.annotation.Annotation;
public class Test {
public static void main(String[] args) {
// 直接将MyAnnotation这注解取出
MyAnnotation myAnnotation=TestController.class.getAnnotation(MyAnnotation.class);
if(myAnnotation !=null){
System.out.println(myAnnotation.message());
}
}
}
三、完成切面日志操作
当我们在写增删改的时候,会有很多冗余的代码,后期修改很麻烦,如:
@RequestMapping(“/add”)
public String add(){
System.out.println(“xxx在增加”);
System.out.println(“增加成功”);
return “yes”;
}
我们就可以定义aop面向切面,将前面那部分放入前置通知,后面一部分后置通知
新建切面:LogAop.java
package com.lv.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
//类不被识别,将类变成一个组件
@Component
@Slf4j
public class LogAop {
// 指定切入的规则,"…"代表可有参可无参
@Pointcut(“execution(* com.lv.controller.Controller.(…))”)
public void logger(){}
// 环绕通知
@Around(“logger()”)
public Object around(ProceedingJoinPoint point){
// 获得方法名称
Signature methodName=point.getSignature();
// 日志输出
log.info(methodName+“进来了”);
Long l1=System.currentTimeMillis();
// 让方法执行
Object obj=null;
try {
obj=point.proceed(point.getArgs());
} catch (Throwable throwable) {
throwable.printStackTrace();
}
log.info(methodName+“走了”+“\t耗时”+(System.currentTimeMillis()-l1));
return obj;
}
}
使用jrebel运行:
package com.lv.controller;
import com.lv.annotation.MyAnnotation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@MyAnnotation
//直接返回json数据
@RestController
//返回页面跳转数据
//@Controller
public class TestController {
@RequestMapping(“/add”)
public String add(){
return “yes”;
}
@RequestMapping(“/del”)
public String del(){
return “yes”;
}
@RequestMapping(“/upd”)
public String upd(){
return “yes”;
}
@RequestMapping(“/list”)
public String list(){
return “yes”;
}
}
使用注解来开发aop日志:
新建注解类:MyLog.java
package com.lv.annotation;
import java.lang.annotation.*;
@Inherited
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {
}
同样在切面类中,记得改变切入的规则
@Pointcut(“@annotation(com.lv.annotation.MyLog)”)
需要输出日志的方法就将新建的注解加上
四、完成前端响应反应
传入四个文件:
ResponseParse.java:
package com.lv.response;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
/**
- @author hgh
*/
//响应增强类
@RestControllerAdvice
public class ResponseParse implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
//返回值决定他是否需要进入beforeBodyWrite
return methodParameter.getMethod().isAnnotationPresent(ResponseResult.class);
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
//更改返回值
if (o == null) {
return Result.success();
}
if (o instanceof Integer) {
return Result.failure(ResultCode.queryCode((Integer) o));
}
if (o instanceof ResultCode) {
return Result.failure((ResultCode) o);
}
if (o instanceof Result) {
return o;
}
return null;
}
}
ResponseResult.java:
package com.lv.response;
import java.lang.annotation.*;
/**
- @author hgh
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
@Target({ElementType.METHOD})
public @interface ResponseResult {
}
Result.java:
package com.lv.response;
import lombok.Data;
import java.io.Serializable;
/**
-
响应对象封装类
-
@author hgh
*/
@Data
public class Result implements Serializable {
private final int code;
private final String message;
private final T data;
/**
-
私有构造, 只允许通过static调用构造
-
@param resultCode 结果枚举
-
@param data 响应数据
*/
private Result(ResultCode resultCode, T data) {
this.code = resultCode.getCode();
this.message = resultCode.getMessage();
this.data = data;
}
/**
-
成功调用返回的结果(无数据携带)
-
@return Result
*/
public static Result success() {
return success(null);
}
/**
-
成功调用返回的结果(数据携带)
-
@return Result
*/
public static Result success(T data) {
return new Result(ResultCode.SUCCESS, data);
}
/**
-
失败调用返回的结果(数据携带)
-
@param resultCode 状态枚举
-
@param data 携带的数据
-
@return Result
*/
public static Result failure(ResultCode resultCode, T data) {
return new Result(resultCode, data);
}
/**
-
失败调用返回的结果(无数据携带)
-
@param resultCode 状态枚举
-
@return Result
*/
public static Result failure(ResultCode resultCode) {
return failure(resultCode, null);
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
95%以上Java开发知识点,真正体系化!**
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
[外链图片转存中…(img-TKJ2ubIJ-1712077662565)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!