Try   HackMD

spring ioc 自動注入 實現

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

掃描檔案目錄


public class UtilsScan {
    public  static void doScan(){
        String packagePath =  "D:\\Programming\\spring\\simplespringioc\\src\\main\\java\\com\\spring\\demo";
        File file = new File (packagePath );
        String[] childFile = file.list();
        for (String fileName : childFile) {
            System.out.println(fileName);

        }

    }

    public static void main(String[] args) {
        UtilsScan.doScan();
    }
}

掃描目錄下class

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


public class UtilsScan {
    public  static void doScan(){
        String packagePath =  "D:\\Programming\\spring\\simplespringioc\\src\\main\\java\\com\\spring\\demo";
        File file = new File (packagePath );
        String[] childFile = file.list();
        for (String fileName : childFile) {
            //System.out.println(fileName);
            File childfiletmp = new File( packagePath +"\\" +fileName);
            String classFileName[] = childfiletmp.list();
            for (String className : classFileName ){
                className = className.substring(0,className.indexOf("."));
                try {
                    System.out.println("com.spring." + fileName +"." + className);
                   Object sprinobject =  Class.forName("com.spring.demo." + fileName +"." + className).newInstance();
                    System.out.println(sprinobject);
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }

            }
        }

    }

    public static void main(String[] args) {
        UtilsScan.doScan();
    }
}


自定義註解
延伸閱讀
https://www.itread01.com/content/1544578219.html
目錄結構

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Autowired

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Autowired {
}

ComponentTest

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ComponentTest {
}

IndexDao


@ComponentTest
public class IndexDao {
    public String  index(){
        return "dao init";
    }
}

IndexService

@ComponentTest
public class IndexService {
    @Autowired
    IndexDao dao;
    public void index() {
        System.out.println("service init" +dao.index());
    }
}

UtilsScan

註解掃描 針對 @ComponentTest 第一層 掃描

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

public class UtilsScan {
    public  static void doScan(){
        String packagePath =  "D:\\Programming\\spring\\simplespringioc\\src\\main\\java\\com\\spring\\demo";
        File file = new File (packagePath );
        String[] childFile = file.list();
        for (String fileName : childFile) {
            //System.out.println(fileName);
            File childfiletmp = new File( packagePath +"\\" +fileName);
            String classFileName[] = childfiletmp.list();
            for (String className : classFileName ){
                className = className.substring(0,className.indexOf("."));
                Object object = null;
                try {
                    System.out.println("com.spring." + fileName +"." + className);
                    Class classtmp  =  Class.forName("com.spring.demo." + fileName +"." + className);
                        if(classtmp.isAnnotationPresent(ComponentTest.class))
                        {
                            object = classtmp.newInstance();
                            System.out.println( "ADD ComponentTest 註解 :"+object.getClass().getSimpleName());
                        }

                } catch(InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }

            }
        }

    }

    public static void main(String[] args) {
        UtilsScan.doScan();
    }
}

製作 ioc 容器

剛剛我們已經把有 ComponentTest 已經掃描出來了現在要把它放進去我們的 HashMap

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

public class UtilsScan {
    static List<Map <String , Object>> ioclist = new ArrayList<>();
    public  static void doScan(){
        String packagePath =  "D:\\Programming\\spring\\simplespringioc\\src\\main\\java\\com\\spring\\demo";
        File file = new File (packagePath );
        String[] childFile = file.list();
        for (String fileName : childFile) {
            //System.out.println(fileName);
            File childfiletmp = new File( packagePath +"\\" +fileName);
            String classFileName[] = childfiletmp.list();
            for (String className : classFileName ){
                className = className.substring(0,className.indexOf("."));
                Object object = null;
                try {
                    System.out.println("com.spring." + fileName +"." + className);
                    Class classtmp  =  Class.forName("com.spring.demo." + fileName +"." + className);
                        if(classtmp.isAnnotationPresent(ComponentTest.class))
                        {
                            object = classtmp.newInstance();
                            Map<String , Object>  map= new HashMap<>();
                            map.put(classtmp.getSimpleName() , object);
                            ioclist.add(map);
                            System.out.println( "ADD ComponentTest 註解 :"+object.getClass().getSimpleName()+"object :" +object);
                        }

                } catch(InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }

            }

        }
        System.out.println("ioclist hash map : "+ioclist);
    }

    public static void main(String[] args) {
        UtilsScan.doScan();
    }
}

dao service 新增建構元

