spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。一般情况下,都是使用它的实现类ApplicationContext,这个类解析配置好的的applicationContext.xml,或者指定路径的xml文件,然后它就会根据xml文件里面配置的bean来new对象,这些对象会被放进Map中,我们可以通过获取Map的键值对来获取相应的对象。
1、创建一个maven工程项目
2、引入需要的依赖
因为需要用到dom4j和jaxen来解析xml文件,所以需要引入这两个依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mybeanfactorydemo</groupId>
<artifactId>mybeanfactorydemo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/jaxen/jaxen -->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
</project>
3、相关源码
public interface MyBeanFactory {
Object getBean(String id);
}
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyClassPathXmlApplicationContext implements MyBeanFactory{
//用map管理从xml文件解析出的对象
private Map<String,Object> map = new HashMap<String, Object>();
public MyClassPathXmlApplicationContext(String fileName) throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read(new File(fileName));//读取文件
List<Element> elements = document.selectNodes("/beans/bean");//获取beans节点下的所有bean节点
for(Element e:elements){
String id = e.attributeValue("id");//获取节点id属性的值
String value = e.attributeValue("class");//获取节点class属性的值
Object o = Class.forName(value).newInstance();//反射机制实例化对象
map.put(id,o);
}
}
public Object getBean(String id) {
return map.get(id);
}
}
运用工厂模式,创建Animal接口以及相关实现类
package springdemo;
public interface Animal {
void say();
}
package springdemo;
public class Dog implements Animal {
public void say() {
System.out.println("dog say:wang!wang!");
}
}
package springdemo;
public class Cat implements Animal {
public void say() {
System.out.println("cat say:miao!miao!");
}
}
xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="cat" class="springdemo.Cat"></bean>
<bean id="dog" class="springdemo.Dog"></bean>
</beans>
测试
import springdemo.Animal;
public class Test {
public static void main(String[] args)throws Exception{
MyBeanFactory myBeanFactory = new MyClassPathXmlApplicationContext("src/main/resources/config.xml");
Object o = myBeanFactory.getBean("dog");
((Animal)o).say();
}
}
运行结果
dog say:wang!wang!