Преглед на файлове

0110 bean的配置与单例

Qing преди 1 година
родител
ревизия
e639bec95f
променени са 24 файла, в които са добавени 676 реда и са изтрити 17 реда
  1. 43 0
      spring-demo/src/main/java/com/sf/Auth.java
  2. 48 0
      spring-demo/src/main/java/com/sf/Role.java
  3. 75 9
      spring-demo/src/main/java/com/sf/User.java
  4. 21 0
      spring-demo/src/main/java/com/sf/lifecycle/MyBeanPost.java
  5. 30 0
      spring-demo/src/main/java/com/sf/list/Chair.java
  6. 48 0
      spring-demo/src/main/java/com/sf/list/House.java
  7. 22 3
      spring-demo/src/main/java/com/sf/self/TestSelf.java
  8. 25 0
      spring-demo/src/main/java/com/sf/singleton/Singleton1.java
  9. 21 0
      spring-demo/src/main/java/com/sf/singleton/Singleton2.java
  10. 27 0
      spring-demo/src/main/java/com/sf/singleton/Singleton3.java
  11. 10 0
      spring-demo/src/main/java/com/sf/singleton/Singleton4.java
  12. 28 0
      spring-demo/src/main/java/com/sf/singleton/Test.java
  13. 3 1
      spring-demo/src/main/java/com/sf/test/TestReflect.java
  14. 12 0
      spring-demo/src/main/resources/bean-lifecycle.xml
  15. 51 0
      spring-demo/src/main/resources/bean-list.xml
  16. 12 0
      spring-demo/src/main/resources/bean-other.xml
  17. 17 0
      spring-demo/src/main/resources/bean-prototype.xml
  18. 31 1
      spring-demo/src/main/resources/bean.xml
  19. 99 0
      spring-demo/src/test/java/com/sf/TestBean.java
  20. 23 0
      spring-demo/src/test/java/com/sf/TestBeanList.java
  21. 27 0
      spring-demo/src/test/java/com/sf/TestPrototype.java
  22. 1 1
      spring-demo/src/test/java/com/sf/student/TestLSY.java
  23. 1 1
      spring-demo/src/test/java/com/sf/student/TestTang.java
  24. 1 1
      spring-demo/src/test/java/com/sf/student/TestZFX.java

+ 43 - 0
spring-demo/src/main/java/com/sf/Auth.java

@@ -0,0 +1,43 @@
+package com.sf;
+
+/**
+ * 权限
+ */
+public class Auth {
+
+    private String name;
+
+    public Auth() {
+        System.out.println("Auth");
+        System.out.println("第一步,无参构造器执行了");
+    }
+
+    public Auth(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        System.out.println("Auth setName");
+        System.out.println("第二步,setName 方法被执行," + name + "属性被注入");
+        this.name = name;
+    }
+
+    public void init() {
+        System.out.println("第四步,bean初始化方法");
+    }
+
+    public void destroy() {
+        System.out.println("第七步,bean对象销毁方法");
+    }
+
+    @Override
+    public String toString() {
+        return "Auth{" +
+                "name='" + name + '\'' +
+                '}';
+    }
+}

+ 48 - 0
spring-demo/src/main/java/com/sf/Role.java

@@ -0,0 +1,48 @@
+package com.sf;
+
+/**
+ * 角色
+ */
+public class Role {
+
+    private String roleName;
+
+    private Auth auth;
+
+    // 在没有写构造器的时候,有一个默认的无参构造器
+    // 一旦写了构造器,就没有默认构造器了
+
+    // 一定要有 无参构造器!!!!
+    public Role() {
+        System.out.println("Role");
+    }
+
+    public Role(String roleName) {
+        this.roleName = roleName;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        System.out.println("Role setRoleName ");
+        this.roleName = roleName;
+    }
+
+    public Auth getAuth() {
+        return auth;
+    }
+
+    public void setAuth(Auth auth) {
+        this.auth = auth;
+    }
+
+    @Override
+    public String toString() {
+        return "Role{" +
+                "roleName='" + roleName + '\'' +
+                ", auth=" + auth +
+                '}';
+    }
+}

