使用IDEA的模板功能创建具有多个文件的模板当我们需要开发一组接口时,往往需要分别创建几个范式文件,我们可以通过IDEA
一些编程模式和框架需要一组相关的文件,通常具有非常特定的结构。例如,平时开发中我们所用到的三层架构:表现层(
Controller
),业务逻辑层(Service
),和数据访问层(DAO
)。
在平时工作中,当我们需要开发一组接口时,往往需要分别创建这几个文件,而这些文件范式基本相同,我们可以通过IDEA的文件模板功能来实现一次性创建多个文件。
创建具有多个文件的模板:
- 打开设置页面:
Settings
->Editor
->File And Code Template
。 - 创建主模板文件:在
Files
选项卡下点击第一个按钮加号
,并指定模板名
、文件名
和扩展名
,编写代码内容
。 - 创建子模板文件:选中刚才创建的主模板文件,然后在
Files
选项卡下点击第二个按钮带有文件的加号
,并指定文件名
和扩展名
。
- 注:文件名可以是相对路径
模板示例
以下是我平时开发时用到的结构,分别有Entity
、Controller
、Service
和Repository
。由于习惯每一组接口一个模块(包),所以也用到了相对路径来指定文件名。
第一步:创建主模板
主模板这里我的模板内容为Entity
。
第二步:创建子模板
其他三个子模板的内容分别为Controller
、Service
和Repository
。
第三步:创建文件
创建test
包,在新建菜单我们可以看到刚才创建的MVC模板,而这里写的File name
会替换把模板里面的${NAME}
替换掉。
需要注意的是:
- 由于我们IDEA的模板功能由
Apache Velocity
引擎支持,所以我们在模板里面也是可以使用相关的表达式和方法。 - 因为我在模板里面并没有使用
import
导入相关联的类,所以使用该模板创建完成后,需要手动(Ctrl
+Alt
+O
)或自动导入import
语句。
完整模板源码
#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