/*
* 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.test.hasor.core._01_bean;
import com.alibaba.fastjson.JSON;
import net.hasor.core.ApiBinder;
import net.hasor.core.AppContext;
import net.hasor.core.Hasor;
import net.hasor.core.Module;
import net.test.hasor.core._01_bean.pojo.*;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 1.beanTest
* 基本的Bean用法。
* 2.interfaceBindTest
* 给一个接口指定一个实现类。
* 3.nameBindTest
* 用名字区分相同类型的两个不同Bean。
* 4.singletonDefaultBeanTest
* 框架配置成默认单例模式。
* 5.singletonDefaultBeanTest
* 框架配置成默认单例模式。
* 6.customBeanTest
* 托管一个自己创建的Bean,被托管的Bean将成为单例。
* 7.idBeanTest
* 为Bean起一个唯一的名字,然后通过名字获取它。
* 8.factoryBeanTest
* 工厂方式创建Bean。
*
* @version : 2015年11月6日
* @author 赵永春(zyc@hasor.net)
*/
public class BeanTest {
protected Logger logger = LoggerFactory.getLogger(getClass());
//
/* Bean */
@Test
public void beanTest() {
System.out.println("--->>beanTest<<--");
AppContext appContext = Hasor.createAppContext();
logger.debug("---------------------------------------------");
//
PojoBean myBean = appContext.getInstance(PojoBean.class);
//
logger.debug(JSON.toJSONString(myBean));
assert myBean != null;
}
//
/* 为一个类型指定一个实现类。 */
@Test
public void interfaceBindTest() {
System.out.println("--->>interfaceBindTest<<--");
AppContext appContext = Hasor.createAppContext(new Module() {
public void loadModule(ApiBinder apiBinder) throws Throwable {
/*为一个类型指定一个实现类*/
apiBinder.bindType(PojoInfo.class).to(PojoBean.class);
}
});
logger.debug("---------------------------------------------");
//
//通过类型获取实现类实例。
PojoInfo myBean1 = appContext.getInstance(PojoInfo.class);
IntefaceBean myBean2 = appContext.getInstance(IntefaceBean.class);
//
logger.debug(JSON.toJSONString(myBean1));
logger.debug(JSON.toJSONString(myBean2));
assert myBean1 != null;
assert myBean2 != null;
assert myBean1 != myBean2;
}
//
/* 根据名字区分同一个类型的两个Bean。 */
@Test
public void nameBindTest() {
System.out.println("--->>nameBindTest<<--");
AppContext appContext = Hasor.createAppContext(new Module() {
public void loadModule(ApiBinder apiBinder) throws Throwable {
//根据名字区分同一个类型的两个Bean。
// - 例子中通过为不同的Bean注入不同的值用来区分它们。
apiBinder.bindType(PojoInfo.class).nameWith("UserA").to(PojoBean.class).injectValue("name", "马A");
apiBinder.bindType(PojoInfo.class).nameWith("UserB").to(PojoBean.class).injectValue("name", "小六");
}
});
logger.debug("---------------------------------------------");
//
PojoInfo userA = appContext.findBindingBean("UserA", PojoInfo.class);
PojoInfo userB = appContext.findBindingBean("UserB", PojoInfo.class);
//
logger.debug("userA :" + JSON.toJSONString(userA));
logger.debug("userB :" + JSON.toJSONString(userB));
assert userA.getName().equals("马A");
assert userB.getName().equals("小六");
}
//
/* 单例模式,结果为:true,false,true */
@Test
public void singletonDefaultBeanTest() {
System.out.println("--->>singletonDefaultBeanTest<<--");
AppContext appContext = Hasor.createAppContext("default-singleton-config.xml", new Module() {
public void loadModule(ApiBinder apiBinder) throws Throwable {
apiBinder.bindType(PojoBean.class).asEagerSingleton();//单例模式
apiBinder.bindType(InitBean.class).asEagerPrototype();//原型模式
}
});
logger.debug("---------------------------------------------");
//
PojoInfo objectA = appContext.getInstance(PojoBean.class);
PojoInfo objectB = appContext.getInstance(PojoBean.class);
logger.debug("objectA eq objectB = " + (objectA == objectB));//单例
assert objectA == objectB;
//
InitBean objectC = appContext.getInstance(InitBean.class);
InitBean objectD = appContext.getInstance(InitBean.class);
logger.debug("objectC eq objectD = " + (objectC == objectD));//原型
assert objectC != objectD;
//
InitBean2 objectE = appContext.getInstance(InitBean2.class);
InitBean2 objectF = appContext.getInstance(InitBean2.class);
logger.debug("objectE eq objectF = " + (objectE == objectF));//跟随框架默认配置
assert objectE == objectF;// <- 注意这里
}
//
/* 原型模式,结果为:true,false,false */
@Test
public void prototypeDefaultBeanTest() {
System.out.println("--->>singletonDefaultBeanTest<<--");
AppContext appContext = Hasor.createAppContext(new Module() {
public void loadModule(ApiBinder apiBinder) throws Throwable {
apiBinder.bindType(PojoBean.class).asEagerSingleton();//单例模式
apiBinder.bindType(InitBean.class).asEagerPrototype();//原型模式
}
});
logger.debug("---------------------------------------------");
//
PojoInfo objectA = appContext.getInstance(PojoBean.class);
PojoInfo objectB = appContext.getInstance(PojoBean.class);
logger.debug("objectA eq objectB = " + (objectA == objectB));//单例
assert objectA == objectB;
//
InitBean objectC = appContext.getInstance(InitBean.class);
InitBean objectD = appContext.getInstance(InitBean.class);
logger.debug("objectC eq objectD = " + (objectC == objectD));//原型
assert objectC != objectD;
//
InitBean2 objectE = appContext.getInstance(InitBean2.class);
InitBean2 objectF = appContext.getInstance(InitBean2.class);
logger.debug("objectE eq objectF = " + (objectE == objectF));//跟随框架默认配置
assert objectE != objectF; // <- 注意这里
}
//
/* 托管一个自己创建的Bean,被托管的Bean将成为单例。 */
@Test
public void customBeanTest() {
System.out.println("--->>customBeanTest<<--");
AppContext appContext = Hasor.createAppContext(new Module() {
public void loadModule(ApiBinder apiBinder) throws Throwable {
PojoBean pojo = new PojoBean();
pojo.setName("马大帅");
apiBinder.bindType(PojoBean.class).toInstance(pojo);
}
});
logger.debug("---------------------------------------------");
//
PojoInfo objectA = appContext.getInstance(PojoBean.class);
PojoInfo objectB = appContext.getInstance(PojoBean.class);
//
logger.debug("objectBody :" + JSON.toJSONString(objectA));
logger.debug("objectA eq objectB = " + (objectA == objectB));
assert objectA.getName().equals("马大帅");
assert objectA == objectB;
}
//
/* 为Bean起一个唯一的名字,然后通过名字获取它。 */
@Test
public void idBindBeanTest() {
System.out.println("--->>idBindBeanTest<<--");
//1.创建一个标准的 Hasor 容器。
AppContext appContext = Hasor.createAppContext(new Module() {
public void loadModule(ApiBinder apiBinder) throws Throwable {
//Bean1
apiBinder.bindType(PojoBean.class).idWith("myBean1");
//Bean2
PojoBean pojo = new PojoBean();
pojo.setName("刘三姐");
apiBinder.bindType(PojoBean.class).idWith("myBean2").toInstance(pojo);
}
});
logger.debug("---------------------------------------------");
//
PojoBean myBean1 = appContext.getInstance("myBean1");
PojoBean myBean2 = appContext.getInstance("myBean2");
logger.debug("myBean1 :" + JSON.toJSONString(myBean1));
logger.debug("myBean2 :" + JSON.toJSONString(myBean2));
assert myBean1 != null && myBean2 != null;
assert myBean1 != myBean2;
assert myBean2.getName().equals("刘三姐");
}
//
/* 工厂方式创建Bean */
@Test
public void factoryBeanTest() {
System.out.println("--->>factoryBeanTest<<--");
AppContext appContext = Hasor.createAppContext(new Module() {
public void loadModule(ApiBinder apiBinder) throws Throwable {
apiBinder.bindType(PojoInfo.class).toProvider(new PojoBeanFactory());
}
});
logger.debug("---------------------------------------------");
//
PojoInfo myBean = appContext.getInstance(PojoInfo.class);
logger.debug(JSON.toJSONString(myBean));
assert PojoBeanFactory.called;
PojoBeanFactory.called = false;
}
}