public interface Scope { Object get(String name, ObjectFactory objectFactory);//根據名稱及創建工廠得到一個Bean實例 Object remove(String name);//刪除一個指定名稱的Bean } |
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, void registerScope(String scopeName, Scope scope);//往Bean工廠中添加一個新的范圍(默認只有兩種范圍: singleton及prototype) void destroyScopedBean(String beanName);//銷毀B ean工廠中范圍Bean } |
String scopeName = mergedBeanDefinition.getScope(); //取得當前Bean的范圍,也即在定義中的scope=”request”的部分。 Scope scope = (Scope) this.scopes.get(scopeName);//得到Bean工廠中的范圍處理器 if (scope == null) { throw new IllegalStateException("No Scope registered for scope + scopeName + "); } try { //使用scope.get(beanName,ObjectFactory)從指定的范圍中得到或創建Bean實例 Object scopedInstance = scope.get(beanName, new ObjectFactory() { public Object getObject() throws BeansException { beforePrototypeCreation(beanName);//前攔截 try { return createBean(beanName, mergedBeanDefinition, args); //調用子類的createBean實現真正的Bean創建工作 } finally { afterPrototypeCreation(beanName);//后攔截 } } }); bean = getObjectForBeanInstance(scopedInstance, name, mergedBeanDefinition);//返回正確類型的Bean實例 } catch (IllegalStateException ex) { throw new BeanCreationException(beanName, "Scope + scopeName + is not active", ex); } |
public interface WebApplicationContext extends ApplicationContext { String SCOPE_REQUEST = "request"; String SCOPE_SESSION = "session"; String SCOPE_GLOBAL_SESSION = "globalSession"; } |
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { beanFactory.registerScope(SCOPE_REQUEST, new RequestScope());//注冊request類型的Bean beanFactory.registerScope(SCOPE_SESSION, new SessionScope(false));//注冊session類型的Bean beanFactory.registerScope(SCOPE_GLOBAL_SESSION, new SessionScope(true));//注冊glogalsession 的Bean } |