+ 75 - 9
spring-demo/src/main/java/com/sf/User.java

@@ -28,14 +28,81 @@ package com.sf;
 //      hashCode()  equals()  toString()
 public class User {
 
+    // 修改类结构的时候
+    // 声明属性  添加get set  添加全参构造器  重写toString
     private String name;
     private String desc;
 
+    // User类有一个属性  Role类的对象
+    //  zhangsan  "admin"
+    private Role role;
+    // Auth类的对象
+    //  zhangsan  "CRUD"
+    private Auth auth;
+
+    {
+//        System.out.println("User");
+    }
+
+    public User() {
+        System.out.println("User");
+//        this.name = "name";
+    }
+
+    public User(String name) {
+        System.out.println("User by name");
+        this.name = name;
+    }
+
+    /**
+     *     <bean id="user1" class="com.sf.User">
+     *         <constructor-arg name="desc" value="nothing"></constructor-arg>
+     *         <constructor-arg name="name" value="lisi"></constructor-arg>
+     *     </bean>
+     *
+     * @param name
+     * @param desc
+     */
+    public User(String name, String desc) {
+        System.out.println("User by name and desc");
+        this.name = name;
+        this.desc = desc;
+    }
+
+    public User(String name, String desc, Role role) {
+        this.name = name;
+        this.desc = desc;
+        this.role = role;
+    }
+
+//    public User(String desc, Role role, String name) {
+//        this.name = name;
+//        this.desc = desc;
+//        this.role = role;
+//    }
+
+    public User(String name, String desc, Role role, Auth auth) {
+        this.name = name;
+        this.desc = desc;
+        this.role = role;
+        this.auth = auth;
+    }
+
+    public Role getRole() {
+        return role;
+    }
+
+    public void setRole(Role role) {
+        System.out.println("User setRole ");
+        this.role = role;
+    }
+
     public String getName() {
         return name;
     }
 
     public void setName(String name) {
+        System.out.println("User setName ");
         this.name = name;
     }
 
@@ -44,20 +111,17 @@ public class User {
     }
 
     public void setDesc(String desc) {
+        System.out.println("User setDesc ");
         this.desc = desc;
     }
 
-    {
-//        System.out.println("User");
+    public Auth getAuth() {
+        return auth;
     }
 
-    public User() {
-//        System.out.println("User");
-    }
-
-    public User(String name) {
-        System.out.println("User by name");
-        this.name = name;
+    public void setAuth(Auth auth) {
+        System.out.println("User setAuth ");
+        this.auth = auth;
     }
 
     @Override
@@ -65,6 +129,8 @@ public class User {
         return "User{" +
                 "name='" + name + '\'' +
                 ", desc='" + desc + '\'' +
+                ", role=" + role +
+                ", auth=" + auth +
                 '}';
     }
 }

+ 21 - 0
spring-demo/src/main/java/com/sf/lifecycle/MyBeanPost.java

@@ -0,0 +1,21 @@
+package com.sf.lifecycle;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+
+public class MyBeanPost implements BeanPostProcessor {
+
+    @Override
+    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+        System.out.println("第三步,bean的后置处理器(初始化之前)");
+        System.out.println(beanName + "\t" + bean);
+        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
+    }
+
+    @Override
+    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+        System.out.println("第五步,bean的后置处理器(初始化之后)");
+        System.out.println(beanName + "\t" + bean);
+        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
+    }
+}

+ 30 - 0
spring-demo/src/main/java/com/sf/list/Chair.java

