程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

自定义 Bean 作用域

发布于2021-03-13 14:26     阅读(884)     评论(0)     点赞(21)     收藏(3)


Spring 实现自定义的 bean 作用域

  • 实现 Scope 接口
  • 调用 AbstractBeanFactory#registerScope 方法
  • bean 配置的地方指定作用域,如 <bean scope=""> 或 @Scope("")

 

以下实现一个线程级别的 bean 的作用域

先看 Scope 接口的实现

  1. /**
  2. * 线程级别 scope
  3. *
  4. * @author ConstXiong
  5. */
  6. public class ThreadLocalScope implements Scope {
  7. public static final String SCOPE_NAME = "thread-local";
  8. private static final ThreadLocal<Map<String, Object>> THREAD_LOCAL = new ThreadLocal<Map<String, Object>>() {
  9. @Override
  10. protected Map<String, Object> initialValue() {
  11. return new HashMap<>();
  12. }
  13. };
  14. @Override
  15. public Object get(String name, ObjectFactory<?> objectFactory) {
  16. Map<String, Object> map = THREAD_LOCAL.get();
  17. Object object = map.get(name);
  18. if (object == null) {
  19. object = objectFactory.getObject();
  20. map.put(name, object);
  21. }
  22. return object;
  23. }
  24. @Override
  25. public Object remove(String name) {
  26. return THREAD_LOCAL.get().remove(name);
  27. }
  28. @Override
  29. public void registerDestructionCallback(String name, Runnable callback) {
  30. }
  31. @Override
  32. public Object resolveContextualObject(String key) {
  33. return THREAD_LOCAL.get().remove(key);
  34. }
  35. @Override
  36. public String getConversationId() {
  37. return String.valueOf(Thread.currentThread().getId());
  38. }
  39. }

 

使用 ApplicationContextAware 接口获取 ApplicationContext,在其 BeanFactory 中注册 ThreadLocalScope

  1. /**
  2. * 注册 ThreadLocalScope
  3. *
  4. * @author ConstXiong
  5. */
  6. @Component
  7. public class ScopeRegister implements ApplicationContextAware {
  8. @Override
  9. public void setApplicationContext(ApplicationContext applicationContext)
  10. throws BeansException {
  11. WebApplicationContext context = (WebApplicationContext)applicationContext;
  12. DefaultListableBeanFactory beanFactory = ((DefaultListableBeanFactory)context.getAutowireCapableBeanFactory());
  13. beanFactory.registerScope(ThreadLocalScope.SCOPE_NAME, new ThreadLocalScope());
  14. }
  15. }

 

bean 配置与 controller

  1. /**
  2. * controller
  3. *
  4. * @author ConstXiong
  5. */
  6. @Controller
  7. public class IndexController {
  8. @Autowired
  9. private ApplicationContext context;
  10. @RequestMapping("thread")
  11. @ResponseBody
  12. public String thread() {
  13. User user = context.getBean("user", User.class);
  14. return String.format("thread:%s, user:%s", Thread.currentThread().getId(), user);
  15. }
  16. @Bean
  17. @Scope(ThreadLocalScope.SCOPE_NAME)
  18. private static User user() {
  19. return new User();
  20. }
  21. }

 

这样在页面请求 http://localhost:8080/thread,线程 id 不同,bean id 也不同

 

完整代码:023-spring-bean-custom-scope

 


【Java学习资源】整理推荐

 

 


【Java面试题与答案】整理推荐

原文链接:https://blog.csdn.net/meism5/article/details/114685782



所属网站分类: 技术文章 > 博客

作者:飞翔公园

链接:http://www.javaheidong.com/blog/article/114246/5279cfa6837a6e119ea7/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

21 0
收藏该文
已收藏

评论内容:(最多支持255个字符)