likes
comments
collection
share

使用IDEA的模板功能创建具有多个文件的模板当我们需要开发一组接口时,往往需要分别创建几个范式文件,我们可以通过IDEA

作者站长头像
站长
· 阅读数 55

一些编程模式和框架需要一组相关的文件,通常具有非常特定的结构。例如,平时开发中我们所用到的三层架构:表现层(Controller),业务逻辑层(Service),和数据访问层(DAO)。

在平时工作中,当我们需要开发一组接口时,往往需要分别创建这几个文件,而这些文件范式基本相同,我们可以通过IDEA的文件模板功能来实现一次性创建多个文件。

创建具有多个文件的模板:

  1. 打开设置页面:Settings -> Editor -> File And Code Template
  2. 创建主模板文件:在Files选项卡下点击第一个按钮加号,并指定模板名文件名扩展名,编写代码内容
  3. 创建子模板文件:选中刚才创建的主模板文件,然后在Files选项卡下点击第二个按钮带有文件的加号,并指定文件名扩展名
  • 注:文件名可以是相对路径

模板示例

以下是我平时开发时用到的结构,分别有EntityControllerServiceRepository。由于习惯每一组接口一个模块(包),所以也用到了相对路径来指定文件名。

第一步:创建主模板

主模板这里我的模板内容为Entity

使用IDEA的模板功能创建具有多个文件的模板当我们需要开发一组接口时,往往需要分别创建几个范式文件,我们可以通过IDEA

第二步:创建子模板

其他三个子模板的内容分别为ControllerServiceRepository

使用IDEA的模板功能创建具有多个文件的模板当我们需要开发一组接口时,往往需要分别创建几个范式文件,我们可以通过IDEA

使用IDEA的模板功能创建具有多个文件的模板当我们需要开发一组接口时,往往需要分别创建几个范式文件,我们可以通过IDEA

使用IDEA的模板功能创建具有多个文件的模板当我们需要开发一组接口时,往往需要分别创建几个范式文件,我们可以通过IDEA

第三步:创建文件

创建test包,在新建菜单我们可以看到刚才创建的MVC模板,而这里写的File name会替换把模板里面的${NAME}替换掉。

需要注意的是:

  • 由于我们IDEA的模板功能由Apache Velocity引擎支持,所以我们在模板里面也是可以使用相关的表达式和方法。
  • 因为我在模板里面并没有使用import导入相关联的类,所以使用该模板创建完成后,需要手动(Ctrl+Alt+O)或自动导入import语句。

使用IDEA的模板功能创建具有多个文件的模板当我们需要开发一组接口时,往往需要分别创建几个范式文件,我们可以通过IDEA

使用IDEA的模板功能创建具有多个文件的模板当我们需要开发一组接口时,往往需要分别创建几个范式文件,我们可以通过IDEA

使用IDEA的模板功能创建具有多个文件的模板当我们需要开发一组接口时,往往需要分别创建几个范式文件,我们可以通过IDEA

完整模板源码

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end


import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
 
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder(toBuilder = true)
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "`${NAME.toLowerCase()}`")
@SQLDelete(sql = "update `${NAME.toLowerCase()}` set deleted = 1 where id = ?")
@Where(clause = "deleted = 0")
public class ${NAME}Entity extends BaseEntity {
}
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end


import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/${NAME}")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ${NAME}Controller {
    public final ${NAME}Service ${NAME.toLowerCase()}Service;
}
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end


import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ${NAME}Service {
    public final ${NAME}Repository ${NAME.toLowerCase()}Repository;
}
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end


import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

@Repository
public interface ${NAME}Repository extends JpaRepository<${NAME}Entity, Long>, JpaSpecificationExecutor<${NAME}Entity> {
}
转载自:https://juejin.cn/post/7412672700303654966
评论
请登录