2024年最新SpringCloud微服务架构实战:商家权限体系设计及开发,java集合常见面试题

2021Java高级面试必备知识点详解:从技术到策略

2021年Java中高级面试必备知识点总结

在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。

本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。

目录:

(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)

部分内容:

对于每一个做技术的来说,学习是不能停止的,小编把2019年到目前为止Java的核心知识提炼出来了,无论你现在是处于什么阶段,如你所见,这份文档的内容无论是对于你找面试工作还是提升技术广度深度都是完美的。

不想被后浪淘汰的话,赶紧搞起来吧,高清完整版一共是888页,需要的话可以点赞+关注

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

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

资源实体与模块的关联关系同样使用@ManyToOne进行反向关联设计,这与用户与商家的关联关系的设计原理相同。

模块实体由ID、名称、主机、图标和创建日期等属性组成,实现代码如下所示:

@Entity

@Table(name =“tmodel”)

public class Model implements java.io.Serializable{

@Id

@Generatedvalue(strategy -GenerationType.IDENTITY)private Long id;

private String name;private String host;private String icon;

@DateTimeFormat (pattern = “yyyy-MM-dd HH:mm:ss”)

eColumn (name = “created”, columnDefinition = “timestamp defaultcurrent timestamp”)

@Temporal (TemporalType.TIMESTAMP)private Date created;

@ManyTo0ne

@JoinColumn (name = “kid”)@JsonIgnore

private Kind kind;

public Model() {}

}

模块实体的关联关系设计与资源实体的关联设计一样,也是使用@ManyToOne进行反向关联设计的。

分类实体由ID、名称、链接服务和创建日期等属性组成,实现代码如下所示:

@Entity

@Table(name = “t kind”)

public class Kind implements java.io. Serializable{

@Id

@Generatedvalue (strategy =GenerationType.IDENTITY)private Long id;

private String name;private String link;

@DateTimeFormat (pattern= “yyyy-MM-dd HH:mm:ss”)

cColumn (name = “created”, columnDefinition = “timestamp defaultcurrent timestamp”)

@Temporal (TemporalType.TIMESTAMP)private Date created;

public Kind() {}

}

分类实体在菜单模型结构中是一个顶级菜单,所以不需要进行关联设计。

单向关联设计可以提高数据的访问性能,但也有不足的地方。比如,在角色实体中,已经实现了角色实体与资源实体的单向关联设计,因此从角色实体中查询资源列表,则是非常容易的。但是反过来,从资源实体中查询角色列表就有些费力了。为了弥补这种不足,可以使用SQIL查询语句实现,具体会在后面的持久化设计中进行说明。

权限管理模型的持久化设计

在权限管理模型设计完成之后,为各个实体创建一个存储库接口,并与JPA的存储库接口进行绑定,就可以给实体赋予操作行为,实现实体的持久化设计。这一过程,其实就是存储库接口设计的工作。

例如,可以创建一个如下所示的存储库接口实现商家实体的持久化设计:

@Repository

public interface MerchantRepository extends JpaRepository<Merchant,Long>,JpaSpecificationExecutor {

}

在这个接口设计中,通过继承JpaRepository,可以让这个接口具有增删改查的操作功能。再通过继承.JpaSpecificationExecutor,就可以进行复杂的分页查询设计。如果不做其他特殊的查询设计,这样就已经完成了商家实体的持久化设计了。

如果对于一个实体,还需要实现一些复杂的查询设计,如对用户实体进行持久化设计,则使用如下所示的代码:

@Repository

public interface UserRepository extends JpaRepository<User, Long>,JpaSpecificationExecutor {

cQuery (“select distinct u from User u where u.name= :name”)User findByName (@Param (“name”) String name) ;

@Query(“select u from User u”+

" left join u.roles r"+

“where r.name= :name”)

User findByRoleName (@Param (“name”) String name) ;

@Query (“select distinct u from User u where u.id= :id”)User findById(@Param( “id”) Long id);

@Query ( “select u from User u”+

"left join u.roles r "+“where r.id = :id”)

List findByRoleId(@Param(“id”) Long id);

}

这里多了几个使用注解“@Query”进行自定义查询设计的声明方法。

其中,findByName和findByld主要使用distinct进行了去重查询,以避免在多对多的关联查询中,出现数据重复的情况。

另外,findByRoleName和 findByRoleld就是前面提到的,为弥补单向关联设计的不足而设计的查询。findByRoleName实现了从角色名称中查询用户列表的功能,而findByRoleld实现了从角色ID中查询用户列表的功能。

在角色实体存储库接口设计中,也需要增加一个查询设计,代码如下所示:

