@Autowired
,@Qulifier
,@Primary
,@Resource
问题:
他们之间的区别和用法
回答: 用法
@Autowired
(spring原生注解)@Autowired(required=false) // 可以指定依赖不必要存在 private UserService userService
作用:按类型自动注入依赖,可以在字段,构造方法,Setter方法,普通方法
注意:有多个同类型的Bean时需要利用
@Qulifier
指定具体的Bean
@Qulifier
(Spring原生注解)@Autowired @Qualifier("userServiceImplA") // 指定具体的Bean,参数是Bean的名称 private UserService userService;
- 作用:当存在多个Bean的时候,告诉
@Autowired
的具体装配哪个Bean - 注意:是配合
@Autowired
一起使用的
- 作用:当存在多个Bean的时候,告诉
@Primary
(Spring原生注解)@Bean @Primary public UserService userServiceImplA() { return new UserServiceImplA(); }
- 作用:标记这个Bean在同类型中优先装配
@Resource
(java自带的注解)@Resource(name = "userServiceImplA") // 自行指定Bean名 private UserService userService;
- 作用:先按照Bean进行匹配,然后再按类型去匹配
- 注意:如果不指定Bean名,默认是变量名
扩展:
隐式自动装配:构造器注入
当如果类只有一个构造器,Spring 会自动注入其参数,无需显式使用
@Autowired
@Component public class OrderService { private final UserService userService; // 无需 @Autowired public OrderService(UserService userService) { this.userService = userService; } }
这可以和lambok的@RequiredArgsConstructor配合使用,可以实现自动生成对应的构造方法
mysql数据库中的列名使用is_
开头
问题:在java编写对应的代码时会出现什么问题
回答:
在ORM框架(如mybatis)中,
is_active
在生成getter
/setter
时,可能会变成isActive()
而不是getIsActive()
所以列名不要以is开头
java中==和equal
问题:两者的区别
回答:
==
在基本类型是比较值,而equal默认是比较地址- 所以对象之间进行逻辑相等的话,需要重写equal方法,进行基本比较
- 不过有时候存在一些例外,如String如果常量池中存在对应的字符串的话,是可能地址相等的
注意:
在重写equal的方法时,需要同时重写hashCode方法,这是java的一个规范,也就是equal相等,hashCode也要相等,默认的hashCode也是根据地址来的
在一些hash类如hashMap会去调用equal和hashCode去确定两者是否相同,hashCode确定存储桶位置,equal进行精确比对
实现序列化接口有啥意义
- 回答:
- 实现了序列化接口后,才可以被序列化以便存储或传输
springmvc中如何在RESTful接口中拿到request
- 回答:直接在方法的参数中声明
HttpServletRequest
的变量就行,spring会自动注入
到底使不使用包装类
- 回答:
- 在集合中如果需要存储,必须使用包装类,因为java集合不能直接存储基本类型
- 如果变量可能为null,也必须使用包装类,因为基本类型不能为null
正向代理,和反向代理的区别
回答:
正向代理:用户(客户端) → 正向代理 → 互联网 → 目标服务器
这个代理是需要自己设置的,,用户是知道设置了代理,相当于代理服务器就是用户,可以去请求任意资源,常见场景:VPN
反向代理:用户(客户端) → 互联网 → 反向代理 → 后端服务器
用户是不知道代理的存在,以为代理就是服务器,用户是请求固定的地址,代理服务器根据用户请求的地址去转发请求,常见场景负载均衡
两者虽然都是通过代理进行沟通,主要的区别是用户知不知道代理的存在
RESTful风格
全称表述性状态转移(Representational State Transfer,简称REST),是一种请求风格
- 回答:
- 请求方式与对应的意图
- GET:查询资源
- POST:新增资源
- PUT:更新资源
- DELETE:删除资源
vo, dto,pojo, Bean, JavaBean ,po是啥
回答:
VO(Value Object):数据载体,封装数据,无业务逻辑,常用于展示层,一般就是REST返回给前端的必要的数据类。
DTO(Data Transfer Object):数据传输对象,在层间传输数据,减少网络调用次数,这个一般是前端请求的参数对应的请求体。
POJO(Plain Old Java Object):普通Java类,不依赖框架或容器,遵循简单规范。
Bean:符合特定规范的类,有无参构造、私有属性和公共getter/setter方法。
JavaBean:严格遵守JavaBeans规范的Bean,常用于MVC模型层。
PO :persistent object持久对象,一般对应的就是数据库表的字段一一对应,需要实现序列化接口
final和static的区别
- 回答:
- 作用不同,final是防止修改,被其修饰的变量不能改变地址,属于对象级别,static是表示与用例无关的属性和行为属于类级别
- final作用在类上可以防止扩展类,在方法上,防止重写
- 可以不用马上去赋值,但用之间必须赋值,对于静态的final变量需要立即赋值,而对应类中的属性,可以在构造函数中去初始化
@Bean,@Component的区别
回答:
两者都是用于注册Bean的注解
作用对象不同:@Bean作用与方法,@Component作用于类
注册方式不同:@Bean需要在@Configuration注解的类中的方法显示声明,常用于引入第三方的类,将其注入IOC容器
Bean的默认名为方法名
@Configuration public class AppConfig { @Bean public TransferService transferService() { return new TransferServiceImpl(); } }
而@Component直接作用在类上,可直接通过@Autowired之类的进行注入,依赖于组件扫描,需要在启动类上使用@ComponentScan指定基本包路径,默认Bean的名称是类名首字母小写
@Component public class ServiceImpl implements AService { ... }
网桥是什么
回答:
网桥(Bridge)是一种工作在**数据链路层(OSI第二层)**的网络设备,主要用于连接两个或多个局域网(LAN),实现数据帧的过滤与转发,以扩展网络范围并优化性能
url中的查询参数怎么放,放在最后的字母后?,那要是路径中有?怎么办
回答:
规定放在末尾以?开头,key=value以&分割开
路径中存在?使用?的编码%3F解决,经常可以看到URL中有%这些东西,一般就是用编码代替实际的字母,如中文就需要替换
在前端中devDependencies和dependencies有什么区别
回答:
首先两者在开发阶段没啥区别,但在生产环境时,dev的不会打包进去,而另个一会,常见如babel,仅开发的时候翻译一下jsx,打包之后都是js,不需要它,这时候它就可以作为dev依赖
在springmvc中怎么把请求的url和携带的请求体,赋值给方法变量
回答:
样例
@GetMapping("/user") public String getUser(@RequestParam("id") String userId, @RequestParam(value = "name", required = false) String userName) { // 访问示例:/user?id=123&name=Tom return "ID: " + userId + ", Name: " + userName; }
查询参数注入使用@RequestParam("查询参数名"),如果没指定名字,默认为参数名
@GetMapping("/user/{userId}") public String getUser(@PathVariable("userId") String id) { // 访问示例:/user/123 return "ID: " + id; }
路径参数注入使用@PathVariable("路径名,对应的路径上{}中写的"),默认也是参数名
@PostMapping("/json") public String submitJson(@RequestBody User user) { // 请求体示例:{"name": "Tom", "age": 25} return "User: " + user.getName(); }
请求体的话使用@RequestBody去指定对应的类,mvc会自动把其中对应属性名相同的调用setter注入进去
注意:写这些注解就是告诉springmvc怎么去处理这些参数,如果不写,可能也会获取到参数,但是会存在严重隐患
方法和函数的区别
回答:
方法是依赖与类的,也就是说写在类中的就是方法,而写在其他地方直接通过函数名去调用的就是函数,而通过对象/类.方法名去调用的就是方法
mysql中的date和datetime,对应的java类
回答:
date对应的就是LocalDate(样式为2001-12-01)
datetime对应的是LocalDateTime(样式为2007-12-03T10:15:30)
在spring中怎么读取配置文件中的数据
- 回答:
- 使用@Value(spring包)注解
- 使用@ConfigurationProperties绑定对象
包装类和普通类型有什么区别
回答:
两者会自动装箱和拆箱,一般使用不是很大差别,但一些泛型如List需要引用型才行,这时需要包装类
动态代理是什么
- 回答:
- 动态代理是指在运行时生成代理对象的技术
maven中dependencyManagement和dependencies中的依赖区别
- 回答:
- dependencies:所有的子项目即使没有引入,也会默认引入,且子项目无法覆盖父版本
- dependencyManagement:所有的子项目可以直接不写版本号进行引入,版本号右父工程标识,也可以写版本号,这不会默认引入,需要手动引入
foreign如在类上的@RequestMapping怎么处理
回答:
首先是不能像控制器那样在类上注解,但其提供了path属性
@FeignClient(name = "user-service", path = "/api") public interface UserApi { @GetMapping("/users/{id}") // 实际路径为 /api/users/{id} User getUser(@PathVariable("id") Long id); }
乐观锁和悲观锁是什么
先来解释概念:
- 悲观锁:在并发的场景中,对数据的读取多,修改少,这时知识记录一些版本的信息如:自定义的数字,如果修改就自增,或者修改的日期,当一个线程需要修改的时候与之前读取的进行对比,就知道是否已经被修改了,这并没有对数据进行加锁,就是很乐观的认为不会发生数据不一致的问题,所以没有进行加锁
- 悲观锁:认为会发生数据不一致的概率高,直接给你数据加锁,这个肯定效率不高
- 总的来说:如果数据不一致影响不大的话,可以使用乐观锁,要求高就悲观锁,主要看是更新多还是查询多,更新少的话,就乐观锁
lombok的常见注解有哪些
- 基础的代码生成类
- @Getter:
- 放在那里:类(对整个类的字段都生成getter方法),字段(仅对他生成)
- @Setter:一样
- @ToString:生成除了static修饰的字段其他的toString方法
- @Data:最常用的注解
- 相当于@Getter,@Setter,@ToString,@EqualsAndHashCode,@RequiredArgsConstructor
- @Getter:
- 构造器相关的
- @NoArgsConstructor:生成无参构造
- @AllArgsConstructor:生成包含所有字段的构造器
- @RequiredArgsConstructor:生成包含final修饰或@NonNull注解字段的构造器
- 日志相关的
- @Slf4j:自动生成对应的日志变量,也就是可以直接使用日志功能
- 高级功能、
- @Builder:建造者模式的简单实现,能够使用链式的方法为创建实例前设置字段的值,最后调用build生成对应的实例
- @NonNull:自动校验参数或字段非空
- @Value:跟@Data类似,只是所有的字段都是final修饰的
倒排索引是什么
我感觉是本来是从全文去找关键词是否包含,这个就是倒过来,关键词下挂着包含该关键字的文章id,通过这个就可快速定位文章
网上的解释就是:
正排索引:以文档为中心,存储文档到词项的映射(如“文档1包含词项A、B、C),适合按文档ID查询内容,但检索词项需遍历所有文档
倒排索引:以词项为中心,适合关键词检索,是搜索引擎的核心技术
单点登录
- 网上的解释:单点登录(Single Sign-On,SSO)是一种身份认证机制,允许用户通过一次登录即可访问多个相互信任的应用系统,无需重复输入凭据
- 我感觉就是一次登录,到处通信,像那个qq,登录后qq邮箱就可以直接进入
- 我也不知道,现在粗浅的认为是一种方案,只需要登录一次,同系不同站也能直接进入,相当于对方也登录一样
mysql如果没指定主键,会有默认的主键么
- 会的,因为一定有聚集索引(也就是以主键建立的索引,下面挂着该行的索引的数据)
- 在InnoDB引擎中,会自动生成_rowid(ROW_ID,就是行的id可能吧)隐藏字段
红黑树,B+树,B-树的结构
mysql中给数据加锁。需要开启事务么?
- 显式的行级锁,如for update这种自己加的,需要事务支持
- 对数据进行update和delete会自动隐式事务,由mysql自行管理
- 表级锁:不需要事务,独立于事务,与会话有关,自行解锁或会话终止释放