@@ -0,0 +1,30 @@
+package com.sf.list;
+
+/**
+ * 椅子
+ */
+public class Chair {
+
+    private int num;
+
+    // ctrl + n 生成的快捷键
+    public Chair() {
+        System.out.println("Chair");
+    }
+
+    public int getNum() {
+        return num;
+    }
+
+    public void setNum(int num) {
+        System.out.println("Chair setNum");
+        this.num = num;
+    }
+
+    @Override
+    public String toString() {
+        return "Chair{" +
+                "num=" + num +
+                '}';
+    }
+}

+ 48 - 0
spring-demo/src/main/java/com/sf/list/House.java

@@ -0,0 +1,48 @@
+package com.sf.list;
+
+import java.util.List;
+
+/**
+ * 房子 屋子
+ */
+public class House {
+
+    private String addr;
+
+    private List<Chair> chairList;
+
+    public House() {
+        System.out.println("House");
+    }
+
+    public House(String addr, List<Chair> chairList) {
+        this.addr = addr;
+        this.chairList = chairList;
+    }
+
+    public String getAddr() {
+        return addr;
+    }
+
+    public void setAddr(String addr) {
+        System.out.println("House setAddr");
+        this.addr = addr;
+    }
+
+    public List<Chair> getChairList() {
+        return chairList;
+    }
+
+    public void setChairList(List<Chair> chairList) {
+        System.out.println("House setChairList");
+        this.chairList = chairList;
+    }
+
+    @Override
+    public String toString() {
+        return "House{" +
+                "addr='" + addr + '\'' +
+                ", chairList=" + chairList +
+                '}';
+    }
+}

+ 22 - 3
spring-demo/src/main/java/com/sf/self/TestSelf.java

@@ -1,5 +1,6 @@
 package com.sf.self;
 
+import com.sf.Role;
 import com.sf.User;
 
 import java.util.ArrayList;
@@ -11,12 +12,30 @@ public class TestSelf {
         BeanDefined userBean = new BeanDefined("user","com.sf.User");
         BeanDefined userBean1 = new BeanDefined("user1","com.sf.User");
 
+        /**
+         *     <bean id="user" class="com.sf.User"></bean>
+         *     <bean id="user1" class="com.sf.User"></bean>
+         */
+        // 识别bean.xml的过程
         List<BeanDefined> list = new ArrayList<>();
         list.add(userBean);
         list.add(userBean1);
 
-        BeanFactory beanFactory = new BeanFactory(list);
-        User user = (User) beanFactory.getBean("user");
-        System.out.println(user);
+        /**
+         *     <bean id="role" class="com.sf.Role"></bean>
+         */
+        BeanDefined roleBean = new BeanDefined("role","com.sf.Role");
+        List<BeanDefined> listOther = new ArrayList<>();
+        list.add(roleBean);
+//        list.add(userBean1);
+
+        // 创建bean和生产bean的工厂 , 把识别出来的所有对bean的配置,传入工厂
+//        BeanFactory beanFactory = new BeanFactory(list);
+        BeanFactory beanFactory = new BeanFactory(listOther);
+//        User user = (User) beanFactory.getBean("user");
+//        System.out.println(user);
+
+        Role role = (Role) beanFactory.getBean("role");
+        System.out.println(role);
     }
 }

+ 25 - 0
spring-demo/src/main/java/com/sf/singleton/Singleton1.java

@@ -0,0 +1,25 @@
+package com.sf.singleton;
+
+/**
+ * 只创建一个实例(对象)
+ * 单例模式
+ */
+public class Singleton1 {
+
+    // 只能自己创建了 别人无法调用构造器
+    // 不管饿不饿 先把饭准备好  表现为“饿过” 「饿汉式」
+    private static Singleton1 instance = new Singleton1();
+
+    // 创建对象通过 构造器
+    //   如果构造器暴露在外  谁都能调用
+    //   构造器就得设置为 私有的
+    private Singleton1(){}
+
+    // 提供给别人使用
+    //   返回当前创建好的对象  默认的方法是被对象调用的
+    //   别人在没有对象时  需要调用的方法 使用static修饰
+    public static Singleton1 getInstance(){
+        return instance;
+    }
+
+}

