Spring中IOC创建对象的几种注入方式,你知道有哪些?

港控/mmm° 2021-09-09 05:12 509阅读 0赞

IOC简单来说就是对象由Spring创建,管理和装配

IOC在创建对象的可用依赖注入方式有多种,分别是构造器注入set方式注入其他方式注入,下面分别演示一下这三种方式怎么用

构造器注入

无参构造器:spring默认是用无参构造器创建对象,如:

  1. public class Hello {
  2. private String name;
  3. public void show() {
  4. System.out.println("hello"+name);
  5. }
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. }

在Bean中直接指明属性名和值就可以

  1. <bean id="hello" class="com.ys.pojo.Hello">
  2. <property name="name" value="spring"/>
  3. </bean>

有参构造器,如:

  1. public class Teacher {
  2. private String name;
  3. private int phone;
  4. // 有参构造函数
  5. public Teacher(String name, int phone) {
  6. this.name = name;
  7. this.phone = phone;
  8. }
  9. public String getName() {
  10. return name;
  11. }
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. public int getPhone() {
  16. return phone;
  17. }
  18. public void setPhone(int phone) {
  19. this.phone = phone;
  20. }
  21. }

对应的Bean:(有参构造器其有三种方式注入:下标指明赋值,指明类型赋值,指明参数名赋值)

  1. <!-- 有参构造下标赋值-->
  2. <bean id="teacher1" class="com.ys.pojo.Teacher">
  3. <constructor-arg index="0" value="李老师" />
  4. <constructor-arg index="1" value="333"/>
  5. </bean>
  6. <!--类型赋值法(不推荐这个)-->
  7. <bean id="teacher2" class="com.ys.pojo.Teacher">
  8. <constructor-arg type="java.lang.String" value="王老师"/>
  9. <constructor-arg type="int" value="34"/>
  10. </bean>
  11. <!--直接通过参数名设置-->
  12. <bean id="teacher3" class="com.ys.pojo.Teacher">
  13. <constructor-arg name="name" value="谢老师"/>
  14. <constructor-arg name="phone" value="5454545"/>
  15. </bean>

Set方式注入

set方式是依赖注入,依赖是指bean对象的创建依赖容器,注入是指bean对象中的所有属性,有容器来注入,如:

实体类Address

  1. public class Address {
  2. private String name;
  3. public String getName() {
  4. return name;
  5. }
  6. public void setName(String name) {
  7. this.name = name;
  8. }
  9. @Override
  10. public String toString() {
  11. return "Address{" +
  12. "name='" + name + '\'' +
  13. '}';
  14. }
  15. }
  16. public class Student {
  17. private String name;
  18. private Address address;
  19. private String[] books;
  20. private List<String> hobbys;
  21. private Map<String, String> card;
  22. private Set<String> games;
  23. private String wife;
  24. private Properties info;
  25. @Override
  26. public String toString() {
  27. return "Student{" +
  28. "name='" + name + '\'' +
  29. ", address=" + address +
  30. ", books=" + Arrays.toString(books) +
  31. ", hobbys=" + hobbys +
  32. ", card=" + card +
  33. ", games=" + games +
  34. ", wife='" + wife + '\'' +
  35. ", info=" + info +
  36. '}';
  37. }
  38. public String getName() {
  39. return name;
  40. }
  41. public void setName(String name) {
  42. this.name = name;
  43. }
  44. public Address getAddress() {
  45. return address;
  46. }
  47. public void setAddress(Address address) {
  48. this.address = address;
  49. }
  50. public String[] getBooks() {
  51. return books;
  52. }
  53. public void setBooks(String[] books) {
  54. this.books = books;
  55. }
  56. public List<String> getHobbys() {
  57. return hobbys;
  58. }
  59. public void setHobbys(List<String> hobbys) {
  60. this.hobbys = hobbys;
  61. }
  62. public Map<String, String> getCard() {
  63. return card;
  64. }
  65. public void setCard(Map<String, String> card) {
  66. this.card = card;
  67. }
  68. public Set<String> getGames() {
  69. return games;
  70. }
  71. public void setGames(Set<String> games) {
  72. this.games = games;
  73. }
  74. public String getWife() {
  75. return wife;
  76. }
  77. public void setWife(String wife) {
  78. this.wife = wife;
  79. }
  80. public Properties getInfo() {
  81. return info;
  82. }
  83. public void setInfo(Properties info) {
  84. this.info = info;
  85. }
  86. }

