Spring框架@Autowired注解进行字段时,使用父类类型接收子类变量,可以注入成功吗?(@Autowired源码跟踪)

一、 前言

平常我们在使用spring框架开发项目过程中,会使用@Autowired注解进行属性依赖注入,一般我们都是声明接口类型来接收接口实现变量,那么使用父类类型接收子类变量,可以注入成功吗?答案是肯定可以的!

二、结果验证

我们在项目中声明如下三个类:

1. 测试代码

  • TestParent
public class TestParent {
   
   
    protected void test() {
   
   
        System.out.println("I am TestParent...");
    }
}
  • TestSon
importorg.springframework.stereotype.Component;

@Component
public class TestSon extends TestParent {
   
   
    publicvoidtest() {
   
   
        System.out.println("I am TestSon...");
    }
}
  • TestType
importorg.springframework.beans
Java 开发中,注解(Annotation)是一种元数据形式,用于为代码提供额外的信息。这些信息可以被编译器、框架或工具使用,以实现特定的功能。Java 注解根据其作用和用途可分为以下几类: ### 元注解(Meta-Annotations) 元注解是用于注解其他注解的特殊注解。它们定义了注解的行为和生命周期。 - `@Retention`:定义被它所注解注解保留多久。它可以有三个值: - `RetentionPolicy.SOURCE`:仅在源码中保留,编译丢弃。 - `RetentionPolicy.CLASS`:在编译保留,默认行为。 - `RetentionPolicy.RUNTIME`:在运行保留,可以通过反射读取[^1]。 - `@Target`:指定该注解可以应用的目标类型,例如类、方法、字段等。常见值包括: - `ElementType.TYPE`:适用于类、接口(包括注解类型)、枚举。 - `ElementType.METHOD`:适用于方法。 - `ElementType.FIELD`:适用于字段或属性。 - `ElementType.PARAMETER`:适用于参数。 - `ElementType.CONSTRUCTOR`:适用于构造函数。 - `ElementType.LOCAL_VARIABLE`:适用于局部变量。 - `ElementType.ANNOTATION_TYPE`:专门用于注解类型。 - `ElementType.PACKAGE`:适用于包声明。 - `@Documented`:表明这个注解应该被 Javadoc 工具记录。默认情况下,Javadoc 不包括注解,但如果声明注解指定了 `@Documented`,则它会被 Javadoc 之类的工具处理[^1]。 - `@Inherited`:表示一个注解是否可以被继承。如果一个类使用了带有 `@Inherited` 的注解,则它的子类也会自动拥有该注解。 - `@Repeatable`:允许同一个注解在一个项目上多次使用,这在 Java 8 中引入。 ### 标准注解(Built-in Annotations) Java 提供了一些内置的标准注解,用于标记代码的不同方面。 - `@Override`:指示一个方法覆盖了父类的方法。如果方法没有正确覆盖父类的方法,编译器会报错。 - `@Deprecated`:标记某个程序元素(如方法、类)已经过,不应再使用。当使用注解,建议提供替代方案。 - `@SuppressWarnings`:抑制编译器警告。可以用来关闭特定类型的警告信息。 ### Spring 框架常用注解 Spring 框架广泛使用注解来简化配置和提高开发效率。 - **组件扫描与装配** - `@Component`:标记一个类为 Spring 应用上下文中的 Bean。 - `@Service`:通常用于业务逻辑层组件。 - `@Repository`:通常用于数据访问层组件。 - `@Controller`:用于控制器层组件,特别是在 Web 应用中。 - `@RestController`:结合了 `@Controller` 和 `@ResponseBody`,用于 RESTful Web 服务。 - **依赖注入** - `@Autowired`:用于自动注入依赖。可以在字段、构造器、方法上使用。 - `@Qualifier`:配合 `@Autowired` 使用,解决多个相同类型的 Bean 注入问题。 - **Web 层注解** - `@RequestMapping`:将 HTTP 请求映射到 MVC 和 REST 控制器的方法上。 - `@GetMapping`、`@PostMapping` 等:更具体的 HTTP 方法映射。 - `@PathVariable`:获取 URL 中的路径参数。 - `@RequestParam`:绑定 Web 请求参数到方法参数。 - `@RequestBody`:将请求体中的内容转换为 Java 对象。 - `@ResponseBody`:将返回值直接写入 HTTP 响应体中。 - **事务管理** - `@Transactional`:启用事务管理,确保数据库操作的原子性和一致性。 - **配置相关** - `@Configuration`:标记一个类为配置类,相当于 XML 配置文件。 - `@Bean`:在配置类中定义一个 Bean。 - `@PropertySource`:加载外部属性文件。 - `@EnableScheduling`:启用定任务功能[^2]。 - **测试相关** - `@RunWith(SpringRunner.class)`:在 JUnit 测试中启动 Spring 上下文。 - `@SpringBootTest`:用于集成测试,加载完整的 Spring Boot 应用上下文。 - `@DataJpaTest`:专注于 JPA 相关的测试。 - `@WebMvcTest`:专注于 Web 层(控制器)的测试。 ### 第三方库注解 除了 Java 标准库和 Spring 框架外,还有许多第三方库提供了丰富的注解支持。 - **Lombok** - `@Data`:自动生成 getter、setter、toString、equals 和 hashCode 方法。 - `@NoArgsConstructor`、`@AllArgsConstructor`:生成无参和全参构造函数。 - `@Builder`:生成构建者模式的代码。 - `@Slf4j`:生成日志记录器实例。 - **Hibernate/JPA** - `@Entity`:标记一个类为实体类。 - `@Table`:指定实体类对应的数据库表名。 - `@Id`:标识主键字段。 - `@GeneratedValue`:指定主键生成策略。 - `@Column`:映射字段到数据库列。 ### 示例代码片段 ```java @RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public User getUser(@PathVariable Long id) { return userService.findById(id); } } ``` ```java @Data @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "user_name") private String username; } ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder-文小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值