+ 21 - 0
spring-demo/src/main/java/com/sf/singleton/Singleton2.java

@@ -0,0 +1,21 @@
+package com.sf.singleton;
+
+public class Singleton2 {
+
+    // static 代表 这个属性是类唯一的
+    private static Singleton2 instance;
+
+    // 单例
+    private Singleton2(){}
+
+    public static Singleton2 getInstance(){
+        // 不用不创建  用了再创建
+        //  不饿不吃饭  饿了再说  称之为“懒汉式”
+        //    不用不加载  叫做 “懒加载”   懒汉相比饿汉  设计的思路是更好的
+        //  在第一次调用这个方法时  判断 对象是否被创建过
+        if(instance == null){
+            instance = new Singleton2();
+        }
+        return instance;
+    }
+}

+ 27 - 0
spring-demo/src/main/java/com/sf/singleton/Singleton3.java

@@ -0,0 +1,27 @@
+package com.sf.singleton;
+
+/**
+ * 单例第二好的实现方式
+ * 面向对象  类(属性 方法 构造器 代码块 内部类/静态内部类)
+ */
+public class Singleton3 {
+
+    // 内部类 在外部类里面再创建一个类  可以被修饰为static
+    private static class SingletonSub{
+        // 一旦创建出来  就不再有变化
+//        private static final Singleton3 instance = new Singleton3();
+        private static final Singleton3 INSTANCE = new Singleton3();
+    }
+
+    // 可以看作是方法
+//    private static void singletonSub(){
+//    }
+
+    private Singleton3(){}
+
+    public static Singleton3 getInstance(){
+        // 静态内部类的名字 + 静态属性的名字
+        //  类中静态的都只有一个 -》 静态内部类只有一个 -》 静态的且不变的属性(常量)
+        return SingletonSub.INSTANCE;
+    }
+}

+ 10 - 0
spring-demo/src/main/java/com/sf/singleton/Singleton4.java

@@ -0,0 +1,10 @@
+package com.sf.singleton;
+
+/**
+ * 单例最好的实现方式
+ * 枚举
+ */
+public enum Singleton4 {
+    INSTANCE;
+    // public static final Singleton4 INSTANCE = new Singleton4();
+}

+ 28 - 0
spring-demo/src/main/java/com/sf/singleton/Test.java

@@ -0,0 +1,28 @@
+package com.sf.singleton;
+
+public class Test {
+
+    public static void main(String[] args) {
+        // 'Singleton1()' has private access in 'com.sf.singleton.Singleton1'
+//        new Singleton1();
+
+        Singleton1 instance = Singleton1.getInstance();
+        Singleton1 instance1 = Singleton1.getInstance();
+        // 验证单例的方式  调用这个方法无论多少次  得到的都是同一个对象
+        System.out.println(instance == instance1);
+
+        Singleton2 singleton2 = Singleton2.getInstance();
+        Singleton2 singleton22 = Singleton2.getInstance();
+        System.out.println(singleton2 == singleton22);
+
+        Singleton3 singleton3 = Singleton3.getInstance();
+        Singleton3 singleton33 = Singleton3.getInstance();
+        System.out.println(singleton3 == singleton33);
+
+        Singleton4 singleton4 = Singleton4.INSTANCE;
+        Singleton4 singleton44 = Singleton4.INSTANCE;
+        System.out.println(singleton4 == singleton44);
+        // Enum types cannot be instantiated
+//        new Singleton4();
+    }
+}

+ 3 - 1
spring-demo/src/main/java/com/sf/TestReflect.java → spring-demo/src/main/java/com/sf/test/TestReflect.java

@@ -1,4 +1,4 @@
-package com.sf;
+package com.sf.test;
 
 // 反射
 // 面向对象
