Spring基于xml方式依赖注入

本文详细介绍了Spring框架中使用XML配置进行依赖注入的各种方式,包括使用set方法、有参构造器、p名称空间、注入null值和特殊符号、引用型注入(外部bean与内部bean)、集合型属性注入(数组、List、Map、Set)以及提取集合注入。通过实例代码展示了每种注入方式的实现过程和测试结果,帮助读者深入理解Spring的依赖注入机制。
摘要由CSDN通过智能技术生成


Spring中将创建对象并为其添加属性值的操作称之为依赖注入,也就是通过Spring的方式为bean属性赋值

1. XML方式

1.1. 使用set方法进行注入

  • 步骤:
    (1)创建类 -> 定义属性和对应的set方法
    (2)在Spring配置文件配置对象创建,配置属性注入

1.1.1. 代码测试

public class Book {
    // 1 创建属性
    private String bname;
    private String bauthor;
    private String address;

    // 2 创建属性对应的set方法

    public void setBname(String bname) {
        this.bname = bname;
    }

    public void setBauthor(String bauthor) {
        this.bauthor = bauthor;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public void testDemo(){
        System.out.println("bname:"+bname+"\nbauthor:"+bauthor+"\naddress:"+address);
    }
}
         #############################################
                           Spring配置文件
<!--    set方法注入属性-->
    <!--        使用property完成属性注入,
                name:类中的属性名;
                value:向属性中注入的值-->
    <bean id="book" class="com.spring5.demo1.Book" >
        <property name="bname" value="java手册"></property>
        <property name="bauthor" value="alibaba"></property>
<!--        为属性设置null值-->
<!--        <property name="address"> -->
<!--            <null></null>-->
<!--        </property>-->
<!--        将属性值设置特殊字符
            1。例<>,进行转义 &lt;  &gt;
            2.将带有特殊符号的内容写到CDATA中-->
        <property name="address" >
            <value><![CDATA[<<兰州>> ]]></value>
        </property>
    </bean>

                  ###############################
                               测试代码
       public void testBook(){
     //1 加载Spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
     //2 获取配置创建的对象
        Book book = context.getBean("book",Book.class);
        book.testDemo();
    }                           

运行结果:
在这里插入图片描述

1.2. 使用有参构造器进行注入

  • 步骤:
    (1)创建类 -> 定义属性和创建对应的有参构造器
    (2)在Spring配置文件中进行配置
使用<constructor-arg >标签完成属性注入,
                name:类中的属性名;
                value:向属性中注入的值
                index:有参构造器中的形参列表索引(有多个构造器时,选择使用哪个构造器)-->

1.2.1. 代码测试

public class Orders {
    // 属性
    private String oname;
    private String address;
    //
    public Orders(String oname, String address) {
        this.oname = oname;
        this.address = address;
    }

    public void testDemo(){
        System.out.println("oname:"+oname+"\naddress:"+address);
    }
}
                   ########################################
                                 spring配置文件
                                 
   <!--  使用constructor-arg 完成属性注入,
                name:类中的属性名;
                value:向属性中注入的值
                index:有参构造器中的形参列表索引-->                      
   <bean id="orders" class="com.spring5.demo1.Orders">
        <constructor-arg name="oname" value="篮球"></constructor-arg>
        <constructor-arg name="address" value="china"></constructor-arg>
    </bean>     
       
                #######################################   
                             测试代码
  @Test
  public void testOrders(){
        //1 加载Spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        //2 获取配置创建的对象
        Orders orders = context.getBean("orders",Orders.class);
        orders.testDemo();
    }                                          

运行结果:
在这里插入图片描述

1.3. p名称空间进行注入

  • 步骤:
    (1)在配置文件中添加属性 xmlns:p="http://www.springframework.org/schema/p"
    (2)在bean标签中使用 p:属性名="" 方式进行属性注入
   <bean id="book" class="com.spring5.demo1.Book" 
          p:bname="Spring注解系列笔记" 
          p:bauthor="小刘" 
          p:address="BKTY"> </bean>

测试代码如1.1.1.所示
运行结果:

1.4. 其他类型属性(固定类型)进行注入

1.4.1. null值

对应的属性值使用<null/>标签

1.4.2. 属性值包含特殊符号

(1) <![CDATA[带有特殊符号的内容 ]]> ;
(2) 使用转义字符

1.4.3. 代码测试

    <bean id="book" class="com.spring5.demo1.Book" >
        <property name="bname" value="java手册"></property>
        <property name="bauthor" value="alibaba"></property>
<!--        为属性设置null值-->
        <property name="address">
            <null></null>
        </property>
<!--        将属性值设置特殊字符
            1。例<>,进行转义 &lt;  &gt;
            2.将带有特殊符号的内容写到CDATA中-->
<!--        <property name="address" >-->
<!--            <value><![CDATA[<<兰州>> ]]></value>-->
<!--        </property>-->
    </bean>

null值测试:
在这里插入图片描述
特殊符号测试
在这里插入图片描述

1.5. 引用型注入

1.5.1. 外部 bean

