Spring 用注解Annotation注入 abstract 抽象父类的属性

本文介绍如何在Spring框架中正确地使用@Autowired注解为继承自抽象类的子类注入依赖。通过调整注入方式,可以避免空指针异常,并实现抽象类属性的成功注入。

Spring 用注解Annotation注入 abstract 抽象父类的属性

原创  2016年08月10日 18:46:43

问题:

希望把子类公共的属性放在抽象类中。运行时,希望在Spring 扫描@Component注解,自动加载子类的同时,自动注入抽象父类的属性。

抽象父类:

@Component
public abstract class BaseCar {
    @Autowired
    Settings settings;
}
   
  • 1
  • 2
  • 3
  • 4
  • 5

子类:

@Component
public class SportsCar extends BaseCar{
    public void print(){
        //运行时报空指针异常,说明settings并没有通过@Autowired加载
        System.out.print(settings.getSpeed());
    }
}
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行时报空指针异常,说明子类中,super.settings并没有通过@Autowired加载

原因是 Spring Ioc 注入的对象是实例,而不是类。

实例化子类的时候,抽象父类不可能实例化,所以属性 settings 并没有自动加载。

解决办法:

父类:

public abstract class BaseCar {
    Settings settings;
}
   
  • 1
  • 2
  • 3

子类:

@Component
public class SportsCar extends BaseCar{
    //Autowired修饰方法时,根据方法参数类型判断实例化哪个类
    @Autowired 
    public void haha(Settings settings){
        super.settings=settings;//父类属性注入
    }

    public void print(){

        System.out.print(settings.getSpeed());
    }
}
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

测试类:

@Component
public class Test {
    @Autowired
    SportsCar sportsCar ;
    @PostConstrust
    public void test(){
        sportsCar.print();// 成功输出!abstract类的属性自动注入成功!
    }
}
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

参考文献: 
[1] Kshitiz Sharma. http://stackoverflow.com/questions/16733509/proper-way-to-inject-parent-class-dependencies-with-spring-annotations May 24, 2013.

抽象类上使用`@Mapper`注解自定义映射方法有以下几种实现方式: #### 定义默认方法 可以在抽象类中定义默认方法来实现自定义的映射逻辑。默认方法提供了方法的具体实现,子类可以直接使用这些方法,也可以选择覆盖它们。 ```java import org.mapstruct.Mapper; @Mapper public abstract class CustomMapper { // 自定义默认映射方法 default String customMapping(String input) { if (input != null) { return input.toUpperCase(); } return null; } // 抽象方法,由生成的实现类实现 public abstract Target map(Source source); } ``` #### 使用`@Named`注解 `@Named`注解可以为自定义映射方法提供唯一标识名称,便于在其他映射方法中复用这些转换逻辑。 ```java import org.mapstruct.Mapper; import org.mapstruct.Named; @Mapper public abstract class CustomMapper { @Named("trimAndUpperCase") public String trimAndUpperCase(String input) { if (input != null) { return input.trim().toUpperCase(); } return null; } // 在其他映射方法中使用 @Named 方法 public abstract Target map(Source source); } ``` #### 结合Spring Bean 可以在抽象类中引入Spring的Bean,使用已有的方法做逻辑处理。 ```java import org.mapstruct.Mapper; import org.springframework.beans.factory.annotation.Autowired; @Mapper(componentModel = "spring") public abstract class CustomMapper { @Autowired protected CustomService customService; // 使用 Spring Bean 中的方法进行映射 public abstract Target map(Source source); } ``` #### 抽象方法 抽象类中可以定义抽象方法,这些方法由生成的实现类来实现具体的映射逻辑。 ```java import org.mapstruct.Mapper; @Mapper public abstract class CustomMapper { // 抽象方法,由生成的实现类实现 public abstract Target map(Source source); // 可以定义多个抽象方法 public abstract AnotherTarget mapToAnotherTarget(AnotherSource source); } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值