@@ -13,6 +13,8 @@ package com.sf;
 // 代码也是对象
 //   User是类的对象   name是属性的对象   String是属性的数据类型对象  setName是方法的对象
 
+import com.sf.User;
+
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;

+ 12 - 0
spring-demo/src/main/resources/bean-lifecycle.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+        https://www.springframework.org/schema/beans/spring-beans.xsd">
+
+    <bean id="auth" class="com.sf.Auth" scope="singleton"
+          init-method="init" destroy-method="destroy">
+        <property name="name" value="CRUD"></property>
+    </bean>
+    <bean id="myBeanPost" class="com.sf.lifecycle.MyBeanPost"></bean>
+</beans>

+ 51 - 0
spring-demo/src/main/resources/bean-list.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+        https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
+
+    <bean id="house4" class="com.sf.list.House">
+        <property name="addr" value="朗威大厦4层"></property>
+        <property name="chairList">
+            <list>
+                <ref bean="chair1"></ref>
+                <ref bean="chair2"></ref>
+                <ref bean="chair3"></ref>
+            </list>
+        </property>
+    </bean>
+
+    <bean id="house6" class="com.sf.list.House">
+        <property name="addr" value="朗威大厦6层"></property>
+        <property name="chairList">
+            <list>
+                <ref bean="chair1"></ref>
+                <ref bean="chair2"></ref>
+                <ref bean="chair3"></ref>
+            </list>
+        </property>
+    </bean>
+
+    <bean id="chair1" class="com.sf.list.Chair">
+        <property name="num" value="1"></property>
+    </bean>
+    <bean id="chair2" class="com.sf.list.Chair">
+        <property name="num" value="2"></property>
+    </bean>
+    <bean id="chair3" class="com.sf.list.Chair">
+        <property name="num" value="3"></property>
+    </bean>
+
+
+    <util:list id="chairUtilList">
+        <ref bean="chair1"/>
+        <ref bean="chair2"></ref>
+        <ref bean="chair3"></ref>
+    </util:list>
+    <bean id="house4_1" class="com.sf.list.House">
+        <property name="addr" value="朗威大厦4层左手第一个教室"></property>
+        <property name="chairList" ref="chairUtilList"></property>
+    </bean>
+
+</beans>

+ 12 - 0
spring-demo/src/main/resources/bean-other.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+        https://www.springframework.org/schema/beans/spring-beans.xsd">
+
+
+    <bean id="role" class="com.sf.Role">
+<!--        <property name="roleName" value="admin"></property>-->
+        <property name="roleName" value="admin"/>
+    </bean>
+</beans>

+ 17 - 0
spring-demo/src/main/resources/bean-prototype.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+        https://www.springframework.org/schema/beans/spring-beans.xsd">
+
+    <!-- 通过scope(作用域) 设置为多例 -->
+    <bean id="auth" class="com.sf.Auth" scope="prototype">
+        <!-- 全部 CRUD  R-->
+        <property name="name" value="R"></property>
+    </bean>
+
+    <bean id="role" class="com.sf.Role" scope="singleton">
+        <property name="auth" ref="auth"></property>
+    </bean>
+
+</beans>

+ 31 - 1
spring-demo/src/main/resources/bean.xml

@@ -10,8 +10,38 @@
         <!--    本质上是调用属性的set方法  官网上叫做set注入-->
         <property name="name" value="zhangsan"></property>
         <property name="desc" value="something"></property>
+        <!-- 当关联了多个对象时  也是按照顺序先创建出要关联的对象 然后将属性依次赋值 -->
+        <property name="role" ref="role"></property>
+        <property name="auth" ref="auth"></property>
     </bean>
 
 
