Spring (一) 加载配置文件,实例化类
jar:
dom4j.jar; jason-full.jar
public class JmiracleClassPathXmlApplicationContext {
private List<BeanDefinition> bds = new ArrayList<BeanDefinition>();
private Map<String, Object> sigletons = new HashMap<String, Object>();
public JmiracleClassPathXmlApplicationContext (String filename) {
readXml(filename);
instanceBeans();
}
private void readXml(String filename) {
SAXReader reader = new SAXReader();
Document doc = null;
try {
URL xmlPath = this.getClass().getClassLoader().getResource(filename); // 可以获取bin目录下的资源文件
doc = reader.read(xmlPath);
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);
// 获取文档下所有的bean
List<Element> beans = xsub.selectNodes(document);
for (Element e : beans) {
String id = e.attributeValue("id");
String clazz = e.attributeValue("class");
BeanDefinition d = new BeanDefinition(id, clazz);
bds.add(d);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void instanceBeans() {
for ( BeanDefinition beanD : bds ) {
try {
if ( beanD.getClassname() != null && !"".equals(beanD.getClassname())) {
// 通过反射获取类名对应的实例
sigletons.put(beanD.getId(), Class.forName(beanD.getClassname()).newInstance());
}
}catch (Exception e) {
e.printStackTrace()
}
}
}
public Object getBean(String beanName) {
return this.sigletons.get(beanName);
}
public static void main(String[] args) {
JmiracleClassPathXmlApplicationContext ctx = new JmiracleClassPathXmlApplicationContext("application.xml");
IService service = (IService)ctx.getBean("service");
service.sayHello();
}
}
class BeanDefinition {
private String id;
private String classname;
public BeanDefinition (String id, String classname) {
this.id = id;
this.classname = classname;
}
public String getId() {
return this.id;
}
public void setId(String id ) {
this.id = id;
}
public String getClassname () {
return this.classname;
}
public void setClassname(String classname ) {
this.classname = classname;
}
}
interface IService {
void sayHello();
}
class ServiceImpl implements IService {
public void sayHello () {
System.out.println("ServiceImp -> sayHello");
}
}
// application.xml
<bean id="service" class="ServiceImp" ></bean>
1、 三种实例化bean的方式
a. 使用类构造器实例化
<bean id="service" class="ServiceImpl" ></bean>
b. 使用静态工厂方法
<bean id="service" class="com.test.serviceFactory" factory-method="createService" ></bean>
public class serviceFactory {
public static ServiceImpl createService () {
return new ServiceImpl();
}
}
c. 使用实例工厂方法实例化
<bean id="serviceFactory" class="com.test.serviceFactory"></bean>
<bean id="service" factory-bean="serviceFactory" factory-method="createService" ></bean>
public class serviceFactory {
public ServiceImpl createService () {
return new ServiceImpl();
}
}