  • 要求:创建两个类:service类与dao类,在service中调用dao里的方法
    (1)在service中声明dao类型的属性以及对应的set方法
    (2)Spring配置文件中进行配置
    1.5.1.1. 代码测试
                  #########################################
                            service类
public class UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void add(){
        System.out.println("service add");
//        // 方式一:创建 UserDao对象调用其方法
//        UserDao userDao = new UserDaoimpl();
//        userDao.update();
        // 方式二:spring实现
        //1 创建UserDao类型的属性,生成set方法
        //2 配置文件中进行配置 bean2.xml
        userDao.update();
    }
}
                  #########################################
                            dao实现类
public class UserDaoimpl implements UserDao {
    @Override
    public void update() {
        System.out.println("dao update");
    }
}     
                     ######################################
                                   Spring配置
<!--    1. service与dao对象的创建-->
    <bean id="userService" class="com.spring5.service.UserService">
        <!--    注入userDao对象
                name:类中的属性名
                ref:创建userDao对象bean标签的id值-->
        <property name="userDao" ref="userDao"></property>
    </bean>
    <bean id="userDao" class="com.spring5.dao.UserDaoimpl"></bean>
</beans>   
                     ######################################
                                   测试代码
    public void testUserService(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        UserService userService = context.getBean("userService",UserService.class);
        userService.add();
    }                                            

运行结果:
在这里插入图片描述

1.5.2. 内部bean和级联赋值

  • 内部bean
    (1)在实体类之间表示一对多关系
    (2)Spring配置文件中进行配置
  • 级联赋值
    (1)Spring配置文件中进行配置
    (2)需要在有对象属性的类中设置其对应的get方法)
1.5.2.1. 代码测试
  • 此处举例以部门类和成员类进行举例内部 bean与级联赋值
         ######################################
                      * 部门类
public class Dept {
    private String dname;
    
    public void setDname(String dname) {
        this.dname = dname;
    }
    