-    <bean id="user1" class="com.sf.User"></bean>
+    <bean id="user1" class="com.sf.User">
+        <constructor-arg name="name" value="lisi"></constructor-arg>
+        <constructor-arg name="desc" value="nothing"></constructor-arg>
+        <constructor-arg name="role" ref="role"></constructor-arg>
+    </bean>
+
+    <bean id="user2" class="com.sf.User">
+        <property name="name">
+            <null/>
+        </property>
+<!--        <property name="desc" value="<>"></property>-->
+<!--        <property name="desc" value="&lt;&gt;"></property>-->
+        <property name="desc">
+            <!--&lt;&gt; 可以理解为  <> 的转义字符-->
+            <!--如果涉及多个字符 不想自己转化 可以使用CDATA文本结构 实际赋值的是![CDATA[ 内容 ]]-->
+            <value><![CDATA[a < b]]></value>
+        </property>
+    </bean>
+
+    <bean id="role" class="com.sf.Role">
+        <!--        <property name="roleName" value="admin"></property>-->
+        <property name="roleName" value="admin"/>
+    </bean>
+
+    <bean id="auth" class="com.sf.Auth">
+        <!--        <property name="roleName" value="admin"></property>-->
+        <property name="name" value="增删改查"/>
+    </bean>
 </beans>

+ 99 - 0
spring-demo/src/test/java/com/sf/TestBean.java

@@ -19,6 +19,50 @@ public class TestBean {
         System.out.println(user1);
     }
 
+    @Test
+    public void testOther(){
+        ApplicationContext context = new ClassPathXmlApplicationContext("bean-other.xml");
+        // Object getBean(String name) throws BeansException;
+        Role role = (Role)context.getBean("role");
+        System.out.println(role);
+    }
+
+    @Test
+    public void testBean(){
+        ApplicationContext context = new ClassPathXmlApplicationContext("bean-other.xml");
+        // 通过id获取对象
+        Role role0 = (Role)context.getBean("role");
+        System.out.println(role0);
+
+        // <T> T getBean(Class<T> requiredType) throws BeansException;
+        // 因为通过传入类型 可以确定要返回的对象的类型  所以不需要再强制转化了
+        // 通过类别获取对象
+        Role role1 = context.getBean(Role.class);
+        System.out.println(role1);
+
+//        ApplicationContext context1 = new ClassPathXmlApplicationContext("bean.xml");
+//        User user = context1.getBean(User.class);
+//        System.out.println(user);
+
+        // <T> T getBean(String name, Class<T> requiredType) throws BeansException;
+        // 通过id和类别获取对象
+        Role role2 = context.getBean("role",Role.class);
+        System.out.println(role2);
+
+        // A true true
+        // B true false
+        // C false false
+        // D false true
+        System.out.println(role0 == role1);
+        System.out.println(role1 == role2);
+
+        // 创建一个bean  Student.java   name major    Grade.java  num
+        //   bean.xml   声明两个Student的bean标签   name=""  major=""   name="" major=""
+        //                 一个Grade的bean标签    num=""
+        // 使用如上三种方式来获取对象  其中通过类型来获取的  使用Grade对象
+    }
+
+
     @Test
     public void test1(){
         User user = new User();
@@ -28,4 +72,59 @@ public class TestBean {
 
         User user2 = new User("lisi");
     }
+
+
+    @Test
+    public void testAll(){
+        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
+        Role role = context.getBean("role",Role.class);
+        System.out.println(role);
+//        User user = context.getBean("role",User.class);
+//        System.out.println(user);
+    }
+
+    @Test
+    public void testConst(){
+        // 这一行 可以一次性初始化所有配置的bean 直接创建出对象 存入容器中
+        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
+        // 只是从容器中取出  id="user1" && class="com.sf.User"
+        // 这里因为配置了构造器参数  而不使用无参构造器 使用对应的有参构造器
+        User user1 = context.getBean("user1",User.class);
+        System.out.println(user1);
+    }
+
+    @Test
+    public void testSpecial(){
+        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
+        // 如果配置了属性值为null 会调用对应的set方法 赋值为null
+        //   以避免对象在初始化时已经有值的情况
+        User user = context.getBean("user2",User.class);
+        System.out.println(user);
+
+//        String str = "\"";
+    }
+
+    @Test
+    public void testRef(){
+        // <bean id="user" class="com.sf.User">
+        //        <!-- 在bean标签下 有一个子标签 property 就是属性的意思 -->
+        //        <!--    property标签  自己的标签属性有 name 和 value  对应变量名和变量的值 -->
+        //        <!--    本质上是调用属性的set方法  官网上叫做set注入-->
+        //        <property name="name" value="zhangsan"></property>
+        //        <property name="desc" value="something"></property>
+        //        <property name="role" ref="role"></property>
+        //    </bean>
+        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
+        User user = context.getBean("user",User.class);
+        System.out.println(user);
+        //  正常来讲 xml中的bean是按照先后顺序创建的
+        //  当容器创建 user对象时  发现还需要role对象  此时role对象还不存在(因为配置到了最后)
+        //    此时代表 user对象依赖role对象  两个类之间有“依赖关系”  也就是User类有一个属性 Role role;
+        //    容器会先创建一个role对象  然后按照配置中的顺序依次赋值  在setRole时就赋值给已经创建出来的user对象
+        //    在执行到 role对象配置的地方  会发现已经创建过了  就不会重复创建了
+        //  说明 容器默认创建的对象是唯一的
+//        Role role = context.getBean("role",Role.class);
+//        System.out.println(user.getRole() == role);
+    }
+
 }

