Spring高级注解-Day3,2024年最新b站hr面试

@After(“execution(* com.example.service.impl..(…))”)

public void after() {

System.out.println(“方法执行时间:” + (System.currentTimeMillis() - time) / 1000);

}

}

EfficiencyUtils.java

  • 也可以在类上加@Order(数值) 自己配置执行顺序,数字越小越先执行

4.3 用于配置切入点表达式的

4.3.1 @Pointcut
4.3.1.1 作用
  • 此注解是用于指定切入点表达式的。
4.3.1.2 属性
  • value:用于指定切入点表达式。
4.3.1.3 基本使用

@Component

//表明当前类是一个切面类

@Aspect

public class LogUtil {

//用于定义通用的切入点表达式

@Pointcut(value = “execution(* com.example.service.impl..(…)) && args(user)”,argNames = “user”)

private void pointcut1(User user){

}

//用于配置当前方法是一个前置通知

@Before(value = “pointcut1(user)”,argNames = “user”)

public void printLog(User user){

System.out.println(“打印日志” + user);

}

}

LogUtil.java

4.4 用于配置通知的

4.4.1 @Before
4.4.1.1 作用
  • 被此注解修饰的方法为前置通知。前置通知的执行时间点是在切入点方法执行之前。
4.4.1.2 属性
  • value:用于指定切入点表达式。可以是表达式,也可以是表达式的引用。

  • argNames:用于指定切入点表达式参数的名称。它要求和切入点表达式中的参数名称一致。通常不指定也可以获取切入点方法的参数内容。

4.4.2 @AfterReturning
4.4.2.1 作用
  • 用于配置后置通知。后置通知的执行是在切入点方法正常执行之后执行。

需要注意的是,由于基于注解的配置时,spring创建通知方法的拦截器链时,后置

通知在最终通知之后,所以会先执行@After注解修饰的方法。

4.4.2.2 属性
  • value:用于指定切入点表达式,可以是表达式,也可以是表达式的引用。

  • pointcut:它的作用和value是一样的。

  • returning:指定切入点方法返回值的变量名称。它必须和切入点方法返回值名称一致。

  • argNames:用于指定切入点表达式参数的名称。它要求和切入点表达式中的参数名称一致。通常不指定也可以获取切入点方法的参数内容。

4.4.3 @AfterThrowing
4.4.3.1 作用
  • 用于配置异常通知。
4.4.3.2 属性
  • value:用于指定切入点表达式,可以是表达式,也可以是表达式的引用。

  • pointcut:它的作用和value是一样的。

  • throwing:指定切入点方法执行产生异常时的异常对象变量名称。它必须和异常变量名称一致。

  • argNames:用于指定切入点表达式参数的名称。它要求和切入点表达式中的参数名称一致。通常不指定也可以获取切入点方法的参数内容。

4.4.4 @After
4.4.4.1 作用
  • 用于指定最终通知。
4.4.4.2 属性
  • value:用于指定切入点表达式,可以是表达式,也可以是表达式的引用。

  • argNames:用于指定切入点表达式参数的名称。它要求和切入点表达式中的参数名称 一致。通常不指定也可以获取切入点方法的参数内容。

4.4.5 基本使用

@Component

//表明当前类是一个切面类

@Aspect

public class LogUtil {

//用于配置当前方法是一个前置通知

@Before(“execution(* com.example.service.impl..(…))”)

public void beforePrintLog(){

System.out.println(“前置通知打印日志”);

}

//用于配置当前方法是一个最终通知

@After(“execution(* com.example.service.impl..(…))”)

public void afterPrintLog(){

System.out.println(“最终通知打印日志”);

}

//用于配置当前方法是一个后置通知

@AfterReturning(“execution(* com.example.service.impl..(…))”)

public void afterReturningPrintLog(){

System.out.println(“后置通知日志”);

}

//用于配置当前方法是一个异常通知

@AfterThrowing(“execution(* com.example.service.impl..(…))”)

public void afterThrowingPrintLog(){

System.out.println(“异常通知打印日志”);

}

}

LogUtil.java

  • 执行顺序

前置通知打印日志

保存用户User{id=1, username=‘zs’, password=‘123’, birthday=Sat Jul 24 16:02:21 CST 2021}

后置通知日志

最终通知打印日志

4.4.6 一个切面内相同类型通知的执行顺序

@Component

//表明当前类是一个切面类

@Aspect

