简单的 IOC
-
先从简单的 IOC 容器实现开始,最简单的 IOC 容器只需4步即可实现,如下:
-
加载 xml 配置文件,遍历其中的标签
-
获取标签中的 id 和 class 属性,加载 class 属性对应的类,并创建 bean
-
遍历标签中的标签,获取属性值,并将属性值填充到 bean 中
将 bean 注册到 bean 容器中
如上所示,仅需4步即可,是不是觉得很简单。好了,Talk is cheap, Show me the code. 接下来要上代码了。不过客官别急,上代码前,容我对代码结构做一下简单介绍:
SimpleIOC// IOC 的实现类,实现了上面所说的4个步骤
SimpleIOCTest// IOC 的测试类
Car// IOC 测试使用的 bean
Wheel// 同上
ioc.xml// bean 配置文件
容器实现类 SimpleIOC 的代码:
容器测试使用的 bean 代码:
publicclassCar{
privateString name;
privateString length;
privateString width;
privateString height;
privateWheel wheel;
// 省略其他不重要代码
}
publicclassWheel{
privateString brand;
privateString specification ;
// 省略其他不重要代码
}
bean 配置文件 ioc.xml 内容:
IOC 测试类 SimpleIOCTest:
publicclassSimpleIOCTest{
@Test
publicvoidgetBean()throwsException{
String location = SimpleIOC.class.getClassLoader().getResource("spring-test.xml").getFile();
SimpleIOC bf =newSimpleIOC(location);
Wheel wheel = (Wheel) bf.getBean("wheel");
System.out.println(wheel);
Car car = (Car) bf.getBean("car");
System.out.println(car);
}
}
测试结果:
image以上是简单 IOC 实现的全部内容,难度不大,代码也不难看懂,这里不再多说了。下面说说简单 AOP 的实现。
publicclassSimpleIOC{
privateMap beanMap =newHashMap<>();
publicSimpleIOC(String location)throwsException{
loadBeans(location);
}
publicObjectgetBean(String name){
Object bean = beanMap.get(name);
if(bean ==null) {
thrownewIllegalArgumentException("there is no bean with name "+ name);
}
returnbean;
}
privatevoidloadBeans(String location)throwsException{
// 加载 xml 配置文件
InputStream inputStream =newFileInputStream(location);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document doc = docBuilder.parse(inputStream);
Element root = doc.getDocumentElement();
NodeList nodes = root.getChildNodes();
// 遍历 <bean> 标签
for(inti =0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
if(nodeinstanceofElement) {
Element ele = (Element) node;
String id = ele.getAttribute("id");
String className = ele.getAttribute("class");
// 加载 beanClass
Class beanClass =null;
try{
beanClass = Class.forName(className);
}catch(ClassNotFoundException e) {
e.printStackTrace();
return;
}
// 创建 bean
Object bean = beanClass.newInstance();
// 遍历 <property> 标签
NodeList propertyNodes = ele.getElementsByTagName("property");
for(intj =0; j < propertyNodes.getLength(); j++) {
Node propertyNode = propertyNodes.item(j);
if(propertyNodeinstanceofElement) {
Element propertyElement = (Element) propertyNode;
String name = propertyElement.getAttribute("name");
String value = propertyElement.getAttribute("value");
// 利用反射将 bean 相关字段访问权限设为可访问
Field declaredField = bean.getClass().getDeclaredField(name);
declaredField.setAccessible(true);
if(value !=null&& value.length() >0) {
// 将属性值填充到相关字段中
declaredField.set(bean, value);
}else{
String ref = propertyElement.getAttribute("ref");
if(ref ==null|| ref.length() ==0) {
thrownewIllegalArgumentException("ref config error");
}
// 将引用填充到相关字段中
declaredField.set(bean, getBean(ref));
}
// 将 bean 注册到 bean 容器中
registerBean(id, bean);
}
}
}
}
}
privatevoidregisterBean(String id, Object bean){
beanMap.put(id, bean);
}
}
```
网友评论