一、创建用户库
创建一个用户库,导入JAR包
二、模拟Spring容器
①、建立一个类ItcastClassPathApplicationContext
②、在这个类中读取XML文件
public class ItcastClassPathApplicationContext {
// 存放Bean的集合
private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
private Map<String,Object> sigletons = new HashMap<String, Object>();
public ItcastClassPathApplicationContext(String filename) {
this.readXML(filename);
//实例化Bean对象
this.instanceBeans();
}
//实例化Bean对象
private void instanceBeans() {
for(BeanDefinition beanDefinition : beanDefines){
try {
if(beanDefinition.getClassName()!=null && !"".equals(beanDefinition.getClassName().trim()))
sigletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
* 读取配置文件
*/
private void readXML(String filename) {
//创建一个读取器
SAXReader saxReader = new SAXReader();
Document document = null;
try {
//取得这个文件
URL xmlpath = this.getClass().getClassLoader()
.getResource(filename);
//读取文件内容
document = saxReader.read(xmlpath);
//新建一个Map对象
Map<String, String> nsMap = new HashMap<String, String>();
//读取配置的命名空间
nsMap.put("ns", "http://www.springframework.org/schema/beans");
// 创建beans/bean查询路径
XPath xsub = document.createXPath("//ns:beans/ns:bean");
xsub.setNamespaceURIs(nsMap);// 设置命名空间
List<Element> beans = xsub.selectNodes(document);// 获取文档下所有bean节点
//取得所有的Bean
for (Element element : beans) {
String id = element.attributeValue("id");// 获取id属性值
String clazz = element.attributeValue("class");
BeanDefinition beanDefine = new BeanDefinition(id, clazz);
//放到集合中
beanDefines.add(beanDefine);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取bean实例
* @param beanName
* @return
*/
public Object getBean(String beanName){
return this.sigletons.get(beanName);
}
}
③、建立存放Bean中id和Class的类——BeanDefinition
public class BeanDefinition {
private String id;
private String className;
public BeanDefinition(String id, String className) {
this.id = id;
this.className = className;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
④、建立一个单元测试
@Test public void instanceSpring(){
ItcastClassPathXMLApplicationContext ctx = new ItcastClassPathXMLApplicationContext("beans.xml");
PersonService personService = (PersonService)ctx.getBean("personService");
personService.save();
}
⑤、结果
调用save方法成功
三、Spring管理Bean的作用域
通过上面的代码,我们可以测试出,在容器启动时实例化bean。这时我们每次调用的bean是同一个bean,如果我们想每次从容器获取bean都是新的对象,则在bean中加入scope="prototype"