private void injectServices(Object target, boolean sharedFields) throws IllegalAccessException { for (final FieldInfo field : spec.getAllFields()) { Field rawField = field.getReflection(); if ((rawField.isAnnotationPresent(Inject.class) || ReflectionUtil.isAnnotationPresent(rawField, "javax.inject.Inject") || rawField.isAnnotationPresent(Autobuild.class)) && rawField.isAnnotationPresent(Shared.class) == sharedFields) { Object value = registry.getObject(rawField.getType(), createAnnotationProvider(field)); rawField.setAccessible(true); rawField.set(target, value); } else if (rawField.isAnnotationPresent(InjectService.class)) { String serviceName = rawField.getAnnotation(InjectService.class).value(); Object value = registry.getService(serviceName, rawField.getType()); rawField.setAccessible(true); rawField.set(target, value); } } }
private void shutdownRegistry() { if (registry != null) registry.shutdown(); } }
private void createAndStartupRegistry() { if (registry != null) return; RegistryBuilder builder = new RegistryBuilder(); builder.add(ExtensionModule.class); for (Class<?> module : modules) builder.add(module); registry = builder.build(); registry.performRegistryStartup(); }
/** * Allows a service to be retrieved via its service interface. Use {@link #getRegistry()} for * more complicated * queries. * * @param serviceInterface * used to select the service */ public <T> T getService(Class<T> serviceInterface) { return registry.getService(serviceInterface); }
request = registry.getService(TestableRequest.class); response = registry.getService(TestableResponse.class); ApplicationGlobals globals = registry.getObject(ApplicationGlobals.class, null); registry.performRegistryStartup(); requestHandler = registry.getService("RequestHandler", RequestHandler.class);
ServletApplicationInitializer ai = registry.getService("ServletApplicationInitializer", ServletApplicationInitializer.class); registry.performRegistryStartup(); handler = registry.getService("HttpServletRequestHandler", HttpServletRequestHandler.class); registry.cleanupThread();
/** * Invoke this method when done using the PageTester; it shuts down the internal * {@link org.apache.tapestry5.ioc.Registry} used by the tester. */ public void shutdown() { registry.cleanupThread(); registry.shutdown(); }
public final <T> T getObject(Class<T> objectType, AnnotationProvider annotationProvider) { return registry.getObject(objectType, annotationProvider); }
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { boolean handled = handler.service((HttpServletRequest) request, (HttpServletResponse) response); if (!handled) { chain.doFilter(request, response); } } finally { registry.cleanupThread(); } }
/** * Autobuilds a class by finding the public constructor with the most parameters. Services and resources will be * injected into the parameters of the constructor. * * @param <T> * @param clazz the type of object to instantiate (not null) * @return the instantiated instance (not null) * @throws RuntimeException if the autobuild fails * @see MasterObjectProvider */ public <T> T autobuild(Class<T> clazz) { return getRegistry().autobuild(clazz); }
/** * 根据类型获取对象实例。返回的对象实例所属的类是T或它的实现类或子类。 * 如果TapestryIoC有没有或者有多个类都是T的实例,将返回null * @param <T> 类型参数 * @param beanType 实例的类型 * @return 指定类型的实例。 */ @Override public <T> T getInstance(Class<T> beanType) { try { return registry.getService(beanType); } catch (RuntimeException e) { return null; } }
public final void setupRegistry() { RegistryBuilder builder = new RegistryBuilder(); builder.add(TapestryModule.class); builder.add(JpaModule.class); builder.add(JpaTestModule.class); registry = builder.build(); // set PageTesterContext, otherwise T5 tries to load classpath assets ApplicationGlobals globals = registry.getObject(ApplicationGlobals.class, null); globals.storeContext(new PageTesterContext("")); registry.performRegistryStartup(); entityManagerManager = registry.getService(EntityManagerManager.class); topLevelService = registry.getService(TopLevelService.class); }
@AfterSuite public final void shutdown_registry() { if (registry != null) { registry.cleanupThread(); registry.shutdown(); registry = null; } } }
public void process(Object object, Field field) throws IllegalArgumentException, IllegalAccessException { Class<?> type = field.getType(); Object value = getRegistry().getObject(type, new AccessableObjectAnnotationProvider(field)); field.set(object, value); } }
@AfterMethod public final void cleanupThread() { registry.cleanupThread(); }
public final <T> T autobuild(String description, Class<T> clazz) { return registry.autobuild(description, clazz); }
/** * 根据类型和Annotation获取对象实例。如果找不到该类型的实例则返回null。 * 假如有两个类MyService1和MyService2都实现了接口Service,在Tapestry模块中这样注册: * binder.bind(Service.class, MyService1.class).withId("service1"); * binder.bind(Service.class, MyService2.class).withMarker(TheAnnotation.class); * 那么getInstance(Service.class, MyAnnotation.class)将返回MyService2的实例。 * * @param <T> 类型参数 * @param beanType 实例的类型 * @param annotationType 实现类的annotation类型 * @return 指定类型的实例。 */ @Override public <T> T getInstance(Class<T> beanType, Class<? extends Annotation> annotationType) { try { return registry.getService(beanType, annotationType); } catch (RuntimeException e) { return null; } }
private void shutdownRegistry() { if (registry != null) registry.shutdown(); } }
public void performRegistryStartup() { registry.performRegistryStartup(); }
private void injectServices(Object target, boolean sharedFields) throws IllegalAccessException { for (final FieldInfo field : spec.getAllFields()) { Field rawField = field.getReflection(); if ((rawField.isAnnotationPresent(Inject.class) || ReflectionUtil.isAnnotationPresent(rawField, "javax.inject.Inject") || rawField.isAnnotationPresent(Autobuild.class)) && rawField.isAnnotationPresent(Shared.class) == sharedFields) { Object value = registry.getObject(rawField.getType(), createAnnotationProvider(field)); rawField.setAccessible(true); rawField.set(target, value); } else if (rawField.isAnnotationPresent(InjectService.class)) { String serviceName = rawField.getAnnotation(InjectService.class).value(); Object value = registry.getService(serviceName, rawField.getType()); rawField.setAccessible(true); rawField.set(target, value); } } }