为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?

接口(Interface)的使用优于实体类,主要体现在接口提供了更高级别的抽象,允许类实现多个接口以实现多继承。接口中的方法默认为public,强制实现类实现所有接口方法,确保了代码的规范性和可维护性。同时,接口有助于实现软件的松耦合,方便扩展。而抽象类(Abstract Class)则用于定义抽象方法和提供部分实现,适用于需要共享代码的情况。实现类(Impl)则根据接口定义实现具体功能。

这里是修真院后端小课堂,每篇分享文从

为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?

大家好,我是IT修真院郑州分院第12期的学员李雨航,一枚正直纯洁善良的后端程序员,今天给大家分享一下,修真院官网java(职业)任务1,深度思考中的知识点——为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?

1.背景介绍

类是属性和方法容器,但是这些属性和方法没有任何区别的堆积在一起,当开发人员要寻找某个方法时,将很不方便,而且直接使用实现类导致父类-子类间出现强耦合,很容易导致软件复杂度失控,

这个时候,接口出现了,接口的出现就是为了解决这个问题。

2.知识剖析

1.接口:

接口是一种特殊的抽象类,是一个比抽象类还抽象的类,这种抽象类中只包含常量与方法的定义,而没有变量和方法的实现,接口,接口里所有的方法全是抽象方法。

2.接口中成员的特点

(1)Java 为了保证数据安全性是不能多继承的,也就是一个类只有一个父类。

但是接口不同,一个类可以同时实现多个接口,不管这些接口之间有没有关系,所以接口弥补了抽象类不能多继承的缺陷。

(2)接口是抽象类的延伸,它可以定义没有方法体的方法,要求实现者去实现。

接口的所有方法访问权限自动被声明为 public

(3)接口中可以定义“成员变量”,会自动变为 public static final 修饰的静态常量

可以通过类命名直接访问:ImplementClass.name

不推荐使用接口创建常量类

(4)实现接口的非抽象类必须实现接口中所有方法,抽象类可以不用全部实现

接口不能创建对象,但可以申明一个接口变量,方便调用

(5)完全解耦,可以编写可复用性更好的代码

接口的作用

1.重要性。在java中,abstract class

### Spring Boot 中在 Service Impl 外部使用 BaseMapper 查询的实现方式 在 Spring Boot 项目中,`BaseMapper` 是 MyBatis-Plus 提供的一个接口,用于简化数据库操作。如果需要在 `ServiceImpl` 外部使用 `BaseMapper` 进行查询,可以通过依赖注入的方式将 `BaseMapper` 注入到目标类中。以下是实现的具体方法代码示例: #### 1. 确保 Mapper 接口被扫描 在 Spring Boot 项目中,确保 `BaseMapper` 的子类(即自定义的 Mapper 接口)被正确扫描。可以在启动类或配置类上添加 `@MapperScan` 注解[^3]。 ```java @SpringBootApplication @MapperScan("com.example.mapper") // 替换为实际的Mapper包路径 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 2. 创建自定义 Mapper 接口 继承 `BaseMapper` 并定义具体的实体类。 ```java public interface UserMapper extends BaseMapper<User> { // 可以在此处添加自定义 SQL 方法 } ``` #### 3. 在外部类中注入 BaseMapper 在需要使用 `BaseMapper` 的类中,通过 `@Autowired` 注解将 Mapper 接口注入。 ```java @Component // 或者 @Service,根据实际需求选择合适的注解 public class UserService { @Autowired private UserMapper userMapper; // 注入自定义的Mapper public List<User> getAllUsers() { return userMapper.selectList(null); // 使用BaseMapper的方法进行查询 } public User getUserById(Long id) { return userMapper.selectById(id); // 根据ID查询 } } ``` #### 4. 配置文件设置 确保在 `application.yml` 或 `application.properties` 文件中正确配置了 MyBatis-Plus 数据源信息。 ```yaml mybatis-plus: mapper-locations: classpath:mapper/*.xml # 如果有XML映射文件,指定其位置 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志 spring: datasource: url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver ``` #### 5. 注意事项 - 如果在非 `@Service` 类中使用 `BaseMapper`,确保该类被 Spring 容器管理(例如使用 `@Component` 或其他合适的作用域注解)。 - 如果出现 `BeanNotOfFoundException` 异常,检查是否正确配置了 `@MapperScan` 或是否存在拼写错误。 ### 示例代码 以下是一个完整的示例,展示如何在 `ServiceImpl` 外部使用 `BaseMapper`: ```java // 启动类 @SpringBootApplication @MapperScan("com.example.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } // Mapper接口 public interface UserMapper extends BaseMapper<User> { } // 实体类 @Data public class User { private Long id; private String name; private Integer age; } // 外部类 @Component public class UserService { @Autowired private UserMapper userMapper; public List<User> getAllUsers() { return userMapper.selectList(null); } } ``` ### 总结 通过上述方法,可以轻松地在 `ServiceImpl` 外部使用 `BaseMapper` 进行查询操作。关键在于确保 `Mapper` 接口被正确扫描,并通过 `@Autowired` 注解将其注入到目标类中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值