spring 子类和父类注入同一个属性时,子类会覆盖父类

本文通过一个具体的示例介绍了在子类和父类同时注入同一个属性时,子类覆盖父类属性可能导致的问题。重点在于理解依赖注入机制及避免此类错误的编码实践。

在一期财务项目中,一个子类业务对象和父类业务对象同时注入同一个属性时,如果子类调用父类中某一个方法,如果该父类的方法引用了之前注入的属性,该属性是被子类覆盖的,也就是说在父类的上下文中,该属性是空的,暂且先不考虑代码的规范性,先通过一个简单的demo说明该问题点

1、子类和父类同时注入的对象 ResourceManager

public class ResourceManager {
 
 public void resourceSystem(){
  System.out.println("resource");
 }

}

2、父类

public class ParentService {
 
 private  ResourceManager resourceManager;
 
 public void print(){
  
  resourceManager.resourceSystem();//应该是空值
  
  System.out.println("parent");
 }

 public void setResourceManager(ResourceManager resourceManager) {
  this.resourceManager = resourceManager;
 }

}

3、子类

public class ChildService extends ParentService {
 private  ResourceManager resourceManager;
 
 public void print(){
  
  resourceManager.resourceSystem();
  super.print();   //调用父类方法
  System.out.println("child");
 }
 public void setResourceManager(ResourceManager resourceManager) {
  this.resourceManager = resourceManager;
 }
}

简单的测试方法

public class CrmTest extends TestCase {
 ApplicationContext context = new ClassPathXmlApplicationContext("spring/spring.xml");
 public void testABC(){
  ChildService childService = (ChildService) context.getBean("child");
  
  childService.print();
 }
}

通过红色的字说明了问题点

本身这种编码是不规范的,但是在项目中没有定期的review代码,导致线上出现了这个问题,值得每个PM深思

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

当三个子类继承同一个父类,要实现共用父类里缓存的功能,可以采用以下几种方法: ### 静态变量 在父类中使用静态变量来存储缓存数据。静态变量属于类而不是实例,因此所有子类实例都可以访问共享这个变量。 ```java class ParentClass { // 静态变量用于存储缓存 static Map<String, Object> cache = new HashMap<>(); public static Object getFromCache(String key) { return cache.get(key); } public static void putInCache(String key, Object value) { cache.put(key, value); } } class ChildClass1 extends ParentClass { // 子类可以直接使用父类的静态缓存方法 } class ChildClass2 extends ParentClass { // 子类可以直接使用父类的静态缓存方法 } class ChildClass3 extends ParentClass { // 子类可以直接使用父类的静态缓存方法 } ``` ### 单例模式 将缓存封装在一个单例类中,父类子类通过单例类来访问缓存。 ```java // 单例缓存类 class CacheSingleton { private static CacheSingleton instance; private Map<String, Object> cache = new HashMap<>(); private CacheSingleton() {} public static CacheSingleton getInstance() { if (instance == null) { instance = new CacheSingleton(); } return instance; } public Object getFromCache(String key) { return cache.get(key); } public void putInCache(String key, Object value) { cache.put(key, value); } } class ParentClass { protected CacheSingleton cacheSingleton = CacheSingleton.getInstance(); } class ChildClass1 extends ParentClass { // 子类可以通过父类的 cacheSingleton 访问缓存 } class ChildClass2 extends ParentClass { // 子类可以通过父类的 cacheSingleton 访问缓存 } class ChildClass3 extends ParentClass { // 子类可以通过父类的 cacheSingleton 访问缓存 } ``` ### 依赖注入 使用依赖注入的方式将缓存对象注入父类子类中。在Spring框架中可以通过 `@Autowired` 注解实现。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; // 缓存服务类 @Component class CacheService { private Map<String, Object> cache = new HashMap<>(); public Object getFromCache(String key) { return cache.get(key); } public void putInCache(String key, Object value) { cache.put(key, value); } } // 父类 @Component class ParentClass { @Autowired protected CacheService cacheService; } // 子类 @Component class ChildClass1 extends ParentClass { // 子类可以通过父类的 cacheService 访问缓存 } @Component class ChildClass2 extends ParentClass { // 子类可以通过父类的 cacheService 访问缓存 } @Component class ChildClass3 extends ParentClass { // 子类可以通过父类的 cacheService 访问缓存 } ```
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值