Статьи

Пользовательские области в CDI 1.0 и Spring 3.1

В этом блоге кратко описывается, как реализовать пользовательские области в CDI с использованием Weld 1.1 и Spring 3.1. Чтобы получить основную информацию о области видимости, см. Ссылку Spring или ссылку Weld соответственно.

Пользовательские области в Spring

В Spring вы должны реализовать свою собственную область, используя интерфейс Scope . Я реализовал пользовательскую область как копию области запроса для иллюстрации:

package com.mycompany.springapp.scope;
 
import org.springframework.beans.factory.config.Scope;
import org.springframework.web.context.request.AbstractRequestAttributesScope;
import org.springframework.web.context.request.RequestAttributes;
 
public class MyCustomScope extends AbstractRequestAttributesScope implements Scope {
 
 @Override
 protected int getScope() {
  return RequestAttributes.SCOPE_REQUEST;
 }
 
 /**
  * There is no conversation id concept for a request, so this method
  * returns <code>null</code>.
  */
 public String getConversationId() {
  return null;
 }
 
}

Затем вы регистрируете свою новую область видимости в своем файле beans.xml:

<beans>
 <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
  <property name="scopes">
   <map>
    <entry key="custom">
     <bean class="com.mycompany.springapp.scope.MyCustomScope">
    </bean></entry>
   </map>
  </property>
 </bean>
</beans>

Затем вы можете использовать его, как и все другие встроенные области:

package com.mycompany.springapp.scope;
 
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
 
@Component
@Scope("custom")
public class MyCustomScopedService {
 
}

Смотрите
здесь для получения дополнительной информации.

Пользовательские области действия с CDI

В CDI — в соответствии с моделью программирования CDI — вы сначала определяете собственную аннотацию области действия:

package com.mycompany.jeeapp.scope.extension;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
 
import javax.enterprise.context.NormalScope;
 
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@NormalScope
public @interface CustomScoped {
 
}

Затем есть
интерфейс
Context, который вам нужно реализовать. Я сделал его копию HttpRequestScope для иллюстрации.

	
package com.mycompany.jeeapp.scope.extension;
 
import org.jboss.weld.context.http.HttpRequestContext;
import org.jboss.weld.context.http.HttpRequestContextImpl;
import java.lang.Class;
 
public class MyCustomScope extends HttpRequestContextImpl implements HttpRequestContext {
 
 public Class getScope() {
  return CustomScoped.class;
 }
  
}

Вы присваиваете новую аннотацию области бинам, которые созданы в этой области:

@CustomScoped
public class MyCustomScopeService { ... }

Для регистрации области создайте этот класс и поместите его вместе с вашим приложением в контейнер с поддержкой CDI. Среда выполнения CDI зарегистрирует его автоматически.

package com.mycompany.jeeapp.scope.extension;
 
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.Extension;
 
public class MyCustomScopeExtension implements Extension{
 
    public void afterBeanDiscovery(@Observes AfterBeanDiscovery event, BeanManager manager) {
        event.addContext(new MyCustomScope());
    }
}

Смотрите
эту запись в блоге для всестороннего примера.

Нечего жаловаться! Обе технологии прекрасно поддерживают расширения для областей и контекста.

 

От http://niklasschlimm.blogspot.com/2011/07/custom-scopes-in-cdi-10-and-spring-31.html