Spring踩坑:抽象类作为父类,使用子类@Autowired属性进行填充,属性值为null
解释:
在Spring框架中,使用@Autowired
注解自动填充属性时,如果属性是定义在抽象类中,并且该抽象类被具体子类继承,在尝试使用子类进行自动装配时可能会遇到问题,导致属性值为null。这通常是因为Spring容器在实例化子类时不会主动去查找并填充定义在父类抽象类中的@Autowired
属性。
解决方法:
- 使用
@Autowired
注解的required
属性设置为false
,并提供一个默认的无参构造器。 - 使用
@PostConstruct
注解的方法来在属性填充之后进行初始化。 - 使用
@Resource
或@Inject
注解来显式指定要装配的bean。 - 使用
@Component
注解标注抽象类,并确保子类也是一个标准的Spring组件(使用@Component
、@Service
、@Repository
或@Controller
注解)。 - 使用
ApplicationContext
手动获取需要的bean。
示例代码:
@Component
public class ConcreteClass extends AbstractClass {
// 确保有默认的无参构造器
@Autowired
public void setDependency(Dependency dependency) {
super.setDependency(dependency);
}
@PostConstruct
public void init() {
// 在这里可以确保依赖已经被注入
}
}
public abstract class AbstractClass {
private Dependency dependency;
// 确保有默认的无参构造器
// 设置依赖的方法,子类通过@Autowired调用此方法进行注入
public void setDependency(Dependency dependency) {
this.dependency = dependency;
}
// 抽象类中可以有抽象方法,子类需要实现它们
}
在这个例子中,子类通过@Autowired
标注的方法来注入依赖,这样父类中的dependency
属性就能够被正确地注入。
评论已关闭