对应的bean

  1. <bean id="address" class="com.ys.pojo.Address">
  2. <property name="name" value="辽宁"/>
  3. </bean>
  4. <bean id="student1" class="com.ys.pojo.Student">
  5. <!--普通值注入,直接属性名+属性值-->
  6. <property name="name" value="小红"/>
  7. <!--Bean注入,ref+对应Bean的id-->
  8. <property name="address" ref="address"/>
  9. <!--数组注入-->
  10. <property name="books">
  11. <array>
  12. <value>设计模式</value>
  13. <value>Java</value>
  14. <value>编程思想</value>
  15. </array>
  16. </property>
  17. <!--List注入-->
  18. <property name="hobbys">
  19. <list>
  20. <value>旅游</value>
  21. <value>学习</value>
  22. </list>
  23. </property>
  24. <!--Map注入-->
  25. <property name="card">
  26. <map>
  27. <entry key="QQ号" value="6666666"/>
  28. <entry key="手机号" value="8888888888"/>
  29. </map>
  30. </property>
  31. <!--Set注入-->
  32. <property name="games">
  33. <set>
  34. <value>飞车</value>
  35. <value>使命召唤</value>
  36. </set>
  37. </property>
  38. <!--NULL注入-->
  39. <property name="wife">
  40. <null/>
  41. </property>
  42. <!--Properties注入-->
  43. <property name="info">
  44. <props>
  45. <prop key="学号">121212</prop>
  46. <prop key="姓名">小明</prop>
  47. </props>
  48. </property>
  49. </bean>

测试:

  1. @Test
  2. public void Test1() {
  3. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
  4. Student student = context.getBean("student1", Student.class);
  5. System.out.println(student);
  6. }

测试结果:

20210727135210662.png


其他方式注入

p命名注入:前提类里是无参构造,如:

  1. public class User {
  2. private int id;
  3. private String name;
  4. @Override
  5. public String toString() {
  6. return "User{" +
  7. "id=" + id +
  8. ", name='" + name + '\'' +
  9. '}';
  10. }
  11. public int getId() {
  12. return id;
  13. }
  14. public void setId(int id) {
  15. this.id = id;
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. }

在bean中要引入约束

20210727144522971.png

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd">
  7. <bean id="user1" class="com.ys.pojo.User" p:id="111111" p:name="小李"/>
  8. </beans>

注意:p 命名空间不如标准 XML 格式灵活。例如,声明属性引用的格式与以 结尾的属性冲突Ref,而标准 XML 格式则不然。我们建议您仔细选择您的方法并将其传达给您的团队成员,以避免生成同时使用所有三种方法的 XML 文档。p 命名空间不如标准 XML 格式灵活。例如,声明属性引用的格式与以 结尾的属性冲突Ref,而标准 XML 格式则不然。我们建议您仔细选择您的方法并将其传达给您的团队成员,以避免生成同时使用所有三种方法的 XML 文档。

============================

C命名注入:前提是类有有参构造器,如

  1. public class User {
  2. private int id;
  3. private String name;
  4. public User(int id, String name) {
  5. this.id = id;
  6. this.name = name;
  7. }
  8. @Override
  9. public String toString() {
  10. return "User{" +
  11. "id=" + id +
  12. ", name='" + name + '\'' +
  13. '}';
  14. }
  15. public int getId() {
  16. return id;
  17. }
  18. public void setId(int id) {
  19. this.id = id;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. }

在bean中引入约束

20210727145144331.png

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:c="http://www.springframework.org/schema/c"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd">
  7. <bean id="user1" class="com.ys.pojo.User" c:id="333" c:name="阿猫"/>
  8. </beans>

注意:由于 XML 语法的原因,索引符号要求存在前导,_因为 XML 属性名称不能以数字开头(即使某些 IDE 允许)

-—————————————

以上是在学spring中的一些总结,有不对的地方欢迎指正!!!

觉得不错三连支持一下哦,O(∩_∩)O哈哈~

发表评论

表情:
评论列表 (有 0 条评论,509人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring注入对象方式

    写在前面 spring通过IOC容器帮我们管理了对象,但是管理的这些对象,当我们需要其中一个或者是多个的时候应该怎么样获取呢,这就和对象注入有关系了,通过注入,我们可以从