问下springboot里面这样是什么操作?看不懂

JPA用户表的对象我能理解

package com.neo.model;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Entity
public class UserInfo implements Serializable {
    @Id
    @GeneratedValue
    private Integer uid;
    @Column(unique =true)
    private String username;//帐号
    private String name;//名称(昵称或者真实姓名,不同系统不同定义)
    private String password; //密码;
    private String salt;//加密密码的盐
    private byte state;//用户状态,0:创建未认证(比如没有激活,没有输入验证码等等)--等待验证的用户 , 1:正常状态,2:用户被锁定.
    @ManyToMany(fetch= FetchType.EAGER)//立即从数据库中进行加载数据;
    @JoinTable(name = "SysUserRole", joinColumns = { @JoinColumn(name = "uid") }, inverseJoinColumns ={@JoinColumn(name = "roleId") })
    private List<SysRole> roleList;// 一个用户具有多个角色

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSalt() {
        return salt;
    }

    public void setSalt(String salt) {
        this.salt = salt;
    }

    public byte getState() {
        return state;
    }

    public void setState(byte state) {
        this.state = state;
    }

    public List<SysRole> getRoleList() {
        return roleList;
    }

    public void setRoleList(List<SysRole> roleList) {
        this.roleList = roleList;
    }

    /**
     * 密码盐.
     * @return
     */
    public String getCredentialsSalt(){
        return this.username+this.salt;
    }
    //重新对盐重新进行了定义,用户名+salt,这样就更加不容易被破解
}

这里也能明白就是继承了这个CrudRepository能让它拥有基本的增删查改操作
也用了自定义的方法。
相当于是select * from userinfo where username = ?
不知道这样的理解是不是正确!

package com.neo.dao;

import com.neo.model.UserInfo;
import org.springframework.data.repository.CrudRepository;

public interface UserInfoDao extends CrudRepository<UserInfo,Long> {
    /**通过username查找用户信息;*/
    public UserInfo findByUsername(String username);
}

接下来是我不能理解的。
定义了一个接口

package com.neo.sevice;

import com.neo.model.UserInfo;

public interface UserInfoService {
    /**通过username查找用户信息;*/
    public UserInfo findByUsername(String username);
}



继承了接口并把接口的方法实现了,然后把UserInfoDao 引进来,在方法里把findByUsername返回。。。。。
package com.neo.sevice.impl;

import com.neo.dao.UserInfoDao;
import com.neo.model.UserInfo;
import com.neo.sevice.UserInfoService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class UserInfoServiceImpl implements UserInfoService {
    @Resource
    private UserInfoDao userInfoDao;
    @Override
    public UserInfo findByUsername(String username) {
        System.out.println("UserInfoServiceImpl.findByUsername()");
        return userInfoDao.findByUsername(username);
    }
}

我不明白的是,这样实现一遍在其他地方用的时候调用
@Resource
privete UserInfoService
和我直接调用
@Resource
privete UserInfoDao
这有什么区别吗?
不太明白为什么还要直接换个接口实现一边。

阅读 2k
3 个回答

就是Dao层、Service层的问题而已了,当Service只做简单的CRUD时候,确实会疑惑,但还是有必要去做的,一个是事务问题,做好在Service做掉,你放到Controller层不合理,再有,项目做起来后,Service不单单只是CRUD,Service的一个方法就是一个业务逻辑,很可能涉及到多个数据查询、更新、缓存、MQ等等。所以,不要仅仅看Service层的CRUD,做复杂了,比如引入缓存等的,就可以看到区别了

调用service而不是直接调用dao是因为你业务简单,service逻辑少
service抽接口其实现在的意义不是很大了,但是很多人还是习惯抽…

个人认为当service做的事情仅仅是一个查询没有”任何“其他业务的时候可以省略掉这个service 由controller 直接调用这个dao,这个观点欢迎指摘。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题