摘要:之前一直只知道有作用域,沒有怎么關注具體內容,今天特意看了,記錄過程以作備忘。
之前一直只知道spring bean有作用域,沒有怎么關注具體內容,今天特意看了,記錄過程以作備忘。
作用域(5類)作用域總計5種:singleton, prototype, request, session, global session
其中singleton, prototype為常規bean中都可以使用,默認為singleton;request, session, global session為web中特有,主要配置在如controller,action中具體配置方式有多種,此例中以springboot為示例
spring 容器中只存在一個具體實例,如
定義UserServiceImpl
@Service public class UserServiceImpl implements IUserService {}
@RestController @RequestMapping("/user") public class UserController { private static final Logger logger = LoggerFactory.getLogger(UserController.class); @Autowired private IUserService userService; @RequestMapping("/{id}") @ResponseBody public User get(@PathVariable(required = false) Long id) { logger.info("userService:{}", userService.toString()); return userService.get(1l); } } @RestController @RequestMapping("/test") public class TestController { private static final Logger logger = LoggerFactory.getLogger(TestController.class); @Autowired private IUserService userService; @GetMapping("/user") public User testUser() { logger.info("testController:{}", this.toString()); logger.info("userService:{}", userService.toString()); return userService.get(1l); } }
結果:在調用兩個地址后,userService.toString()打印出來的結果是一致的原型模式(prototype) 每次注入時提供一個新的實例
代碼如下:
改變服務提供方 UserServiceImpl
@Service @Scope(value = "prototype") public class UserServiceImpl implements IUserService {}
再次調用
結果:為兩個調用者生成不同的實例,但同一個調用者只生成一個每次調用時生成不同的實例
可在scope中加入 proxyMode= ScopedProxyMode.TARGET_CLASS
改變服務提供方 UserServiceImpl
@Service @Scope(value = "prototype",proxyMode= ScopedProxyMode.TARGET_CLASS) public class UserServiceImpl implements IUserService {}
再次調用
結果:每一次請求(調用),生成了不同的實例
2018-3-26更新開始
如果調用者為原型模式,即
@Scope(value = "prototype") public class UserController {...}
則UserServiceImpl 設置為@Scope(value = "prototype")即可,無需配置proxyMode= ScopedProxyMode.TARGET_CLASS
2018-3-26更新結束request
request, session, global session為web中特有,作用域大致對應HTTP中的Request, Session和Application,本例只以request為例
保持上面代碼修改UserController,代碼如下:
@RestController @RequestMapping("/user") @Scope(value = "request") public class UserController { ... }
再次調用
結果:每次調用會生成新的UserController 實例
@Scope(value = "request") 只能用于 controller/restcontroller 類似web組件中,如用于service中會出現如下異常:
Error creating bean with name "userServiceImpl": Scope "request" is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.另singleton的bean引用一個prototype的bean的說明
網絡中有說singleton的bean不能引用prototype的bean,經實驗,是可以引用,但能力有限,未能明確引用是否會有線程安全或其他問題
此處僅做引用示例,代碼如下
修改UserController,代碼如下:
@RestController @RequestMapping("/user") public class UserController { ... }
修改
@Service @Scope(value = "prototype",proxyMode= ScopedProxyMode.TARGET_CLASS) public class UserServiceImpl implements IUserService {}
再次調用
結果:在singleton的bean可以引用prototype的bean
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76341.html
摘要:裝配提供了三種裝配機制在中進行顯示配置在中進行顯示配置隱式的發現機制和自動裝配機制。表示該類是一個組件,將自動創建該組件實例,表示注入組件實例,和功能類似,和功能類似,但和是規范中提供的注解。 基本原理 spring的基礎是IOC和DI,其實IOC和DI是對同一件事從不同的方面進行描述的,兩者在spring中是同一件事務。 IOC:控制反轉,在這里就是指創建bean的主動權發生了轉移,...
摘要:的依賴關系,根據依賴關系配置完成之間的裝配。的行為信息,如生命周期范圍及生命周期各過程的回調函數。使用該種裝配模式時,優先匹配參數最多的構造函數。如果提供了默認的構造函數,則采用否則采用進行自動裝配。 點擊進入我的博客 1 Spring容器與Bean配置信息 Bean配置信息 Bean配置信息是Bean的元數據信息,它由一下4個方面組成: Bean的實現類 Bean的屬性信息,如數...
摘要:框架最初是由編寫的,并且年月首次在許可下發布。在一個方法執行之后,只有在方法退出拋出異常時,才能執行通知在建議方法調用之前和之后,執行通知。方法執行之后,不考慮其結果,執行通知。 導讀: 在上篇文章的結尾提到了Spring Boot 提供了一系列的框架整合(Starter POMs)幫助我們提升開發效率,但是這并不意味著我們不需要學習這些框架,反而更需要去學習,通過學習這些框架可以使...
摘要:因此,引入注解,先看一下配置文件怎么寫注意第行,使用必須告訴一下我要使用注解了,告訴的方式有很多,是一種最簡單的,會自動掃描路徑下的注解。 什么是注解 傳統的Spring做法是使用.xml文件來對bean進行注入或者是配置aop、事物,這么做有兩個缺點: 1、如果所有的內容都配置在.xml文件中,那么.xml文件將會十分龐大;如果按需求分開.xml文件,那么.xml文件又會非常多。總之...
摘要:用于發布身份驗證事件的。導入用于安全,配置身份驗證,這在非應用程序中也是相關的。安全出于安全考慮,除和之外的所有默認禁用,屬性可用于啟用。有關保護的其他信息可以在參考指南中找到。 28. 安全 如果在類路徑上有Spring Security,那么web應用程序默認是安全的,Spring Boot依賴Spring Security的內容協商策略來決定是使用httpBasic還是formL...
閱讀 2495·2021-11-24 10:29
閱讀 2634·2021-09-24 09:48
閱讀 5737·2021-09-22 15:56
閱讀 3152·2021-09-06 15:00
閱讀 2667·2019-08-30 15:54
閱讀 741·2019-08-30 13:48
閱讀 2894·2019-08-30 11:17
閱讀 3417·2019-08-29 11:20