Qing преди 1 година
родител
ревизия
5c2ab39f45

+ 6 - 0
spring-demo/.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+  </component>
+</project>

+ 7 - 0
spring-demo/src/main/java/com/sf/self/BeanFactory.java

@@ -37,6 +37,13 @@ public class BeanFactory {
                 try {
                     Class beanClass =  Class.forName(classPath);
                     obj = beanClass.getDeclaredConstructor().newInstance();
+                    // name value
+                    // name zhangsan
+                    // desc something
+
+                    // setName -> invoke -> "zhangsan"
+                    // setDesc -> invoke -> "something"
+                    // 调用属性的set方法
                 } catch (Exception e) {
 //                    throw new RuntimeException(e);
                     e.printStackTrace();

+ 5 - 0
spring-demo/src/main/java/com/sf/self/PropertyDefined.java

@@ -5,6 +5,11 @@ public class PropertyDefined {
     private String name;
     private String value;
 
+    public PropertyDefined(String name, String value) {
+        this.name = name;
+        this.value = value;
+    }
+
     public String getName() {
         return name;
     }

+ 52 - 0
spring-demo/src/main/java/com/sf/self/lxl/BeanDefined.java

@@ -0,0 +1,52 @@
+package com.sf.self.lxl;
+
+import java.util.List;
+
+public class BeanDefined {
+    // bean的唯一id 一个名字
+    private String beanId;
+    // bean所对应的类路径
+    private String classPath;
+    // bean的子标签 property
+    private List<PropertyDefined> propertyDefinedList;
+    // name:name,value:zhangsan
+    // name:desc,value:something
+
+    public BeanDefined() {
+    }
+
+    public BeanDefined(String beanId, String classPath) {
+        this.beanId = beanId;
+        this.classPath = classPath;
+    }
+
+    public BeanDefined(String beanId, String classPath, List<PropertyDefined> propertyDefinedList) {
+        this.beanId = beanId;
+        this.classPath = classPath;
+        this.propertyDefinedList = propertyDefinedList;
+    }
+
+    public List<PropertyDefined> getPropertyDefinedList() {
+        return propertyDefinedList;
+    }
+
+    public void setPropertyDefinedList(List<PropertyDefined> propertyDefinedList) {
+        this.propertyDefinedList = propertyDefinedList;
+    }
+
+    public String getBeanId() {
+        return beanId;
+    }
+
+    public void setBeanId(String beanId) {
+        this.beanId = beanId;
+    }
+
+    public String getClassPath() {
+        return classPath;
+    }
+
+    public void setClassPath(String classPath) {
+        this.classPath = classPath;
+    }
+}

+ 56 - 0
spring-demo/src/main/java/com/sf/self/lxl/BeanFactory.java

@@ -0,0 +1,56 @@
+package com.sf.self.lxl;
+import java.lang.reflect.Field;
+import java.util.List;
+
+/**
+ * ClassName: BeanFactory
+ * Package: com.xl.self
+ * Description:
+ *
+ * @Author 李小龙
+ * @Create 2024/1/9 15:32
+ * @Version 1.0
+ */
+//生产bean的工厂
+// 先要获取对bean的配置 id class
+//    存储多个bean的配置 beanDefinedList
+public class BeanFactory {
+    //user com.xl.User
+    private List<BeanDefined> beanDefinedList;
+
+    public BeanFactory(List<BeanDefined> beanDefinedList) {
+        this.beanDefinedList = beanDefinedList;
+    }
+
+    public List<BeanDefined> getBeanDefinedList() {
+        return beanDefinedList;
+    }
+
+    public void setBeanDefinedList(List<BeanDefined> beanDefinedList) {
+        this.beanDefinedList = beanDefinedList;
+    }
+    //模拟通过beanId 获取bean
+    //返回的是对象
+    public Object getBean(String beanId){
+        Object obj = null;
+        for (BeanDefined beanDefined : beanDefinedList) {
+            //判断当前的bean是否是传进来的id
+            if (beanDefined.getBeanId().equals(beanId)){
+                String classPath = beanDefined.getClassPath();
+                List<PropertyDefined> propertyDefinedList = beanDefined.getPropertyDefinedList();
+                try {
+                    Class beanClass = Class.forName(classPath);
+                    obj = beanClass.getDeclaredConstructor().newInstance();
+                    for (PropertyDefined propertyDefined : propertyDefinedList) {
+                        Field declaredField = beanClass.getDeclaredField(propertyDefined.getName());
+                        declaredField.setAccessible(true);
+                        declaredField.set(obj,propertyDefined.getValue());
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return obj;
+    }
+}

+ 28 - 0
spring-demo/src/main/java/com/sf/self/lxl/PropertyDefined.java

@@ -0,0 +1,28 @@
+package com.sf.self.lxl;
+
+public class PropertyDefined {
+
+    private String name;
+    private String value;
+
+    public PropertyDefined(String name, String value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}

+ 33 - 0
spring-demo/src/main/java/com/sf/self/lxl/TestSelf.java

@@ -0,0 +1,33 @@
+package com.sf.self.lxl;
+
+import com.sf.User;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TestSelf {
+    public static void main(String[] args) {
+        BeanDefined userBean = new BeanDefined("user", "com.xl.User");
+        BeanDefined userBean1 = new BeanDefined("user1", "com.xl.User");
+
+        List<BeanDefined> list = new ArrayList<>();
+        list.add(userBean);
+        list.add(userBean1);
+
+        BeanFactory beanFactory = new BeanFactory(list);
+
+        List<PropertyDefined> listPro = new ArrayList<>();
+        PropertyDefined propertyDefined = new PropertyDefined("name", "tom");
+        PropertyDefined propertyDefined1 = new PropertyDefined("desc", "aaa");
+        listPro.add(propertyDefined);
+        listPro.add(propertyDefined1);
+        userBean.setPropertyDefinedList(listPro);
+
+        User user = (User) beanFactory.getBean("user");
+        User user1 = (User) beanFactory.getBean("user1");
+        System.out.println(user);
+        System.out.println(user1);
+
+
+    }
+}

+ 47 - 0
spring-demo/src/main/java/com/sf/self/zfx/BeanFactory.java

@@ -0,0 +1,47 @@
+package com.sf.self.zfx;
+
+import com.sf.User;
+import com.sf.self.BeanDefined;
+import com.sf.self.PropertyDefined;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+public class BeanFactory {
+
+    private List<BeanDefined> beanDefinedList;
+
+    public BeanFactory(List<BeanDefined> beanDefinedList) {
+        this.beanDefinedList = beanDefinedList;
+    }
+
+    public List<BeanDefined> getBeanDefinedList() {
+        return beanDefinedList;
+    }
+
+    public void setBeanDefinedList(List<BeanDefined> beanDefinedList) {
+        this.beanDefinedList = beanDefinedList;
+    }
+
+
+    /*通过bean的Id来获取bean*/
+    /*返回的是一个对象*/
+    public Object getBean(String beanId) throws Exception {
+        /*现在需要去遍历list*/
+        for (BeanDefined beanDefined : beanDefinedList) {
+            /*判断当前传递过来的id是否是当前列表遍历中的id*/
+            if (beanDefined.getBeanId().equals(beanId)){
+                Class<?> beanClass = Class.forName(beanDefined.getClassPath());
+                User user =(User) beanClass.getDeclaredConstructor().newInstance();
+                /*可以访问私有的属性么*/
+                for (PropertyDefined propertyDefined : beanDefined.getPropertyDefinedList()) {
+                    Field field = beanClass.getDeclaredField(propertyDefined.getName());
+                    field.setAccessible(true);
+                    field.set(user,propertyDefined.getValue());
+                }
+                return user;
+            }
+        }
+        return null;
+    }
+}

+ 29 - 0
spring-demo/src/main/java/com/sf/self/zfx/TestSelf.java

@@ -0,0 +1,29 @@
+package com.sf.self.zfx;
+
+import com.sf.User;
+import com.sf.self.BeanDefined;
+import com.sf.self.BeanFactory;
+import com.sf.self.PropertyDefined;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author 张甫鑫 by 2024/1/9 15:46
+ * 作用:
+ */
+public class TestSelf {
+    public static void main(String[] args) throws Exception {
+        /*这个是bean中的配置*/
+        List<PropertyDefined> listPro = new ArrayList<>();
+        listPro.add(new PropertyDefined("name", "tom"));
+        BeanDefined userBean = new BeanDefined("user", "com.sf.User",listPro);
+
+        List<BeanDefined> list = new ArrayList<>();
+        list.add(userBean);
+        BeanFactory beanFactory = new BeanFactory(list);
+
+        Object user = beanFactory.getBean("user");
+        System.out.println(user);
+    }
+}