public class LogUtil {

//用于配置当前方法是一个前置通知

@Before(“execution(* com.example.service.impl..(…))”)

public void before2PrintLog(){

System.out.println(“前置通知2打印日志”);

}

//用于配置当前方法是一个前置通知

@Before(“execution(* com.example.service.impl..(…))”)

public void before1PrintLog(){

System.out.println(“前置通知1打印日志”);

}

}

  • 最终执行顺序

前置通知1打印日志

前置通知2打印日志

保存用户User{id=1, username=‘zs’, password=‘123’, birthday=Sat Jul 24 16:20:17 CST 2021}

  • 一个切面内相同类型通知的执行顺序与声明顺序无关

  • 一个切面内相同类型通知的执行顺序由方法名中每个字符的ASCII码顺序决定

  • 个切面内相同类型通知的执行顺序不能用@Order进行控制

4.4.7 @Around
4.4.7.1 作用
  • 用于指定环绕通知。
4.4.7.2 属性
  • value:用于指定切入点表达式,可以是表达式,也可以是表达式的引用。

  • argNames:用于指定切入点表达式参数的名称。它要求和切入点表达式中的参数名称一致。通常不指定也可以获取切入点方法的参数内容。

4.4.7.3 基本使用

public interface UserService {

@Description(“保存”)

void saveUser(User user);

@Description(“查找”)

User findById(String id);

@Description(“更新”)

void update(User user);

@Description(“删除”)

void delete(String id);

}

UserService.java

/**

  • 系统日志的实体类

*/

public class SystemLog implements Serializable {

//主键

private String id;

//方法名称

private String method;

//方法说明

private String action;

//时间

private Date time;

//来访者名称

private String remoteIp;

@Override

public String toString() {

return “SystemLog{” +

“id='” + id + ‘’’ +

“, method='” + method + ‘’’ +

“, action='” + action + ‘’’ +

“, time=” + time +

“, remoteIp='” + remoteIp + ‘’’ +

‘}’;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getMethod() {

return method;

}

public void setMethod(String method) {

this.method = method;

}

public String getAction() {

return action;

}

public void setAction(String action) {

this.action = action;

}

public Date getTime() {

return time;

}

public void setTime(Date time) {

this.time = time;

}

public String getRemoteIp() {

return remoteIp;

}

public void setRemoteIp(String remoteIp) {

this.remoteIp = remoteIp;

}

}

SystemLog.java

@Component

//表明当前类是一个切面类

@Aspect

public class LogUtil {

/**

  • 用于增强业务层方法,在其执行时记录系统日志

  • @return

*/

@Around(“execution(* com.example.service.impl..(…))”)

public Object aroundPrintLog(ProceedingJoinPoint pjp){

Object rtValue = null;

//创建系统日志对象

SystemLog log = new SystemLog();

try {

log.setId(UUID.randomUUID().toString());

log.setRemoteIp(“127.0.0.1”);

log.setTime(new Date());

//使用ProceedingJoinPoint中的获取签名方法

Signature signature = pjp.getSignature();

//判断当前的签名是否是方法签名

if(signature instanceof MethodSignature){

//把签名转换成方法签名

MethodSignature methodSignature = (MethodSignature) signature;

//获取当前执行的方法

Method method = methodSignature.getMethod();

log.setMethod(method.getName());

//判断当前方法上是否有@Description注解

boolean isAnnotated = method.isAnnotationPresent(Description.class);

if(isAnnotated){

//得到当前方法上的@Description

Description description = method.getAnnotation(Description.class);

//得到注解的value属性

String value = description.value();

log.setAction(value);

}

}

System.out.println(“环绕通知” + log);

Object[] args = pjp.getArgs();

//切入点方法执行

rtValue = pjp.proceed(args);

} catch (Throwable throwable) {

throwable.printStackTrace();

}

return rtValue;

}

}

LogUtil.java

4.5 用于扩展目标类的

4.5.1 @DeclareParents
4.5.1.1 作用
  • 用于给被增强的类提供新的方法。(实现新的接口)
4.5.1.2 属性
  • value:指定目标类型的表达式。当在全限定类名后面跟上+时,表示当前类及其子类

  • defaultImpl:指定提供方法或者字段的默认实现类。

4.5.1.3 基本使用

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

蚂蚁金服5面,总结了49个面试题,遇到的面试官都是P7级别以上

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

O0KBK-1712675789975)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-5vcreMy7-1712675789976)]

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

[外链图片转存中…(img-wKy61dSS-1712675789976)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-2KRbx1f4-1712675789976)]

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值