当前位置:   article > 正文

Spring——Bean管理-xml方式进行属性注入_xml注入bean

xml注入bean

目录

一、xml方式创建对象

二、xml方式注入属性

第①种方式注入:set方法注入

第②种方式注入:有参构造函数注入

constructor-arg:通过构造函数注入

用name标签属性: 不按照顺序也会自动匹配

使用index标签属性:index的值为参数的顺序,默认从0开始

使用type标签属性:要和参数数据类型严格一致

三、xml注入其他类型属性

1、字面量--null值

2、含有特殊符号

3、注入属性-外部bean

4、注入属性-内部bean

什么是内部bean?

什么时候使用内部bean?

如何使用内部bean?

5、注入集合属性——数组、List集合、Map集合、Set集合

抽取公共部分

 Spring系列文章


一、xml方式创建对象

  1. <!-- 配置User对象创建-->
  2. <!-- id是取得别名,通过id别名可以把类找到-->
  3. <bean id="user" class="com.atguigu.spring5.User"></bean>
  • id:唯一标识,不能加特殊符号
  • class:类全路经(包类路径)
  • name:可以加特殊符号

二、xml方式注入属性

DI:依赖注入,就是注入属性

第①种方式注入:set方法注入

  1. package com.atguigu.spring5.Book;
  2. public class Book {
  3. private String bname;
  4. private String bauthor;
  5. public void setBname(String bname){
  6. this.bname=bname;
  7. }
  8. public void setBauthor(String bauthor){
  9. this.bauthor=bauthor;
  10. }
  11. public static void main(String[] args) {
  12. Book book = new Book();
  13. book.setBname("abc");
  14. }
  15. public void testDemo(){
  16. System.out.println(bname+"---"+bauthor);
  17. }
  18. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- 2.set方法注入属性-->
  6. <bean id="book" class="com.atguigu.spring5.Book.Book">
  7. <!-- 使用propterty完成属性注入-->
  8. <!-- name:类里面属性名称-->
  9. <!-- value:向属性注入的值-->
  10. <property name="bname" value="追风筝的人"></property>
  11. <property name="bauthor" value="卡勒德·胡赛尼"></property>
  12. </bean>
  13. </beans>
  1. package com.atguigu.spring5.Book;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. public class BoolTestMain {
  6. public static void main(String[] args) {
  7. ApplicationContext context = new ClassPathXmlApplicationContext("Booktest.xml");
  8. Book book = context.getBean("book", Book.class);
  9. System.out.println(book);
  10. book.testDemo();
  11. }
  12. }

我们还可以通过另一种方式简化写法—p名称空间注入

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean id="books" class="com.atguigu.spring5.Book.Book" p:bname="朝花夕拾" p:bauthor="鲁迅"></bean>
  7. </beans>

第②种方式注入:有参构造函数注入

  1. public class Orders {
  2. // 有参数构造注入属性
  3. private String oname;
  4. private String address;
  5. private double money;
  6. public Orders(String oname, String address, double money) {
  7. this.oname = oname;
  8. this.address = address;
  9. this.money = money;
  10. }
  11. public void show() {
  12. System.out.println(oname + "---" + address + "---" + money);
  13. }
  14. }

constructor-arg:通过构造函数注入

使用value标签属性: 默认按照constructor-arg标签的顺序

  1. <constructor-arg value="电脑"></constructor-arg>
  2. <constructor-arg value="China"></constructor-arg>

用name标签属性: 不按照顺序也会自动匹配

  1. <constructor-arg name="oname" value="电脑"></constructor-arg>
  2. <constructor-arg name="address" value="China"></constructor-arg>

使用index标签属性:index的值为参数的顺序,默认从0开始

  1. <!--index="0":有参构造的第一个属性-->
  2. <constructor-arg index="0" value="电脑"></constructor-arg>
  3. <constructor-arg index="1" value="China"></constructor-arg>

使用type标签属性:要和参数数据类型严格一致

(如果数据类型一致,按照constructor-arg标签的顺序匹配)

  1. <constructor-arg type="double" value="23"></constructor-arg>
  2. <constructor-arg type="java.lang.String" value="电脑"></constructor-arg>
  3. <constructor-arg type="java.lang.String" value="China"></constructor-arg>

三、xml注入其他类型属性

1、字面量--null值

  1. <constructor-arg name="oname" value="朝花夕拾"/>
  2. <constructor-arg name="oauthor" value="鲁迅"/>
  3. <constructor-arg name="address" >
  4. <null></null>
  5. </constructor-arg>

2、含有特殊符号

  • &lt;&gt;
  • 把带特殊符号内容写到!CDATA
  1. <!-- 1、使用&lt;&gt;先进行转义-->
  2. <property name="bauthor" value="鲁迅"></property>
  3. <property name="bname" value="&lt;&gt;朝花夕拾>>"></property>
  4. <!-- 2、使用!CDATA-->
  5. <property name="bauthor">
  6. <value><![CDATA[<<南京>>]]></value>
  7. </property>

3、注入属性-外部bean

通过ref属性将进行注入

  1. public class School {
  2. //创建School类型属性,生成set方法
  3. private Teacher teacher;
  4. public void setTeacher(Teacher teacher) {
  5. this.teacher = teacher;
  6. }
  7. }
  1. <!-- 注入外部bean-->
  2. <bean id="school" class="com.atguigu.spring5.propertyTest.School">
  3. <property name="teacher" ref="teachers"></property>
  4. </bean>
  5. <bean id="teachers" class="com.atguigu.spring5.propertyTest.Teacher"></bean>

4、注入属性-内部bean

什么是内部bean?

在某一个bean中定义另一个bean作为属性

什么时候使用内部bean?

如果School类中的某个属性的数据类型是另一个类Book,则可以把这个类Book定义在属性的内部

如何使用内部bean?

  1. public class School {
  2. //创建School类型属性,生成set方法
  3. private Teacher teacher;
  4. public void setTeacher(Teacher teacher) {
  5. this.teacher = teacher;
  6. }
  7. //部门
  8. private Book dept;
  9. public void setDept(Book dept) {
  10. this.dept = dept;
  11. }
  12. }
  1. public class Book {
  2. private String bname;
  3. private String bauthor;
  4. public void setBname(String bname) {
  5. this.bname = bname;
  6. }
  7. }
  1. <!-- 注入内部bean-->
  2. <bean id="school" class="com.atguigu.spring5.propertyTest.School">
  3. <property name="teacher" ref="teachers"></property>
  4. <property name="dept" >
  5. <bean id="book" class="com.atguigu.spring5.Book.Book">
  6. <property name="bname" value="朝花夕拾"></property>
  7. </bean>
  8. </property>
  9. </bean>

5、注入集合属性——数组、List集合、Map集合、Set集合

  1. package com.atguigu.spring5.CollectionTypeTest;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.Set;
  6. /**
  7. * @BelongsProject: 02-Spring
  8. * @BelongsPackage: com.atguigu.spring5.CollectionTypeTest
  9. * @Author: dengLiMei
  10. * @CreateTime: 2023-02-09 09:46
  11. * @Description: TODO
  12. * @Version: 1.0
  13. */
  14. public class Student {
  15. //数组
  16. private String[] courses;
  17. // List集合
  18. private List<String> lists;
  19. //Map集合
  20. private Map<String, String> maps;
  21. //Set集合
  22. private Set<String> sets;
  23. public void setSets(Set<String> sets) {
  24. this.sets = sets;
  25. }
  26. public Student() {
  27. }
  28. public void setCourses(String[] courses) {
  29. this.courses = courses;
  30. }
  31. public void setLists(List<String> lists) {
  32. this.lists = lists;
  33. }
  34. public void setMaps(Map<String, String> maps) {
  35. this.maps = maps;
  36. }
  37. public void show() {
  38. System.out.println(Arrays.toString(courses));
  39. System.out.println((lists));
  40. System.out.println((maps));
  41. System.out.println((sets));
  42. }
  43. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <bean id="students" class="com.atguigu.spring5.CollectionTypeTest.Student">
  6. <!-- 数组-->
  7. <property name="courses">
  8. <array>
  9. <value>spring5</value>
  10. <value>springboot</value>
  11. </array>
  12. </property>
  13. <!-- List类型-->
  14. <property name="lists">
  15. <list>
  16. <value>springcloud</value>
  17. <value>springcloudAlibaba</value>
  18. </list>
  19. </property>
  20. <!-- Map集合-->
  21. <property name="maps">
  22. <map>
  23. <entry key="QQ" value="腾讯"></entry>
  24. <entry key="淘宝" value="阿里"></entry>
  25. </map>
  26. </property>
  27. <!-- Set集合-->
  28. <property name="sets">
  29. <set>
  30. <value>set-spring5</value>
  31. <value>set-springboot</value>
  32. </set>
  33. </property>
  34. </bean>
  35. </beans>

输出结果:

如果一个类中包含了另一个类的实体对象,可以这样写

  1. public class Course {
  2. // 课程名称
  3. private String cname;
  4. public void setCname(String cname) {
  5. this.cname = cname;
  6. }
  7. }
  1. package com.atguigu.spring5.CollectionTypeTest;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.Set;
  6. public class Student2 {
  7. //实体对象-学生有多门课程
  8. private List<Course> courseList;
  9. public void setCourseList(List<Course> courseList) {
  10. this.courseList = courseList;
  11. }
  12. @Override
  13. public String toString() {
  14. return "Student2{" +
  15. "courseList=" + courseList +
  16. '}';
  17. }
  18. }
  1. <bean id="student2" class="com.atguigu.spring5.CollectionTypeTest.Student2">
  2. <property name="courseList">
  3. <list>
  4. <ref bean="course1"></ref>
  5. <ref bean="course2"></ref>
  6. </list>
  7. </property>
  8. </bean>
  9. <!-- 创建多个course对象-->
  10. <bean id="course1" class="com.atguigu.spring5.CollectionTypeTest.Course">
  11. <property name="cname" value="spring5框架"></property>
  12. </bean>
  13. <bean id="course2" class="com.atguigu.spring5.CollectionTypeTest.Course">
  14. <property name="cname" value="MyBatis框架"></property>
  15. </bean>
  1. public static void main(String[] args) {
  2. ApplicationContext context = new ClassPathXmlApplicationContext("CollectionTypeBeans.xml");
  3. Student2 students1 = context.getBean("student2", Student2.class);
  4. students1.show();
  5. }

输出结果:

目前的问题:只能当前类使用,其他类不能用,接下来就是把集合属性抽取成公共部分让所有实体类都能够引入

抽取公共部分

  1. public class Book {
  2. private List<String> list;
  3. public void setList(List<String> list) {
  4. this.list = list;
  5. }
  6. public void show(){
  7. System.out.println(list);
  8. }
  9. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:util="http://www.springframework.org/schema/util"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
  7. <!-- 1、提取list集合类型属性注入-->
  8. <util:list id="bookList">
  9. <value>spring5</value>
  10. <value>springboot</value>
  11. <value>springcloud</value>
  12. </util:list>
  13. <!-- 2、提取list集合类型属性注入使用-->
  14. <bean id="book" class="com.atguigu.spring5.CollectionTypeTest.Book">
  15. <property name="list" ref="bookList"></property>
  16. </bean>
  17. </beans>
  1. public static void main(String[] args) {
  2. ApplicationContext context = new ClassPathXmlApplicationContext("CollectionTypeBeans.xml");
  3. Book book = context.getBean("book", Book.class);
  4. book.show();
  5. }

输出结果:


 Spring系列文章:

Spring——是什么?作用?内容?用到的设计模式?

Spring——Bean管理-xml方式进行属性注入

Spring——Bean管理-注解方式进行属性注入

Spring——什么是IOC?

Spring——AOP是什么?如何使用?

Spring——什么是事务?传播行为?事务隔离级别有哪些?

Spring——整合junit4、junit5使用方法

如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏脚印支持一下博主~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/90443
推荐阅读
相关标签
  

闽ICP备14008679号