/* * Copyright 2008-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.hasor.core; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.List; import java.util.Set; /** * Hasor的核心接口,主要用于收集Bean绑定信息。<p> * Bind 参考了 Google Guice 的 Binder 接口设计,功能上大体相似。目的是提供一种不同于配置文件、注解方式的配置方法。 * 这样一种设计并不是指 Hasor 抛弃配置文件和注解的优势,开发者可以根据项目的特征自行选择。 * Hasor 的开发者可以将某一个类使用 ApiBinder 接口的 bindType 方法注册到容器中。这个工作与 Spring 配置文件中 Bean 配置的作用并无不同。 * @version : 2013-4-10 * @author 赵永春 (zyc@hasor.net) */ public interface ApiBinder { /** * 获取 {@link Environment} * @return return {@link Environment} */ public Environment getEnvironment(); /** * 在框架扫描包的范围内查找具有特征类集合(特征可以是继承的类、标记的注解)。<br> * -- 该方法会放弃在匹配的过程中如果类无法被ClassLoader所加载的类。 * @param featureType 特征类型 * @return 返回匹配的类集合。 */ public Set<Class<?>> findClass(Class<?> featureType); /** * 在框架扫描包的范围内查找具有特征类集合(特征可以是继承的类、标记的注解)。<br> * -- 该方法会放弃在匹配的过程中如果类无法被ClassLoader所加载的类。 * @param featureType 特征类型 * @param scanPackages 扫描的包范围 * @return 返回匹配的类集合。 */ public Set<Class<?>> findClass(Class<?> featureType, String... scanPackages); /** * 尝试把 ApiBinder 转换为另一个 ApiBinder(如果它支持)<br/> * tips: 如果不支持转换则返回空。 */ public <T extends ApiBinder> T tryCast(Class<T> castApiBinder); /** * 安装其它插件。 * @param module 新安装的插件 * @throws Throwable 在执行loadModule方法期间发生异常的。 * @see net.hasor.core.Module#loadModule(ApiBinder) */ public void installModule(Module module) throws Throwable; // /*----------------------------------------------------------------------------------------Aop*/ /** * 使用表达式配置Aop。 * <p>例:<pre>格式:<返回值> <类名>.<方法名>(<参数签名列表>) * * *.*() 匹配:任意无参方法 * * *.*(*) 匹配:任意方法 * * *.add*(*) 匹配:任意add开头的方法 * * *.add*(*,*) 匹配:任意add开头并且具有两个参数的方法。 * * net.test.hasor.*(*) 匹配:包“net.test.hasor”下的任意类,任意方法。 * * net.test.hasor.add*(*) 匹配:包“net.test.hasor”下的任意类,任意add开头的方法。 * java.lang.String *.*(*) 匹配:任意返回值为String类型的方法。 * </pre> * @param matcherExpression 格式为“<code><返回值> <类名>.<方法名>(<参数签名列表>)</code>” * @param interceptor 拦截器对象 */ public void bindInterceptor(String matcherExpression, MethodInterceptor interceptor); /** * 使用匹配器配置Aop。 * @param matcherClass 类型匹配器 * @param matcherMethod 方法匹配器 * @param interceptor 拦截器对象 */ public void bindInterceptor(Matcher<Class<?>> matcherClass, Matcher<Method> matcherMethod, MethodInterceptor interceptor); /*--------------------------------------------------------------------------------------Finds*/ /**根据ID获取{@link BindInfo}。*/ public <T> BindInfo<T> getBindInfo(String bindID); /**根据ID获取{@link BindInfo}。*/ public <T> BindInfo<T> getBindInfo(Class<T> bindType); /** * 通过一个类型获取所有绑定该类型下的绑定信息。 * @param withName 绑定名 * @param bindType bean type * @return 返回所有符合条件的绑定信息。 */ public <T> BindInfo<T> findBindingRegister(String withName, Class<T> bindType); /** * 通过一个类型获取所有绑定该类型下的绑定信息。 * @param bindType bean type * @return 返回所有符合条件的绑定信息。 */ public <T> List<BindInfo<T>> findBindingRegister(Class<T> bindType); // /*------------------------------------------------------------------------------------Binding*/ /** * bind type to context , 通过返回的 Builder 可以对绑定进行后续更加细粒度的配置。<p> * -- {@link NamedBindingBuilder}类型,为绑定起名字。继承自:{@link LinkedBindingBuilder}<br> * -- {@link LinkedBindingBuilder}类型,为绑定设置实现方式。继承自:{@link InjectPropertyBindingBuilder}<br> * -- {@link InjectPropertyBindingBuilder}类型,为绑定设置注入属性。继承自:{@link LifeBindingBuilder}<br> * -- {@link LifeBindingBuilder}类型,为绑定设置生命周期方法配置。继承自:{@link ScopedBindingBuilder}<br> * -- {@link ScopedBindingBuilder}类型,为绑定设置作用域。继承自:{@link MetaDataBindingBuilder}<br> * -- {@link MetaDataBindingBuilder}类型,绑定元信息配置。<br> * @param type bean type。 * @return 返回 - {@link NamedBindingBuilder}。 */ public <T> NamedBindingBuilder<T> bindType(Class<T> type); /** * 绑定一个类型并且为这个类型指定一个实例。开发者可以通过返回的 Builder 可以对绑定进行后续更加细粒度的绑定。<p> * 该方法相当于“<code>apiBinder.bindType(type).toInstance(instance);</code>” * @param type bean type。 * @param instance 类型的实例 * @return 返回 - {@link MetaDataBindingBuilder}。 * @see #bindType(Class) */ public <T> MetaDataBindingBuilder<T> bindType(Class<T> type, T instance); /** * 绑定一个类型并且为这个类型指定一个实现类。开发者可以通过返回的 Builder 可以对绑定进行后续更加细粒度的绑定。<p> * 该方法相当于“<code>apiBinder.bindType(type).to(implementation);</code>” * @param type bean type。 * @param implementation 绑定的类型的实现类 * @return 返回 - {@link InjectPropertyBindingBuilder}。 * @see #bindType(Class) */ public <T> InjectPropertyBindingBuilder<T> bindType(Class<T> type, Class<? extends T> implementation); /** * 绑定一个类型并且为这个类型指定一个{@link Provider},开发者可以通过返回的 Builder 可以对绑定进行后续更加细粒度的绑定。<p> * 该方法相当于“<code>apiBinder.bindType(type).to(implementation);</code>” * @param type bean type。 * @param provider provider 可以用来封装类型实例创建的细节。 * @return 返回 - {@link ScopedBindingBuilder}。 * @see #bindType(Class) */ public <T> ScopedBindingBuilder<T> bindType(Class<T> type, Provider<T> provider); /** * 为绑定类型配置一个名称,进而基于同一个类型下不同名称的绑定进行差异化配置。开发者可以通过返回的 Builder 可以对绑定进行后续更加细粒度的绑定。<p> * 该方法相当于“<code>apiBinder.bindType(type).nameWith(withName).to(type);</code>” * @param withName bean名称。 * @param type bean type。 * @return 返回 - {@link InjectPropertyBindingBuilder}。 * @see #bindType(Class) */ public <T> InjectPropertyBindingBuilder<T> bindType(String withName, Class<T> type); /** * 为绑定类型配置一个名称,进而基于同一个类型下不同名称的绑定进行差异化配置。开发者可以通过返回的 Builder 可以对绑定进行后续更加细粒度的绑定。<p> * 该方法相当于“<code>apiBinder.bindType(type).nameWith(withName).toInstance(instance);</code>” * @param withName 要绑定的类型。 * @param type bean type。 * @param instance 同时指定实例对象 * @return 返回 - {@link MetaDataBindingBuilder}。 * @see #bindType(String, Class) * @see #bindType(Class) */ public <T> MetaDataBindingBuilder<T> bindType(String withName, Class<T> type, T instance); /** * 为绑定类型配置一个名称,进而基于同一个类型下不同名称的绑定进行差异化配置。开发者可以通过返回的 Builder 可以对绑定进行后续更加细粒度的绑定。<p> * 该方法相当于“<code>apiBinder.bindType(type).nameWith(withName).to(implementation);</code>” * @param withName 要绑定的类型。 * @param type bean type。 * @param implementation 同时指定实现类 * @return 返回 - {@link InjectPropertyBindingBuilder}。 * @see #bindType(String, Class) * @see #bindType(Class) */ public <T> InjectPropertyBindingBuilder<T> bindType(String withName, Class<T> type, Class<? extends T> implementation); /** * 为绑定类型配置一个名称,进而基于同一个类型下不同名称的绑定进行差异化配置。开发者可以通过返回的 Builder 可以对绑定进行后续更加细粒度的绑定。<p> * 该方法相当于“<code>apiBinder.bindType(type).nameWith(withName).to(implementation);</code>” * @param withName 要绑定的类型。 * @param type bean type。 * @param provider provider 可以用来封装类型实例创建的细节。 * @return 返回 - {@link LifeBindingBuilder}。 * @see #bindType(String, Class) * @see #bindType(Class) */ public <T> LifeBindingBuilder<T> bindType(String withName, Class<T> type, Provider<T> provider); /** * 注册作用域。 * @param scopeName 作用域名称 * @param scope 作用域 * @return 成功注册之后返回它自身, 如果存在同名的scope那么会返回第一次注册那个 scope。 */ public Provider<Scope> registerScope(String scopeName, Scope scope); /** * 注册作用域。 * @param scopeName 作用域名称 * @param scopeProvider 作用域 * @return 成功注册之后返回它自身, 如果存在同名的scope那么会返回第一次注册那个 scope。 */ public Provider<Scope> registerScope(String scopeName, Provider<Scope> scopeProvider); // /*--------------------------------------------------------------------------------------Faces*/ /**给绑定起个名字。*/ public interface NamedBindingBuilder<T> extends LinkedBindingBuilder<T> { /** * 绑定一个名称(并同时设置ID,为随机ID)。 * @param name 名称 * @return 返回 - {@link LinkedBindingBuilder}。 */ public LinkedBindingBuilder<T> nameWith(String name); /** * 随机取一个不重复的名字(并同时设置ID,为随机ID)。 * @return 返回 - {@link LinkedBindingBuilder}。 */ public LinkedBindingBuilder<T> uniqueName(); /** * 设置一个ID标识符。 * @param idString id标识符. * @return 返回 - {@link NamedBindingBuilder}。 */ public NamedBindingBuilder<T> idWith(String idString); } /**处理类型和实现的绑定。*/ public interface LinkedBindingBuilder<T> extends InjectPropertyBindingBuilder<T> { /** * 为绑定设置一个实现类。 * @param implementation 实现类型 * @return 返回 - {@link InjectPropertyBindingBuilder}。 */ public InjectPropertyBindingBuilder<T> to(Class<? extends T> implementation); /** * 为绑定设置一个实例 * @param instance 实例对象 * @return 返回 - {@link MetaDataBindingBuilder}。 */ public MetaDataBindingBuilder<T> toInstance(T instance); /** * 为绑定设置一个 {@link Provider}。 * @param provider provider 可以用来封装类型实例创建的细节。 * @return 返回 - {@link LifeBindingBuilder}。 */ public LifeBindingBuilder<T> toProvider(Provider<? extends T> provider); /** * 为绑定设置一个构造方法。 * @param constructor 使用的构造方法。 * @return 返回 - {@link InjectConstructorBindingBuilder}。 */ public InjectConstructorBindingBuilder<T> toConstructor(Constructor<? extends T> constructor); } /**构造方法依赖注入。*/ public interface InjectConstructorBindingBuilder<T> extends LifeBindingBuilder<T> { /** * 设置构造方法注入属性。 * @param index 构造方法参数索引位置。 * @param value 构造方法参数值。 * @return 返回 - {@link InjectConstructorBindingBuilder}。 */ public InjectConstructorBindingBuilder<T> injectValue(int index, Object value); /** * 设置构造方法注入属性。 * @param index 构造方法参数索引位置。 * @param valueInfo 要注入的参数来自于其它绑定。 * @return 返回 - {@link InjectConstructorBindingBuilder}。 */ public InjectConstructorBindingBuilder<T> inject(int index, BindInfo<?> valueInfo); /** * 设置构造方法注入属性。 * @param index 构造方法参数索引位置。 * @param valueProvider provider 可以用来封装类型实例创建的细节。 * @return 返回 - {@link InjectConstructorBindingBuilder}。 */ public InjectConstructorBindingBuilder<T> inject(int index, Provider<?> valueProvider); } /**属性依赖注入*/ public interface InjectPropertyBindingBuilder<T> extends LifeBindingBuilder<T> { /** * 值类型的属性注入。 * @param property 被注入Bean的属性名 * @param value 属性值。 * @return 返回属性注入接口,以继续其它属性注入。 - {@link InjectPropertyBindingBuilder}。 */ public InjectPropertyBindingBuilder<T> injectValue(String property, Object value); /** * 注入另一个Bean对象。 * @param property 被注入Bean的属性名 * @param valueInfo Bean配置信息。 * @return 返回属性注入接口,以继续其它属性注入。 - {@link InjectPropertyBindingBuilder}。 */ public InjectPropertyBindingBuilder<T> inject(String property, BindInfo<?> valueInfo); /** * 工厂方式注入Bean。 * @param property 被注入Bean的属性名 * @param valueProvider 属性值提供者。 * @return 返回属性注入接口,以继续其它属性注入。 - {@link InjectPropertyBindingBuilder}。 */ public InjectPropertyBindingBuilder<T> inject(String property, Provider<?> valueProvider); } /**负责启动之后的生命周期方法映射。*/ public interface LifeBindingBuilder<T> extends ScopedBindingBuilder<T> { /**配置当对象被创建时调用的方法,如果{@link Init @Init()}注解也定义了一个初始化方法则,注解方式优先于配置。 * @see net.hasor.core.Init*/ public LifeBindingBuilder<T> initMethod(String methodName); } /**Bean存在的作用域*/ public interface ScopedBindingBuilder<T> extends MetaDataBindingBuilder<T> { /** * 注册为原型模式。<p> * 原型模式:当类型被多个对象注入时,每个注入的类型实例都是全新的对象。 * @return 返回 - {@link MetaDataBindingBuilder}。 */ public MetaDataBindingBuilder<T> asEagerPrototype(); /** * 注册为单例模式。<p> * 单列模式:当类型被多个对象注入时,每个注入的类型实例都是同一个对象。 * 如果配置了{@link #toScope(Provider)}或者{@link #toScope(Scope)},那么该方法将会使它们失效。 * @return 返回 - {@link MetaDataBindingBuilder}。 */ public MetaDataBindingBuilder<T> asEagerSingleton(); /** * 设置Scope。 * @param scope 作用域 * @return 返回 - {@link MetaDataBindingBuilder}。 */ public MetaDataBindingBuilder<T> toScope(Scope scope); /** * 设置Scope。 * @param scope 作用域 * @return 返回 - {@link MetaDataBindingBuilder}。 */ public MetaDataBindingBuilder<T> toScope(Provider<Scope> scope); /** * 设置Scope。 * @param scopeName 作用域名 * @return 返回 - {@link MetaDataBindingBuilder}。 */ public MetaDataBindingBuilder<T> toScope(String scopeName); } /**绑定元信息*/ public interface MetaDataBindingBuilder<T> { /** * 设置元信息。 * @param key 元信息 key * @param value 元信息 value * @return 返回 - {@link MetaDataBindingBuilder}。 */ public MetaDataBindingBuilder<T> metaData(String key, Object value); /** * 转换为 {@link BindInfo} 接口对象。 * @return 返回{@link BindInfo}。 */ public BindInfo<T> toInfo(); } }