1、实现Scope 接口
public class CustomScope implements Scope { private ThreadLocal local = new ThreadLocal(); //获取bean实例 objectFactory.getObject()方法可以回调到spring //中 createBean方法,完成bean的创建,bean生成后由自己进行管理 //并没有在spring容器中管理 @Override public Object get(String name, ObjectFactory<?> objectFactory) { if(local.get() != null) { return local.get(); } else { //创建实例 Object object = objectFactory.getObject(); local.set(object); return object; } } // @Override public Object remove(String name) { Object o = local.get(); local.remove(); return o; } @Override public void registerDestructionCallback(String name, Runnable callback) { } @Override public Object resolveContextualObject(String key) { return null; } @Override public String getConversationId() { return null; } }
2、把自己实现Scope 接口的类注册到 spring scope容器中
@Component public class CustomScopeRegistry implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { //注册自定义的scope beanFactory.registerScope("refreshScope",new CustomScope()); } }
3、在bean的类上面使用
@Component @Scope("refreshScope")//直接使用 @Data public class CustomScopeBean { private String username; }
源码解析 在 beanFactory . doGetBean方法中