TestBean.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package com.sf.ioc;
  2. import com.sf.ioc.simple.Role;
  3. import com.sf.ioc.simple.User;
  4. import org.junit.jupiter.api.Test;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7. public class TestBean {
  8. @Test
  9. public void test(){
  10. // 要创建bean 需要使用spring提供的容器 (context 上下文)
  11. // 应用容器 是个接口
  12. ApplicationContext context = new ClassPathXmlApplicationContext("ioc/bean.xml");
  13. User user = (User) context.getBean("user");
  14. // 调用了无参构造器 如果有代码块 也会调用代码块
  15. System.out.println(user);
  16. User user1 = (User) context.getBean("user1");
  17. System.out.println(user1);
  18. }
  19. @Test
  20. public void testOther(){
  21. ApplicationContext context = new ClassPathXmlApplicationContext("ioc/bean-other.xml");
  22. // Object getBean(String name) throws BeansException;
  23. Role role = (Role)context.getBean("role");
  24. System.out.println(role);
  25. }
  26. @Test
  27. public void testBean(){
  28. ApplicationContext context = new ClassPathXmlApplicationContext("ioc/bean-other.xml");
  29. // 通过id获取对象
  30. Role role0 = (Role)context.getBean("role");
  31. System.out.println(role0);
  32. // <T> T getBean(Class<T> requiredType) throws BeansException;
  33. // 因为通过传入类型 可以确定要返回的对象的类型 所以不需要再强制转化了
  34. // 通过类别获取对象
  35. Role role1 = context.getBean(Role.class);
  36. System.out.println(role1);
  37. // ApplicationContext context1 = new ClassPathXmlApplicationContext("bean.xml");
  38. // User user = context1.getBean(User.class);
  39. // System.out.println(user);
  40. // <T> T getBean(String name, Class<T> requiredType) throws BeansException;
  41. // 通过id和类别获取对象
  42. Role role2 = context.getBean("role",Role.class);
  43. System.out.println(role2);
  44. // A true true
  45. // B true false
  46. // C false false
  47. // D false true
  48. System.out.println(role0 == role1);
  49. System.out.println(role1 == role2);
  50. // 创建一个bean Student.java name major Grade.java num
  51. // bean.xml 声明两个Student的bean标签 name="" major="" name="" major=""
  52. // 一个Grade的bean标签 num=""
  53. // 使用如上三种方式来获取对象 其中通过类型来获取的 使用Grade对象
  54. }
  55. @Test
  56. public void test1(){
  57. User user = new User();
  58. User user1 = new User();
  59. user1.setName("zhangsan");
  60. User user2 = new User("lisi");
  61. }
  62. @Test
  63. public void testAll(){
  64. ApplicationContext context = new ClassPathXmlApplicationContext("ioc/bean.xml");
  65. Role role = context.getBean("role",Role.class);
  66. System.out.println(role);
  67. // User user = context.getBean("role",User.class);
  68. // System.out.println(user);
  69. }
  70. @Test
  71. public void testConst(){
  72. // 这一行 可以一次性初始化所有配置的bean 直接创建出对象 存入容器中
  73. ApplicationContext context = new ClassPathXmlApplicationContext("ioc/bean.xml");
  74. // 只是从容器中取出 id="user1" && class="com.sf.simple.User"
  75. // 这里因为配置了构造器参数 而不使用无参构造器 使用对应的有参构造器
  76. User user1 = context.getBean("user1",User.class);
  77. System.out.println(user1);
  78. }
  79. @Test
  80. public void testSpecial(){
  81. ApplicationContext context = new ClassPathXmlApplicationContext("ioc/bean.xml");
  82. // 如果配置了属性值为null 会调用对应的set方法 赋值为null
  83. // 以避免对象在初始化时已经有值的情况
  84. User user = context.getBean("user2", User.class);
  85. System.out.println(user);
  86. // String str = "\"";
  87. }
  88. @Test
  89. public void testRef(){
  90. // <bean id="user" class="com.sf.simple.User">
  91. // <!-- 在bean标签下 有一个子标签 property 就是属性的意思 -->
  92. // <!-- property标签 自己的标签属性有 name 和 value 对应变量名和变量的值 -->
  93. // <!-- 本质上是调用属性的set方法 官网上叫做set注入-->
  94. // <property name="name" value="zhangsan"></property>
  95. // <property name="desc" value="something"></property>
  96. // <property name="role" ref="role"></property>
  97. // </bean>
  98. ApplicationContext context = new ClassPathXmlApplicationContext("ioc/bean.xml");
  99. User user = context.getBean("user",User.class);
  100. System.out.println(user);
  101. // 正常来讲 xml中的bean是按照先后顺序创建的
  102. // 当容器创建 user对象时 发现还需要role对象 此时role对象还不存在(因为配置到了最后)
  103. // 此时代表 user对象依赖role对象 两个类之间有“依赖关系” 也就是User类有一个属性 Role role;
  104. // 容器会先创建一个role对象 然后按照配置中的顺序依次赋值 在setRole时就赋值给已经创建出来的user对象
  105. // 在执行到 role对象配置的地方 会发现已经创建过了 就不会重复创建了
  106. // 说明 容器默认创建的对象是唯一的
  107. // Role role = context.getBean("role",Role.class);
  108. // System.out.println(user.getRole() == role);
  109. }
  110. }