Java最新Spring高级注解-Day3,Java高并发项目案例

最后

分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。

面试经验技巧篇
  • 经验技巧1 如何巧妙地回答面试官的问题
  • 经验技巧2 如何回答技术性的问题
  • 经验技巧3 如何回答非技术性问题
  • 经验技巧4 如何回答快速估算类问题
  • 经验技巧5 如何回答算法设计问题
  • 经验技巧6 如何回答系统设计题
  • 经验技巧7 如何解决求职中的时间冲突问题
  • 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官
  • 经验技巧9 在被企业拒绝后是否可以再申请
  • 经验技巧10 如何应对自己不会回答的问题
  • 经验技巧11 如何应对面试官的“激将法”语言
  • 经验技巧12 如何处理与面试官持不同观点这个问题
  • 经验技巧13 什么是职场暗语

面试真题篇
  • 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
  • 真题详解2 某知名社交平台软件工程师笔试题
  • 真题详解3 某知名安全软件服务提供商软件工程师笔试题
  • 真题详解4 某知名互联网金融企业软件工程师笔试题
  • 真题详解5 某知名搜索引擎提供商软件工程师笔试题
  • 真题详解6 某初创公司软件工程师笔试题
  • 真题详解7 某知名游戏软件开发公司软件工程师笔试题
  • 真题详解8 某知名电子商务公司软件工程师笔试题
  • 真题详解9 某顶级生活消费类网站软件工程师笔试题
  • 真题详解10 某知名门户网站软件工程师笔试题
  • 真题详解11 某知名互联网金融企业软件工程师笔试题
  • 真题详解12 国内某知名网络设备提供商软件工程师笔试题
  • 真题详解13 国内某顶级手机制造商软件工程师笔试题
  • 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
  • 真题详解15 某著名社交类上市公司软件工程师笔试题
  • 真题详解16 某知名互联网公司软件工程师笔试题
  • 真题详解17 某知名网络安全公司校园招聘技术类笔试题
  • 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

资料整理不易,点个关注再走吧

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

=======================================================================

1 设计模式-代理模式


  • 给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨 不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有 一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的 其他角色代为创建并传入。

2 AOP思想及实现原理


2.1 AOP思想

  • 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

3 Spring注解驱动AOP开发入门


org.springframework

spring-context

5.2.8.RELEASE

org.aspectj

aspectjweaver

1.9.6

pom.xml

@Configuration

@ComponentScan(“com.example”)

//开启Spring注解aop配置的支持

@EnableAspectJAutoProxy

public class SpringConfiguration {

}

SpringConfiguration.java

@Component

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

@Aspect

public class LogUtil {

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

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

public void printLog(){

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

}

}

LogUtil.java

public class SpringAopTest {

public static void main(String[] args) {

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(“config”);

UserService userService = ac.getBean(“userService”, UserService.class);

User user = new User();

user.setId(1);

user.setUsername(“zs”);

user.setPassword(“123”);

user.setBirthday(new Date());

userService.saveUser(user);

}

}

SpringAopTest.java

4 AOP常用注解分析


4.1 用于开启注解AOP的

4.1.1 @EnableAspectJAutoProxy
4.1.1.1 作用
  • 表示开启spring对注解aop的支持。它有两个属性,分别是指定采用的代理方式和

是否暴露代理对象,通过AopContext可以进行访问。

4.1.1.2 属性
  • proxyTargetClass:指定是否采用cglib进行代理。默认值是false,表示使用jdk的代理。

  • exposeProxy:指定是否暴露代理对象,通过AopContext可以进行访问。

4.1.1.3 基本使用

@Service(“userService”)

public class UserServiceImpl implements UserService {

@Override

public void saveUser(User user) {

System.out.println(“保存用户” + user);

}

@Override

public void saveAllUser(List users) {

for (User user : users) {

UserService proxyUserServiceImpl = (UserService) AopContext.currentProxy();

proxyUserServiceImpl.saveUser(user);

}

}

}

UserServiceImpl.java

@Component

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

@Aspect

public class LogUtil {

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

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

public void printLog(){

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

}

}

LogUtil.java

@Configuration

@ComponentScan(“com.example”)

//开启Spring注解aop配置的支持

@EnableAspectJAutoProxy(exposeProxy = true)

public class SpringConfiguration {

}

SpringConfiguration

4.2 用于配置切面的

4.2.1 @Aspect
4.2.1.1 作用
  • 声明当前类是一个切面类。
4.2.1.2 属性
  • value:默认我们的切面类应该为单例的。但是当切面类为一个多例类时,指定预处理的切入点表达式。用法是perthis(切入点表达式)。它支持指定切入点表达式,或者是用@Pointcut修饰的方法名称(要求全限定方法名)
4.2.1.3 基本使用
  • 属性说明

@Component

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

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

@Scope(“prototype”)

public class LogUtil {

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

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

public void printLog(){

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

}

}

LogUtil.java

  • 对于多个切面的执行顺序问题

  • 方法都是@Before注解时,默认先执行切面的类名排名更靠前的方法,也就是先执行EfficiencyUtils.java

@Component

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

@Aspect

public class LogUtil {

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

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

public void printLog(){

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

}

}

LogUtil.java

@Component

@Aspect

public class EfficiencyUtils {

private Long time;

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

public void before() {

time = System.currentTimeMillis();

System.out.println(“方法执行开始时间:” + time);

}

@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

/**

  • 系统日志的实体类

*/

Java面试核心知识点笔记

其中囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。

蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6

Java中高级面试高频考点整理

蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6

蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6

最后分享Java进阶学习及面试必备的视频教学

蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

法的参数内容。

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

/**

  • 系统日志的实体类

*/

Java面试核心知识点笔记

其中囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。

[外链图片转存中…(img-IDV0Bu1K-1715414826658)]

Java中高级面试高频考点整理

[外链图片转存中…(img-xKffnOf0-1715414826658)]

[外链图片转存中…(img-o0EfI7w4-1715414826659)]

最后分享Java进阶学习及面试必备的视频教学

[外链图片转存中…(img-fHOF0vnr-1715414826659)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值