25年11月它思科技 Java开发 一面

#JAVA##JAVA面经##JAVA内推#

1. 你的项目使用了什么架构?包含哪些模块?你负责的模块是否使用数据库?用了哪种数据库?具体如何使用的?

思路

  • 架构:明确说出架构类型(如SpringBoot分层架构、微服务架构),核心设计思路(高内聚低耦合)。
  • 模块:按业务划分(如用户模块、订单模块、支付模块),清晰说明模块职责。
  • 数据库:明确是否使用+数据库类型(MySQL/Redis等)+具体使用场景(表设计、增删改查、索引优化、事务处理)。
  • 重点:结合负责模块,体现数据库使用的实操性,而非仅说“用了MySQL”。

回答示例
我负责的项目采用SpringBoot分层架构(Controller+Service+Mapper),整体分为用户模块、订单模块、商品模块和支付模块。我主要负责订单模块开发,这个模块用到了MySQL数据库。具体使用上:一是设计了订单表、订单详情表,用主键索引+联合索引(订单号+用户ID)优化查询;二是核心业务(如创建订单)用了事务保证原子性,避免订单创建成功但库存未扣减的问题;三是高频查询的订单列表做了分页+索引优化,减少全表扫描,同时用MyBatis实现SQL的CRUD操作,降低耦合。

2. 了解Linux常用命令吗?

思路

  • 分类列举核心命令:文件操作(ls/cd/cp/rm)、进程查看(ps/top)、日志查看(tail/cat/grep)、文件编辑(vim)、权限管理(chmod)、网络查看(netstat/ss)。
  • 结合开发场景:说明命令的实际用途(如tail -f看实时日志,ps -ef | grep java查Java进程)。

回答示例

了解常用的Linux命令,日常开发和部署会高频使用:比如文件操作用ls(查看目录)、cd(切换目录)、cp(复制文件);查看进程用ps -ef | grep java(查Java进程)、top(实时监控系统资源);查看日志用tail -f xxx.log(实时看应用日志)、grep 'error' xxx.log(筛选错误日志);编辑文件用vim,修改文件权限用chmod,查看端口占用用netstat -tlnp | grep 8080,这些命令能高效完成项目部署和问题排查。

3. 是否部署过项目?具体怎么部署的?

思路

  • 明确回答“是”,说明部署方式(如手动部署/脚本部署),按步骤梳理流程。
  • 核心步骤:打包(mvn package)→ 上传服务器(scp)→ 停止旧服务 → 启动新服务(java -jar)→ 查看日志验证。
  • 补充细节:如配置JVM参数、后台运行(nohup)、端口占用处理,体现实操性。

回答示例

我部署过基于SpringBoot的Java项目,主要用手动部署的方式,步骤如下:第一步,在本地用mvn package打包成jar包;第二步,通过scp命令把jar包上传到Linux服务器指定目录;第三步,用ps -ef | grep java找到旧进程并kill掉;第四步,用nohup java -jar -Xms512m -Xmx1024m xxx.jar > log.out 2>&1 & 启动项目(配置JVM参数+后台运行);最后用tail -f log.out查看启动日志,验证项目是否正常访问,同时检查端口是否被占用,确保部署成功。

4. 了解Spring AOP的原理吗?哪些场景下AOP注解会失效?

思路

  • AOP原理:基于动态代理(JDK动态代理:接口+实现类;CGLIB动态代理:无接口,继承目标类);核心流程:定义切点→增强处理→织入(编译期/类加载期/运行期,Spring是运行期织入)。
  • 注解失效场景:内部方法调用(未走代理)、private/final方法(无法被代理)、目标类未被Spring管理、代理对象被覆盖/手动new实例。

回答示例

Spring AOP核心是动态代理:如果目标类实现了接口,用JDK动态代理(生成实现接口的代理类);如果没有实现接口,用CGLIB动态代理(生成目标类的子类),运行期将增强逻辑织入目标方法。 AOP注解失效的常见场景:第一,目标类的方法是private或final修饰,无法被代理(CGLIB无法继承final类,JDK代理也无法处理private方法);第二,类内部方法调用(比如A方法调用本类的B方法,B加了AOP注解,此时调用不走代理,注解失效);第三,目标类没有被Spring容器管理(如手动new实例,而非@Autowired注入);第四,代理对象被覆盖(如多次初始化导致代理失效)。

5. 编写SQL语句:查询每个user的name,以及每个user对应的account数量

思路

  • 核心逻辑:关联查询(左连接,保证无account的user也显示)+ 分组统计(COUNT)。
  • 表关联:user.id = account.user_id,用LEFT JOIN避免丢失无账号的用户;COUNT(account.id) 而非COUNT(*),避免统计NULL值。
  • 语法:SELECT 字段 + FROM 主表 + LEFT JOIN 关联表 + ON 条件 + GROUP BY 分组字段。

回答示例

对应的SQL语句如下:

SELECT u.name AS user_name, COUNT(a.id) AS account_count
FROM user u
LEFT JOIN account a ON u.id = a.user_id
GROUP BY u.id, u.name;

解释:用LEFT JOIN关联user和account表,保证即使某个用户没有账号(account无对应记录)也会被查询到,COUNT(a.id)统计每个用户的账号数量(a.id为NULL时COUNT结果为0);按user的id和name分组,确保每个用户的信息唯一,最终返回用户名和对应的账号数量。

#JAVA##面经##面试#
全部评论

相关推荐

不愿透露姓名的神秘牛友
02-26 09:42
工业富联(iPEBG) 职能 一口价 13x13 有加班费 但肯定没有HR说的那么多 硕士海归
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务