@ComponentTest
public class IndexDao {
    public IndexDao(){
        System.out.println("IndexDao init" );
    }
    public String  index(){
        System.out.println("IndexDao index method call");
        return "dao init";
    }
}



@ComponentTest
public class IndexService {
    @Autowired
    IndexDao dao;
    public IndexService(){
        System.out.println("IndexService init" );
    }
    public void index() {
//        System.out.println("IndexService method call" +dao.index());

    }
}

AnnotationConfigApplicationContext

取得ioc 容器

public class AnnotationConfigApplicationContext {
    public  AnnotationConfigApplicationContext (){
        UtilsScan.doScan();
    }
    public Object getBean (String className)
    {
        for (Map<String, Object> map : UtilsScan.ioclist ){
            Object object = map.get(className);
            if(object!=null)
            {
                return object;
            }
        }
        return  null;
    }
}

test

新增test 類

public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext ();
        IndexService service = (IndexService) annotationConfigApplicationContext.getBean("IndexService");
        System.out.println(service);
    }
}

完成 IndexService Autowired


找到加了 Autowired 註解 並根據 這個類的屬性 來初始化 該屬性的對象

UtilsScan


public class UtilsScan {
    public static List<Map <String , Object>> ioclist = new ArrayList<>();
    public  static void doScan(){
        String packagePath =  "D:\\Programming\\spring\\simplespringioc\\src\\main\\java\\com\\spring\\demo";
        File file = new File (packagePath );
        String[] childFile = file.list();
        for (String fileName : childFile) {
            //System.out.println(fileName);
            File childfiletmp = new File( packagePath +"\\" +fileName);
            String classFileName[] = childfiletmp.list();
            for (String className : classFileName ){
                className = className.substring(0,className.indexOf("."));
                Object object = null;
                try {
                    System.out.println("com.spring." + fileName +"." + className);
                    Class classtmp  =  Class.forName("com.spring.demo." + fileName +"." + className);
                        if(classtmp.isAnnotationPresent(ComponentTest.class))
                        {
                            object = classtmp.newInstance();
                            Map<String , Object>  map= new HashMap<>();
                            map.put(classtmp.getSimpleName() , object);
                            ioclist.add(map);
                            System.out.println( "ADD ComponentTest 註解 :"+object.getClass().getSimpleName()+"object :" +object);
                        }

                } catch(InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }

            }

        }
        System.out.println("ioclist hash map : "+ioclist);
        /*
            Autowired
         */
        try {
            checkAutowried();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
    public static void checkAutowried() throws IllegalAccessException {
        for (Map <String , Object>  annotations: ioclist ){
            for ( String annotationkv : annotations.keySet()){
                Object tempObject =   annotations.get(annotationkv);
                Class tempClass = tempObject.getClass();
                Field[] fields = tempClass.getDeclaredFields();
                for (Field tempfield :  fields ){
                    if(tempfield.isAnnotationPresent(Autowired.class)) {
                        String targetName = tempfield.getType().getSimpleName();

                        for (Map<String, Object>  annotationchilds : ioclist ){
                            for (String annotationchildkv : annotationchilds.keySet() ){
                                if(annotationchilds.get(annotationchildkv).getClass().getSimpleName().equals(targetName) ){
                                    tempfield.setAccessible(true);
                                    tempfield.set(tempObject,annotationchilds.get(targetName));
                                }
                            }
                        }

                    }
                }
            }
        }
    }
    public static void main(String[] args) {
        UtilsScan.doScan();
    }
}

IndexService dao

@ComponentTest
public class IndexDao {
    public IndexDao(){
        System.out.println("IndexDao init" );
    }
    public String  index(){
        System.out.println("IndexDao index method call");
        return "dao init";
    }
}

@ComponentTest
public class IndexService {
    @Autowired
    IndexDao dao;
    public IndexService(){
        System.out.println("IndexService init" );
    }
    public void index() {
        System.out.println("IndexService method call" );
        dao.index();
    }
}


AnnotationConfigApplicationContext

public class AnnotationConfigApplicationContext {
    public  AnnotationConfigApplicationContext (){
        UtilsScan.doScan();
    }
    public Object getBean (String className)
    {
        for (Map<String, Object> map : UtilsScan.ioclist ){
            Object object = map.get(className);
            if(object!=null)
            {
                return object;
            }
        }
        return  null;
    }
}

run

public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext ();
        IndexService service = (IndexService) annotationConfigApplicationContext.getBean("IndexService");
        service.index();
        System.out.println(service);
    }
}