java springboot 項目, 通過接口修改Person類 name值, 在別的類中,注入Person類 @Resource Person person, 為什么拿不到 接口修改的 name的值,是Person類 不同的對象造成的 嗎
參數對象和注入對象區別
Person類,一個是作為control參數@RequestBody 一個是@Resource 注入
在Spring MVC應用中,當你遇到一個`Person`類既作為控制器(Controller)方法的`@RequestBody`參數接收請求體中的數據,又在另一個服務類中通過`@Resource`或`@Autowired`注解注入時,這兩者實際上是不同的實例,分別服務于不同的目的和生命周期管理。
### `@RequestBody`的用途
- 當你在控制器方法中使用`@RequestBody`注解時,Spring MVC會將HTTP請求的主體(body)內容自動綁定到方法的參數上。這里的`Person`對象是根據請求中發送的JSON或XML等數據動態創建的,僅存在于該請求的上下文中,用于處理該次請求的數據。
### `@Resource`或`@Autowired`的用途
- 當你在一個服務類中使用`@Resource`或`@Autowired`注解來注入`Person`類的實例時,Spring IoC容器會負責提供這個Bean的實例。默認情況下,這樣的Bean通常是單例(Singleton)的,意味著在整個應用運行期間,每次注入該類型的Bean時,都將獲得容器中同一個共享的實例。這個實例通常由Spring容器初始化時創建,并根據需要管理其生命周期。
### 為何兩者不共享狀態
由于通過`@RequestBody`解析的`Person`對象是針對每個HTTP請求新創建的,而通過`@Resource`注入的`Person`實例是由Spring容器管理的,可能是單例的,兩者存在于不同的作用域中,因此它們不共享狀態。即使你修改了通過`@RequestBody`接收到的`Person`對象的屬性,這不會影響到通過依賴注入獲取到的`Person`實例。
解決狀態同步問題
如果需要在服務層響應`@RequestBody`接收到的數據變更,并且確保其他地方注入的`Person`實例能夠感知到這些變更,你需要設計一個機制來同步這些狀態變化。這通常涉及數據庫操作、使用消息隊列或更新緩存等,而不是直接修改注入的Bean實例。例如,你可以將接收到的數據保存到數據庫,然后在需要的地方重新加載最新的數據。
在Spring Boot應用程序中,如果您在Controller中使用@RequestBody
將JSON數據映射到Person
對象,并在其他Service或Component中使用@Resource
注入同一個Person
對象,那么這兩個操作通常涉及不同的實例。
這是因為@RequestBody
通常用于接收前端發送的請求體中的數據,并自動將JSON格式的數據映射到Java對象。這個對象是Spring根據請求內容創建的新實例,而不是Spring容器管理的Bean。
另一方面,@Resource
或@Autowired
用于注入由Spring容器管理的Bean。如果Person
類被標記為@Component
或@Service
,那么Spring會創建一個Person
類的實例,并將其注冊到容器中,以便在其他地方注入。
因此,如果您在Controller中通過@RequestBody
接收了一個Person
對象并修改了它的name
屬性,這個修改不會影響到通過@Resource
注入的Person
實例,因為它們是兩個不同的對象。
如果您想要在Service或Component中使用通過Controller更新的Person
對象,您需要將這個對象傳遞過去,而不是注入一個全新的實例。例如:
@Controller
public class PersonController {@Autowiredprivate PersonService personService;@PostMapping("/updatePerson")public ResponseEntity<?> updatePerson(@RequestBody Person person) {// 這里person是通過@RequestBody接收的新實例personService.updatePerson(person);return ResponseEntity.ok().build();}
}@Service
public class PersonService {// 這里注入的是Spring容器管理的Person實例@Resourceprivate Person person;public void updatePerson(Person updatedPerson) {// 將通過Controller更新的person對象的屬性復制到注入的person對象person.setName(updatedPerson.getName());// ... 其他屬性的復制}
}
在這個例子中,PersonService
的updatePerson
方法接收了一個通過Controller更新的Person
對象,并將它的屬性復制到通過@Resource
注入的Person
對象中。這樣,您就可以在Service中使用更新后的數據了。