就是把每一个bean(实体类)与bean(实体类)之间的关系交给第三方容器进行管理。 而不是传统的在你的对象内部直接控制。
详细步骤:
maven
<dependencies>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
applicationContext.xml
<beans>
<bean id="user1" class="cn.qbz.thread.day1120.User">
<property name="name" value="xiaoMing"></property>
<property name="age" value="6"></property>
</bean>
<bean id="user2" class="cn.qbz.thread.day1120.User">
<property name="name" value="laoWang"></property>
<property name="age" value="99"></property>
</bean>
</beans>
package cn.qbz.thread.day1120;
public class User {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
package cn.qbz.thread.day1120;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.lang.reflect.Field;
import java.util.List;
public class ClassPathXmlApplicationContext {
private String xpath;
public ClassPathXmlApplicationContext(String xpath) {
this.xpath = xpath;
}
public Object getBean(String beanId) throws Exception {
if (isEmpty(beanId)) {
throw new Exception("bean Id is null !");
}
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(this.getClass().getClassLoader().getResource(xpath));
//获取到根节点
Element rootElement = document.getRootElement();
//获取到根节点下的所有的子节点
List<Element> elements = rootElement.elements();
for (Element element : elements) {
//获取到节点上的属性
String id = element.attributeValue("id");
if (isEmpty(id)) {
continue;
}
if (!id.equals(beanId)) {
continue;
}
// 使用java反射机制初始化对象
String beanClass = element.attributeValue("class");
Class<?> forName = Class.forName(beanClass);
Object newInstance = forName.newInstance();
List<Element> propertyElementList = element.elements();
for (Element el : propertyElementList) {
String name = el.attributeValue("name");
String value = el.attributeValue("value");
Field declaredField = forName.getDeclaredField(name);
declaredField.setAccessible(true);
declaredField.set(newInstance, value);
}
return newInstance;
}
return null;
}
public Boolean isEmpty(String str) {
return (str == null || "".equals(str.trim()));
}
}
package cn.qbz.thread.day1120;
public class SpringIOCTest {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext classPath = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) classPath.getBean("user2");
System.out.println(user.getName() + "---" + user.getAge());
}
}
注意: this.getClass().getClassLoader().getResourceAsStream(xmlPath) 获取当前项目路径xmlPath