    @Override
    public String toString() {
        return "Dept{" +
                "dname='" + dname + '\'' +
                '}';
    }
}
         ######################################
                      * 成员类
 public class Emp {
    private String ename;
    private String gender;
    private Dept dept;  // 员工所属部门,使用对象形式表示

    public Dept getDept() {  // 对应的对象属性get方法
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void showInfo(){
        System.out.println("ename:"+ename+"\ngender:"+gender+"\ndept:"+dept);
    }

}
                                            
  • 内部bean
                         ######################################
                                      * Spring配置
  <!--    1. 内部bean 创建Emp与Dept对象-->
    <bean id="emp" class="com.spring5.bean.Emp">
        <!--设置两个普通属性-->
        <property name="ename" value="james"></property>
        <property name="gender" value=""></property>
        <!--2. 设置对象类型属性 -->
        <property name="dept" >
            <bean id="dept" class="com.spring5.bean.Dept">
                <property name="dname" value="技术部"></property>
            </bean>
        </property>
    </bean>
</beans>   

                         ######################################
                                      * 测试代码
    public void testEmp(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml"); 
        Emp emp = context.getBean("emp",Emp.class);
        emp.showInfo();

    }

测试结果
在这里插入图片描述

  • 级联赋值
<!--     级联赋值  创建Emp与Dept对象-->
    <bean id="emp" class="com.spring5.bean.Emp">
        <!--设置两个普通属性-->
        <property name="ename" value="james"></property>
        <property name="gender" value=""></property>
        <!--级联赋值设置对象类型属性方法一 -->
        <!-- <property name="dept.dname" value="运营部"></property>-->
       
        <!--级联赋值设置对象类型属性方法二-->
        <property name="dept" ref="dept"></property>
    </bean>
    <bean id="dept" class="com.spring5.bean.Dept">
        <property name="dname" value="后勤部"></property>
    </bean>
</beans>

测试代码同内部 bean测试
测试结果:
此处方法一优先于方法二对属性值进行注入
在这里插入图片描述

1.6. 集合型属性注入

  • 步骤:
    1,创建类,定义数组,list,map,set类型的属性,并生成对应的set方法
    2,Spring配置文件中进行配置

1.6.1. 数组类型属性

  • 使用 <array> 标签
       <property name="属性名" >
            <array>
                <value>注入值</value>
                <value>注入值</value>
            </array>
        </property>

1.6.2. List集合类型属性

  • 使用 <list> 标签
               #############################################
                         普通list类型属性
  <property name="属性名">
            <list>
            <value>注入值</value>
            <value>注入值</value>
            </list>
        </property>

                #############################################
                         值为对象的list类型属性
        <property name="属性名">
            <list>
                <ref bean="bean1" ></ref>
                <ref bean="bean2"></ref>
                <ref bean="bean3"></ref>
            </list>
        </property>
    </bean>
<!--     创建多个bean对象-->
    <bean id="bean1" class="类路径">
        <property name="属性名" value="属性值"></property>
    </bean>
    <bean id="bean2" class="类路径">
        <property name="属性名" value="属性值"></property>
    </bean>
    <bean id="bean3" class="类路径">
        <property name="属性名" value="属性值"></property>
    </bean>                       

1.6.3. Map集合类型属性

  • 使用 <map> 标签
<property name="属性名">
            <map>
              <entry key="键名" value="键值"></entry>
                <entry key="键名" value="键值"></entry>
            </map>
        </property>

1.6.4. Set集合类型属性

  • 使用 <map> 标签
<property name="属性名">
             <set>
                <value>属性值</value>
                <value>属性值</value>
            </set>
        </property>

1.6.5. 以上举例代码测试

  • 此处以Stu类中设置各个类型属性,以Course类为对象属性进行举例
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Stu {
    // 数组类型属性
    private String[] course;

    // List集合类型属性
    private List<String> list;

    // 对象List集合类型属性
    private List<Course> courseList;


    // Map集合类型属性
    private Map<String,String> maps;

    //Set集合类型属性
    private Set<String> sets;

    public void setSets(Set<String> sets) {
        this.sets = sets;
    }

    public void setCourse(String[] course) {
        this.course = course;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setMaps(Map<String, String> maps) {
        this.maps = maps;
    }

    public void setCourseList(List<Course> courseList) {
        this.courseList = courseList;
    }

    public void test(){
        System.out.println(Arrays.toString(course));
        System.out.println(list);
        System.out.println(maps);
        System.out.println(sets);
        System.out.println(courseList);
    }
}
                     ###################################
                              Course类
public class Course {
    private String cname;  // 课程名

    public void setCname(String cname) {
        this.cname = cname;
    }

    @Override
    public String toString() {
        return "Course{" +
                "cname='" + cname + '\'' +
                '}';
    }
}   
                     ###################################
                              Spring配置

  <bean id="stu" class="com.spring5.collectiontype.Stu">
<!--        数组类型属性注入-->
        <property name="course" >
            <array>
                <value>java基础</value>
                <value>python编程</value>
            </array>
        </property>
<!--        list类型属性注入-->
        <property name="list">
            <list>
            <value>詹姆斯</value>
            <value>勒布朗</value>
            </list>
        </property>
<!--        map类型属性注入-->
        <property name="maps">
            <map>
              <entry key="JAVA" value="java"></entry>
                <entry key="PYTHON" value="python"></entry>
            </map>
        </property>
<!--        set类型属性注入-->
        <property name="sets">
            <set>
                <value>Mysql</value>
                <value>redis</value>
            </set>
        </property>
<!--        值为对象的list类型属性注入-->
        <property name="courseList">
            <list>
                <ref bean="course1" ></ref>
                <ref bean="course2"></ref>
                <ref bean="course3"></ref>
            </list>
        </property>
    </bean>
<!--     创建多个course对象-->
    <bean id="course1" class="com.spring5.collectiontype.Course">
        <property name="cname" value="Spring5框架"></property>
    </bean>
    <bean id="course2" class="com.spring5.collectiontype.Course">
        <property name="cname" value="javaEE"></property>
    </bean>
    <bean id="course3" class="com.spring5.collectiontype.Course">
        <property name="cname" value="SpringMVC"></property>
    </bean>
</beans>      
                     ###################################
                              测试代码
    public void testCollection(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        Stu stu = context.getBean("stu",Stu.class);
        stu.test();
    }                     

运行结果:
在这里插入图片描述

1.7. 提取集合注入

  • 步骤:
    (1)在Spring配置文件中引入名称空间 util
    (2)使用util标签完成list集合注入提取

1.7.1. 代码测试

public class Books {
    private List<String> list;

    public void setList(List<String> list) {
        this.list = list;
    }

    public void testbooks() {
        System.out.println( "books{" +
                "list=" + list +
                '}');
    }
}
            
            ##########################################
                        Spring配置
 <!--          1。提取list集合类型属性注入-->
    <util:list id="booksList">
        <value>java修炼之路</value>
        <value><![CDATA[
        <<java手册>>
        ]]></value>
        <value>《jvm调优》</value>
        <value><![CDATA[
        <<Spring实战>>
        ]]></value>
    </util:list>

<!--         2。提取list集合类型属性注入使用-->
    <bean id="books" class="com.spring5.collectiontype.Books" scope="prototype">
        <property name="list" ref="booksList"></property>
    </bean>
</beans>
            ##########################################
                        测试代码
    public void testCollection1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean55.xml");
        Books books = context.getBean("books", Books.class);
        books.testbooks();
    }

测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值