+ 23 - 0
spring-demo/src/test/java/com/sf/TestBeanList.java

@@ -0,0 +1,23 @@
+package com.sf;
+
+import com.sf.list.House;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class TestBeanList {
+
+    @Test
+    public void testList(){
+        ApplicationContext context = new ClassPathXmlApplicationContext("bean-list.xml");
+        House house4 = context.getBean("house4", House.class);
+        System.out.println(house4);
+
+        House house6 = context.getBean("house6", House.class);
+        System.out.println(house6);
+
+        House house4_1 = context.getBean("house4_1", House.class);
+        System.out.println(house4_1);
+
+    }
+}

+ 27 - 0
spring-demo/src/test/java/com/sf/TestPrototype.java

@@ -0,0 +1,27 @@
+package com.sf;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class TestPrototype {
+
+    @Test
+    public void test(){
+        ApplicationContext context = new ClassPathXmlApplicationContext("bean-prototype.xml");
+        Auth auth = context.getBean("auth", Auth.class);
+        Auth auth1 = context.getBean("auth", Auth.class);
+        System.out.println(auth == auth1);
+
+        Role role = context.getBean("role", Role.class);
+        Role role1 = context.getBean("role", Role.class);
+        System.out.println(role == role1);
+    }
+
+    @Test
+    public void testLife(){
+        ApplicationContext context = new ClassPathXmlApplicationContext("bean-lifecycle.xml");
+        Auth auth = context.getBean("auth", Auth.class);
+        System.out.println(auth);
+    }
+}

+ 1 - 1
spring-demo/src/test/java/com/sf/TestLSY.java → spring-demo/src/test/java/com/sf/student/TestLSY.java

@@ -1,4 +1,4 @@
-package com.sf;
+package com.sf.student;
 
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;

+ 1 - 1
spring-demo/src/test/java/com/sf/TestTang.java → spring-demo/src/test/java/com/sf/student/TestTang.java

@@ -1,4 +1,4 @@
-package com.sf;
+package com.sf.student;
 
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;

+ 1 - 1
spring-demo/src/test/java/com/sf/TestZFX.java → spring-demo/src/test/java/com/sf/student/TestZFX.java

@@ -1,4 +1,4 @@
-package com.sf;
+package com.sf.student;
 
 import org.junit.jupiter.api.Test;