- 创建、删除、复制、移动、重命名文件和文件夹的命令分别是什么?
- 文件
- 创建 touch
- 删除 rm
- 复制 cp
- 移动 mv
- 重命名 mv
- 文件夹
- 创建 mkdir
- 删除 rm -r
- 复制 cp -r
- 移动 mv
- 重命名 mv
- 文件
- 什么是gradle,gradle的作用是什么,查看gradle任务、运行测试、启动应用的命令分别是什么?
- gradle是一种依赖管理工具
- gradle是一个构建工具
- 帮助我们构建app,构建包括编译、打包等过程
- 我们可以为Gradle指定构建规则,然后它就会根据我们的“命令”自动为我们构建app
- 查看gradle任务:./gradle tasks
- 运行测试: ./gradle test
- 启动应用:./gradle bootRun
- gradle配置文件中,buildscript的设置和普通的设置有什么区别?
- buildscript中的声明是gradle脚本自身需要使用的资源。可以声明的资源包括依赖项、第三方插件、maven仓库地址等
- 在build.gradle文件中直接声明的依赖项、仓库地址等信息是项目自身需要的资源。
- gradlew的作用是什么?为什么要用它?
- gradlew是Gradle Wrapper,是gradle的一个包装。
- 在项目中运行./gradlew的话,就是用的是项目指定的版本的gradle
- 用户不必自己下载、安装、配置Gradle
- 用户进行项目构建时能够确保使用正确的Gradle版本
- 举例说明Java中接口、抽象类、类的区别?
-
接口
- 接口中的方法必须都是抽象方法
- 接口中可以含有 变量和方法
- 实现接口需要使用implements关键字
- 一个类可以实现多个接口
- 飞机和小鸟都会飞,但是飞机和小鸟不是同样的食物,所以将飞行动作定义为interface
*[public] interface InterfaceName {}
-
抽象类
[public] abstract class ClassName {abstract void fun();}
- 抽象方法必须为public或者protected
- 抽象类不能用来创建对象;
- 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
- 一个类只能继承一个类,使用关键字为extends
-
举例:
- 门和警报的例子:门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:
abstract class Door {
public abstract void open();
public abstract void close();
}
interface Door {
public abstract void open();
public abstract void close();
}
-
但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:
1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;
2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。
从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。
interface Alram {
void alarm();
}
abstract class Door {
void open();
void close();
}
class AlarmDoor extends Door implements Alarm {
void oepn() {
//....
}
void close() {
//....
}
void alarm() {
//....
}
}
- 类
- 类是一个模版,它描述一类对象的行为和状态
- 举例
- 人是一个类,每个人都是这个类的对象
- 举例说明Java中Collections、Arrays、Map、HashMap、TreeMap、Collection、List、ArrayList、Set、HashSet、TreeSet的区别和联系?
- Collection是Java的一个集合接口,它的子接口有Set、List
- Set的实现类有HashSet、TreeSet
- List的实现类有ArrayList
- Map是java的一个接口,它是java的数据字典
- 子接口有HashMap、TreeMap
- Arrays和Collections是工具类,Collections用来操作处理Collection,Arrays来操作处理Array
- 类方法和实例方法有什么区别,什么时候用类方法、什么时候用实例方法?
- 类方法使用的是static修饰
- 使用类方法时,当类被初始化的第一次分配一个入口地址,以后初始化这个类的时候,这个方法的入口地址不会发生改变
- 类方法可以直接通过类名来调用,实例方法不可以
- HTTP无状态是指什么?
- 使用HTTP请求发送的请求互相之间并没有什么关系
- 例如:HTTP请求不会记录你是否登陆过
- HTTP的返回的状态码有哪几类?常见的有哪些?分别表示什么含义?
- 2xx Success 200/201/204
- 3xx Redirection 304
- 4xx Client Error 400/401/403/404/409
- 5xx Service Error 500
- HTTP方法主要有哪几种,区别是什么?
- get 从指定的资源请求数据
- post 向指定的资源提交要被处理的数据
- put 更新指定的URL的资源
- delete 删除指定的URL上的资源
- 为什么RESTful API的URI中不能出现动词,画图说明RESTful API是怎么对资源进行操作的?
- 在RESTful API中,一个url代表一个资源
- 写出对一个用户增删改查的操作的API,包括查询参数、RequestBody、ResponseBody和ResponseStatus?
- /api/login
- POST
- request
- body {String: username/email, String: password}
- reponse
- code 201
- cookie {username, userId}
- code 401
- body {String: Invalid username & password}
- code: 500
- 画图说明Spring MVC的概念是什么,各部分之间是怎么相互工作的。
- 举例说明Spring Controller 中URL Mapping是怎么匹配的?
@RequestMapping("/api/users")
public class UsersController {
@Autowired
private UserService userServiceImpl;
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public String create(@RequestBody User user) {
userServiceImpl.createAccount(user);
return user.getUsername() + " create successful.";
}
@GetMapping
public Collection<User> userList() {
return userServiceImpl.getUserList();
}
@PutMapping(value = "/{id}/age/{age}")
public String updateAge(@PathVariable("id") Integer id, @PathVariable("age") Integer age){
String userInfo = userServiceImpl.updateUserAgeById(id, age);
return userInfo != null ? "update you info success" : "update you info error";
}
@GetMapping(params = "age")
public List<User> findUserByAge(@RequestParam("age") Integer age) {
return userServiceImpl.findUserByAge(age);
}
}
上述代码
如果请求为GET /api/users
, 则会匹配到userList
如果请求为GET /api/users?age=15
,则会匹配到findUserByAge
如果请求为POST /api/users
,则会匹配到create
如果请求为PUT /api/users/1/age/12
,则会匹配到updateAge
- Spring MVC中多个同名的param会在服务端怎么解析?
@GetMapping(params = "id")
public String get(@RequestParam String[] ids) {
for (String id : ids) {
System.out.println(id);
}
return " " + ids;
}
localhost:8080/greeting?id=1&id=2
这样代码会接收到一个数组,ids,里边包含了所有的id
- 举例说明IoC控制反转中对什么的控制反转了?解释标记@Autowired之后,为什么没有初始化也可以直接使用?
- 对类的初始化的操作交给了spring来进行,不需要我们自己去new这样的对象
- 由于我们在编写代码时,添加了注解,所以Spring在初始化项目的时候,会去将这些注解都收集起来,然后在代码中,哪一块写了@Autowired,就会去找这个@Autowired的类型的实例,然后赋值给改属性
- Spring中常用的依赖注入方式有哪几种?
- 接口注入
- 属性注入
- 构造函数注入
- Springboot中@Component、@Service、@Repository、@Bean、@Confituration区别和联系。
@Configuration注解该类,等价 与XML中配置beans;
@Bean标注方法等价于XML中配置bean;
@Component被用在要被自动扫描和装配的类上。Spring 注解@Component等效于@Service,@Controller,@Repository
@Bean主要被用在方法上,来显式声明要用生成的类;用@Configuration注解该类,等价 与XML中配置beans;用@Bean标注方法等价于XML中配置bean。注入业务类,把controller里的逻辑代码封装在ServiceBean里
并且把ServiceBean提取到一个接口里. 方便重写.@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
-
怎么实现Spring Data JPA里的一对多,多对多,一对一?
public class User { @Id private String id; @Column(unique = true) private String username; private String password; private Integer age; @OneToMany @JoinColumn(name = "user_id", referencedColumnName = "id") private List<Address> addresses; }
public class Address { @Id private String id; private String address; }
public class Order { @Id private String id; @OneToOne @JoinColumn(name = "user_id") private User user; @ManyToMany(cascade = CascadeType.REFRESH,fetch = FetchType.EAGER) @JoinTable(name = "t_order_item", joinColumns = @JoinColumn(name = "order_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "item_id", referencedColumnName = "id")) private List<Item> itemList = new ArrayList<>(); }
上面列出了三张表,User、Address、Order
User和Address是一对多的关系,在User表中写了@OneToMany,定义了List<Address>
,这样就建立起了User和Address的一对多的关系Order和User是一对一的关系,在Order中写@OneToOne,定义了User,这样就建立起了一对一的关系
Order与Item是多对多的关系,在Order中写了@ManyToMany,定义了
List<Item>
,建立多对多关系 如何控制Spring Data JPA里的一对多,一对一,多对多的lazy loading
fetch = FetchType.EAGER