?????????????????????????
????import java.lang.reflect.Field;
????import java.net.URL;
????import java.util.ArrayList;
????import java.util.HashMap;
????import java.util.Iterator;
????import java.util.List;
????import java.util.Map;
????import org.dom4j.Document;
????import org.dom4j.Element;
????import org.dom4j.io.SAXReader;
????import fengzheng.fzAnnotation.MyAutowired;
????import java.util.stream.*;
????public class FzClassPathXMLApplication {
????//xml????????? bean????????
????private List<BeanDefine> beanList = new ArrayList<BeanDefine>();
????// ?洢bean?????bean??id??????? ???????????????????????????
????Map<String?? Object> beanInstanceList = new HashMap<String?? Object>();
????//xml????????? ???????????????  ??Spring????? ???????????????
????List<ScanDefine> scanList = new ArrayList<ScanDefine>();
????// ?洢?????????????彎??
????Map<String?? Object> annotationInstanceList = new HashMap<String?? Object>();
????public FzClassPathXMLApplication(String xmlName) {
????ReadXml(xmlName);
????//????????ж????bean
????BeanInstance();
????//????????е???????
????ScanClassInstance();
????//????????????????????
????InjectAnnotation();
????}
????/**
????* ??????????  ???bean???????????????
????* @param xmlFileName
????*/
????public void ReadXml(String xmlFileName) {
????URL xmlPath = this.getClass().getClassLoader().getResource(xmlFileName);
????System.out.println(xmlPath);
????SAXReader reader = new SAXReader();
????try {
????Document dom = reader.read(xmlPath);
????Element root = dom.getRootElement();
????List<Element> iters = root.elements();
????Stream<Element> beans = iters.stream().filter(bean -> bean.getName().equals("bean"));
????Iterator<Element> iterBeans = beans.iterator();
????while (iterBeans.hasNext()) {
????Element bean = iterBeans.next();
????String id = bean.attributeValue("id");
????String clsName = bean.attributeValue("class");
????//System.out.println("id:" + id + " class:" + clsName);
????BeanDefine bd = new BeanDefine();
????bd.setId(id);
????bd.setClsName(clsName);
????beanList.add(bd);
????}
????Stream<Element> scanClasses = iters.stream().filter(scan -> scan.getName().equals("component-scan"));
????//iters.stream().forEach(scan -> System.out.println(scan.getName()));
????Iterator<Element> iterScans = scanClasses.iterator();
????while (iterScans.hasNext()) {
????Element scan = iterScans.next();
????String id = scan.attributeValue("id");
????String clsName = scan.attributeValue("class");
????ScanDefine sd = new ScanDefine();
????sd.setId(id);
????sd.setClassName(clsName);
????scanList.add(sd);
????}
????System.out.println("scanList.size():"+scanList.size());
????} catch (Exception e) {
????e.printStackTrace();
????}
????}
????/**
????* ???bean???
????*/
????private void BeanInstance() {
????for (BeanDefine bd : beanList) {
????try {
????Object beanInstance = Class.forName(bd.getClsName()).newInstance();
????System.out.println(beanInstance.getClass().getName());
????beanInstanceList.put(bd.getId()?? beanInstance);
????} catch (Exception e) {
????e.printStackTrace();
????}
????}
????}
????/**
????* ????????????????????
????*/
????private void ScanClassInstance(){
????for(ScanDefine sd:scanList){
????try {
????Object scanInstance = Class.forName(sd.getClassName()).newInstance();
????System.out.println(scanInstance.getClass().getName());
????annotationInstanceList.put(sd.getId()?? scanInstance);
????} catch (Exception e) {
????e.printStackTrace();
????}
????}
????}
????/**
????* ???????????????
????*/
????public void InjectAnnotation() {
????Iterator<Map.Entry<String?? Object>> iters = annotationInstanceList.entrySet().iterator();
????while (iters.hasNext()) {
????Map.Entry<String?? Object> iter = iters.next();
????Object scanInstance = iter.getValue();
????InjectField(scanInstance);
????}
????}
????/**
????* ??????????????е?????MyAutowired????? ???bean???
????* @param injectClass
????*/
????private void InjectField(Object injectClass) {
????try {
????Field[] fields = injectClass.getClass().getDeclaredFields();
????for (Field field : fields) {
????if (field != null && field.isAnnotationPresent(MyAutowired.class)) {
????System.out.println(field.getName());
????MyAutowired myAutowired = field.getAnnotation(MyAutowired.class);
????String beanName = myAutowired.name();
????Object value = null;
????if (beanName != null && !beanName.equals("")) {
????value = beanInstanceList.get(beanName);
????} else {
????Class<?> fType = field.getType();
????for (String key : beanInstanceList.keySet()) {
????if (fType.isAssignableFrom(beanInstanceList.get(key).getClass())) {
????value = beanInstanceList.get(key);
????break;
????}
????}
????}
????field.setAccessible(true);
????field.set(injectClass?? value);
????}
????}
????} catch (Exception e) {
????e.printStackTrace();
????}
????}
????public Object getScan(String scanName){
????return this.annotationInstanceList.get(scanName);
????}
????}
???????????????????????????
????package fengzheng.simpleSpring;
????public class BeanDefine {
????private String id;
????private String clsName;
????public String getId() {
????return id;
????}
????public void setId(String id) {
????this.id = id;
????}
????public String getClsName() {
????return clsName;
????}
????public void setClsName(String clsName) {
????this.clsName = clsName;
????}
????}
????package fengzheng.simpleSpring;
????public class ScanDefine {
????public String id;
????public String 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;
????}
????}
????????γ????????????
????1.???????ReadXml()??????????????beans.xml????????е?bean????context:component-scan???????bean?????????BeanDefine????????beanList???????component-scan?????????ScanDefine????????scanList?????
????2.???BeanInstance()????????????????е?bean????????洢??Map????beanInstanceList?У?
????3.???ScanClassInstance()????????????????е?component-scan??????????????????????????Map????annotationInstanceList?У?
????4.???InjectAnnotation()??????????annotationInstanceList?????????е??@MyAutowired??????θ???????????bean???????
???????????????£?
????FzClassPathXMLApplication ctx = new FzClassPathXMLApplication("beans.xml");
????Test test =(Test) ctx.getScan("test");
????test.Say();