@Repository

public interface RoleRepository extends JpaRepository<Role,Long>,JpaSpecificationExecutor{

CQuery(“select o from Role o”+

“left join o.resources r”+“where r.id = :id”)

List findByResourceId(@Param(“id”) Long id);

}

在这个设计中,findByResourceld是一个反向关联查询,即使用资源ID查询角色列表。

其他实体的持久化设计与商家实体的持久化设计类似,只需为它们创建一个存储库接口就可以了。

权限管理模型的服务封装

在领域服务开发中,服务层的实现是对存储库接口调用的一种封装设计,这样,不但可以在存储库接口调用过程中实现统一的事务管理,还可以增加其他功能。

下面我们以用户服务层的开发为例进行说明,其他各个业务服务层的开发与此类似,不再赘述。

在用户服务层的设计中,增删改查各个操作的实现代码如下所示:@Service

@Transactional

public class UserService {

CAutowired

private UserRepository userRepository;

public String insert (User user){

try {

User old = findByName(user.getName());if(old == null) {

userRepository.save(user);

return user.getId() .toString();}else{

return "用户名’ "+ old.getName()+ “'已经存在!”;

}catch(Exception e){

e.printStackTrace();return e.getMessage();

public String update (User user){

try {

userRepository.save(user);

return user.getId() .toString();}catch(Exception e){

e.printStackTrace();return e.getMessage ();

}

}

public String delete (Long id){

try {

userRepository.deleteById(id);return id.toString ();

}catch (Exception e){

e.printStackTrace();

return e.getMessage();

}

}

public User find0ne (Long id){

return userRepository.findByUserId(id);

}

public List findA11(){

return userRepository.findAl1();

}

}

在这个设计中,注解@Transactional 实现了隐式的事务管理功能。由于登录用户必须以用户名为依据,所以在新增用户名时,做了同名检测。

用户领域服务的分页查询功能的实现代码如下所示:

@service

@Transactional

public class UserService {

CAutowired

private UserRepository userRepository;

public Page findAl1 (UserQo userQo){

Sort sort = Sort.by(Sort.Direction. DESC, “created”);

Pageable pageable = PageRequest.of (userQo.getPage(), userQo.getSize(.

sort);

return userRepository.findAll(new Specification(){

@override

public Predicate toPredicate(Root root, CriteriaQuery<?>qu

CriteriaBuilder criteriaBuilder) {

List predicatesList =new ArrayList();

if (CommonUtils.isNotNull (userQo.getName())){

predicatesList.add (criteriaBuilder.like(root.get (“name”),

“g"+userQo.getName() +”%"));

}

if(CommonUtils.isNotNull (userQo.getMerchant ())){

predicatesList.add (criteriaBuilder.equal (root. get (“merchant”),userQo.getMerchant().getId()));

}

if (CommonUtils.isNotNull(userQo.getCreated())){

predicatesList.add(criteriaBuilder.greaterThan(root.get (“created”),userQo.getCreated()));

query.where (predicatesList.toArray(new Predicate[predicatesList.

size()]));

return guery.getRestriction();

}

}, pageable);

}

}

这里主要使用findAll 方法实现分页查询的功能,并通过查询对象userQo 传递查询参数,这些参数包含了用户名称、商家对象和创建日期等属性。

在领域服务设计中,我们使用了一些查询对象,这些查询对象统一在merchant-object模块中实现。查询对象的属性基本上与实体对象的属性相互对应,并且还增加了几个分页查询的属性。

查询对象的实现代码如下所示:

public class User0o extends PageQo implements java.io.Serializable{

private Long id;

private String name;

private String password;private String email;private Integer sex;

@DateTimeFormat (pattern = “Yyyy-MM-dd HH:mm:ss”)private Date created;

private Listroles = new ArrayList<>();

private MerchantQo merchant;

public UserQ0() {

}

}

在完成服务层开发之后,商家权限体系的设计基本告一段落。下篇我们对商家管理微服务进行设计。

本文给大家讲解的内容SpringCloud微服务架构实战商家管理后台与sso设计:商家权限体系的设计及开发

  1. 下篇文章给大家讲解的是商家管理后台与sso设计:商家管理微服务设计;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

最后

分布式技术专题+面试解析+相关的手写和学习的笔记pdf

还有更多Java笔记分享如下:

image

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

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

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

  1. 下篇文章给大家讲解的是商家管理后台与sso设计:商家管理微服务设计;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

最后

分布式技术专题+面试解析+相关的手写和学习的笔记pdf

还有更多Java笔记分享如下:

[外链图片转存中…(img-94lMOKGl-1715226490709)]

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值