spring xml 注入

spring bean的注入大致分为两类:XML配置 与 注解方式
(1)XML配置:set注入、构造函数注入、P标签、静态工厂方法、实例工厂方法;
(2)注解方式: @Autowired、@Resource、@Qualifier

Spring注入的数据类型:
(1)常见的引用类型,包装类、String、Date等
(2)自定义bean类型
(3)集合类型
用于给List结构集合注入的标签:
list array set
用于个Map结构集合注入的标签:
map props
结构相同,标签可以互换

在这里插入图片描述

Spring XML 注入

(1)set注入

<bean id="book" class="com.tsj.bean.Book">
        <!--使用property完成属性注入,name:类里面属性名称,value:向属性注入的值 -->
        <property name="bookName" value="平凡世界"/>
        <property name="bookAuthor" value="路遥"/>
</bean>

book bean:

public class Book {
    private String bookName;
    private String bookAuthor;

    public Book() {
    }

    public Book(String bookName, String bookAuthor) {
        this.bookName = bookName;
        this.bookAuthor = bookAuthor;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getBookAuthor() {
        return bookAuthor;
    }

    public void setBookAuthor(String bookAuthor) {
        this.bookAuthor = bookAuthor;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bookName='" + bookName + '\'' +
                ", bookAuthor='" + bookAuthor + '\'' +
                '}';
    }
}

(2)构造函数

 <bean id="bookOrders" class="com.tsj.bean.BookOrders">
        <constructor-arg name="orderName" value="畅销书top1订单"/>
        <constructor-arg name="orderPrice" value="56"/>
</bean>

bookOrders bean:

/**
 * 订单
 */
public class BookOrders {
    //订单名称
    private String orderName;
    //订单价格
    private double orderPrice;

    public BookOrders() {
    }

    public BookOrders(String orderName, double orderPrice) {
        this.orderName = orderName;
        this.orderPrice = orderPrice;
    }

    public String getOrderName() {
        return orderName;
    }

    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }

    public double getOrderPrice() {
        return orderPrice;
    }

    public void setOrderPrice(double orderPrice) {
        this.orderPrice = orderPrice;
    }

    @Override
    public String toString() {
        return "Orders{" +
                "orderName='" + orderName + '\'' +
                ", orderPrice=" + orderPrice +
                '}';
    }
}

(3)P标签注入

记得引入 xmlns:p=“http://www.springframework.org/schema/p”

<bean id="bookShop" class="com.tsj.bean.BookShop"
          p:shopName="中华书局旗舰店" p:shopNo="1245" p:shopAddr="北京朝阳"/>

bookShop bean:


public class BookShop {
    private String shopName;
    private String shopNo;

    private String shopAddr;

    public BookShop() {
    }

    public BookShop(String shopName, String shopNo,String shopAddr) {
        this.shopName = shopName;
        this.shopNo = shopNo;
        this.shopAddr = shopAddr;
    }

    public String getShopName() {
        return shopName;
    }

    public void setShopName(String shopName) {
        this.shopName = shopName;
    }

    public String getShopNo() {
        return shopNo;
    }

    public void setShopNo(String shopNo) {
        this.shopNo = shopNo;
    }

    public String getShopAddr() {
        return shopAddr;
    }

    public void setShopAddr(String shopAddr) {
        this.shopAddr = shopAddr;
    }

    @Override
    public String toString() {
        return "BookShop{" +
                "shopName='" + shopName + '\'' +
                ", shopNo='" + shopNo + '\'' +
                ", shopAddr='" + shopAddr + '\'' +
                '}';
    }
}

(4) 静态工厂方法

使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)

bean id="publisherStatic" class="com.tsj.bean.PublisherFactory"
          factory-method="getPublisherByStaticFactory"/>

PublisherFactory bean:


public class PublisherFactory {

    /**
     * 静态工厂,返回一个PublishInfo的实例对象
     */
    public static PublishInfo getPublisherByStaticFactory() {
        return new PublishInfo("中国文明", "0-415-15591-6");
    }

    /**
     * 实例工厂,返回一个PublishInfo的实例对象
     */
    public PublishInfo getPublisherByInstanceFactory() {
        return new PublishInfo("希腊文明", "0-415-15612-2");
    }

}


PublishInfo bean:

public class PublishInfo {
    //出版社名称
    private String publisher;
    //国际标准图书编码
    private String ISBN;

    public PublishInfo() {
    }

    public PublishInfo(String publisher, String ISBN) {
        this.publisher = publisher;
        this.ISBN = ISBN;
    }

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    public String getISBN() {
        return ISBN;
    }

    public void setISBN(String ISBN) {
        this.ISBN = ISBN;
    }

    @Override
    public String toString() {
        return "Publisher{" +
                "publisher='" + publisher + '\'' +
                ", ISBN='" + ISBN + '\'' +
                '}';
    }
}

(5)实例工厂方法

使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器中)

<bean id="publisherInstanceFactory" class="com.tsj.bean.publisherFactory"/>
    <bean id="publisherInstance" factory-bean="publisherInstanceFactory"
          factory-method="getPublisherByInstanceFactory"/>

Spring注入的数据类型

<!--  Spring注入的数据:
    (1) 包装类型/String、Date
     (2) bean类型
    (3)复杂类型的注入/集合类型的注入
            用于给List结构集合注入的标签:
                list array set
            用于个Map结构集合注入的标签:
                map  props
            结构相同,标签可以互换
    -->
    <!-- 配置一个日期对象 -->
    <bean id="now" class="java.util.Date"/>
    <bean id="accountDIBean" class="com.tsj.bean.AccountDIBean">
        <!--包装类和Strig Date-->
        <property name="name" value="泰兰特"/>
        <property name="age" value="43"/>
        <property name="birthday" ref="now"/>

        <!--引用类型-->
        <!--通过ref来进行引用 bean-->
        <property name="book" ref="book"/>
        <!-- 直接配置内部 bean,不用ref就配置全路径 -->
        <property name="bookOrders">
            <bean class="com.tsj.bean.BookOrders">
                <constructor-arg name="orderName" value="格雷厄姆格林的书单"/>
                <constructor-arg name="orderPrice" value="66"/>
            </bean>
        </property>

        <!--配置set属性-->
        <property name="mySets">
            <set>
                <value>《云边有个小卖铺》</value>
                <value>《The Bronze Horseman》</value>
                <value>《人性的因素》</value>
                <value>《人性的因素》</value>
            </set>
        </property>

        <!--配置array属性-->
        <property name="myArrays">
            <array>
                <value>《文化苦旅》</value>
                <value>《山河之书》</value>
                <value>《泥步修行》</value>
            </array>
        </property>

        <!--配置list属性-->
        <property name="myLists">
            <list>
                <value>破惑</value>
                <value>问道</value>
                <value>安顿</value>
            </list>
        </property>

        <!--配置props属性-->
        <property name="myProps">
            <props>
                <prop key="书名:">相约星期二</prop>
                <prop key="作者:">阿尔博姆</prop>
            </props>
        </property>

        <!--配置map属性-->
        <property name="myMaps">
            <map>
                <entry key="master" value="oss1"/>
                <entry key="slave">
                    <value>oss-2</value>
                </entry>
            </map>
        </property>
    </bean>

Demo

完整XML配置(applicationContextBean.xml)

<?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:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd
">


    <!--    spring对bean的管理细节:1、创建bean 2、bean对象的作用范围 3、销毁 4、bean对象的生命周期
     1、创建bean的方式(5种):
        (1)在spring的配置文件中使用bean标签,配置id和class之后,且没有其他属性和标签时,
          采用的就是默认构造函数创建bean对象.
        (2)构造函数
        (3)P标签注入
        (4)使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器中)
        (5)使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
    -->

    <!-- 1.set方法注入 (xml常用的方式)
        涉及的标签:property
        出现的位置:bean标签的内部
        标签的属性
            name:用于指定注入时所调用的set方法名称
            value:用于提供基本类型和String类型的数据
            ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
        优势:
            创建对象时没有明确的限制,可以直接使用默认构造函数
        弊端:
            如果有某个成员必须有值,则获取对象是有可能set方法没有执行。
    -->
    <bean id="book" class="com.tsj.bean.Book">
        <!--使用property完成属性注入,name:类里面属性名称,value:向属性注入的值 -->
        <property name="bookName" value="平凡世界"/>
        <property name="bookAuthor" value="路遥"/>
    </bean>

    <!--2.构造函数注入:
       使用的标签:constructor-arg
       标签出现的位置:bean标签的内部
       标签中的属性
           type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
           index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
           name:用于指定给构造函数中指定名称的参数赋值                                        常用的
           =============以上三个用于指定给构造函数中哪个参数赋值===============================
           value:用于提供基本类型和String类型的数据
           ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
       优势:
           在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。
       弊端:
           改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。
   -->
    <bean id="bookOrders" class="com.tsj.bean.BookOrders">
        <constructor-arg name="orderName" value="畅销书top1订单"/>
        <constructor-arg name="orderPrice" value="56"/>
    </bean>

    <!--3. p标签注入
        记得引入 xmlns:p="http://www.springframework.org/schema/p"
    -->
    <bean id="bookShop" class="com.tsj.bean.BookShop"
          p:shopName="中华书局旗舰店" p:shopNo="1245" p:shopAddr="北京朝阳"/>

    <!--4. 静态工厂注入
    -->
    <bean id="publisherStatic" class="com.tsj.bean.publisherFactory"
          factory-method="getPublisherByStaticFactory"/>

    <!--5. 实例工厂注入
    -->
    <bean id="publisherInstanceFactory" class="com.tsj.bean.publisherFactory"/>
    <bean id="publisherInstance" factory-bean="publisherInstanceFactory"
          factory-method="getPublisherByInstanceFactory"/>


    <!--  Spring注入的数据分:三类
    (1) 包装类型和String、Date
     (2) 其他bean类型(在配置文件中或者注解配置过的bean)
    (3)复杂类型的注入/集合类型的注入
            用于给List结构集合注入的标签:
                list array set
            用于个Map结构集合注入的标签:
                map  props
            结构相同,标签可以互换
    -->
    <!-- 配置一个日期对象 -->
    <bean id="now" class="java.util.Date"/>
    <bean id="accountDIBean" class="com.tsj.bean.AccountDIBean">
        <!--包装类和Strig Date-->
        <property name="name" value="泰兰特"/>
        <property name="age" value="43"/>
        <property name="birthday" ref="now"/>

        <!--引用类型-->
        <!--通过ref来进行引用 bean-->
        <property name="book" ref="book"/>
        <!-- 直接配置内部 bean,不用ref就配置全路径 -->
        <property name="bookOrders">
            <bean class="com.tsj.bean.BookOrders">
                <constructor-arg name="orderName" value="格雷厄姆格林的书单"/>
                <constructor-arg name="orderPrice" value="66"/>
            </bean>
        </property>

        <!--配置set属性-->
        <property name="mySets">
            <set>
                <value>《云边有个小卖铺》</value>
                <value>《The Bronze Horseman》</value>
                <value>《人性的因素》</value>
                <value>《人性的因素》</value>
            </set>
        </property>

        <!--配置array属性-->
        <property name="myArrays">
            <array>
                <value>《文化苦旅》</value>
                <value>《山河之书》</value>
                <value>《泥步修行》</value>
            </array>
        </property>

        <!--配置list属性-->
        <property name="myLists">
            <list>
                <value>破惑</value>
                <value>问道</value>
                <value>安顿</value>
            </list>
        </property>

        <!--配置props属性-->
        <property name="myProps">
            <props>
                <prop key="书名:">相约星期二</prop>
                <prop key="作者:">阿尔博姆</prop>
            </props>
        </property>

        <!--配置map属性-->
        <property name="myMaps">
            <map>
                <entry key="master" value="oss1"/>
                <entry key="slave">
                    <value>oss-2</value>
                </entry>
            </map>
        </property>
    </bean>
</beans>




测试

public static void main(String[] args) {
              ApplicationContext ac = new ClassPathXmlApplicationContext("/spring/applicationContextBean.xml");

        /**
         * 构造函数
         */
        System.out.println("===构造函数注入==================================");
        BookOrders order = ac.getBean("bookOrders", BookOrders.class);
        System.out.println(order.toString());

        /**
         * p空间注入
         */
        System.out.println("===p空间注入注入==================================");
        BookShop bookShop = ac.getBean("bookShop", BookShop.class);
        System.out.println(bookShop.toString());

        /**
         * 静态工厂注入
         */
        System.out.println("===静态工厂注入==================================");
        PublishInfo publishInfo1 = ac.getBean("publisherStatic", PublishInfo.class);
        System.out.println(publishInfo1.toString());

        /**
         * 实例工厂注入
         */
        System.out.println("===实例工厂注入==================================");
        PublishInfo publishInfo2 = ac.getBean("publisherInstance", PublishInfo.class);
        System.out.println(publishInfo2.toString());

        /**
         * set注入
         */
        System.out.println("===set注入==================================");
        Book book = ac.getBean("book", Book.class);
        System.out.println(book.toString());
        System.out.println(book.getBookName());

        System.out.println("===set注入 类型 ==================================");
        AccountDIBean accountDIBean = ac.getBean("accountDIBean", AccountDIBean.class);
        accountDIBean.saveAccount();
        System.out.println(accountDIBean.toString());
}

执行结果

===构造函数注入==================================
Orders{orderName='畅销书top1订单', orderPrice=56.0}
===p空间注入注入==================================
BookShop{shopName='中华书局旗舰店', shopNo='1245', shopAddr='北京朝阳'}
===静态工厂注入==================================
Publisher{publisher='中国文明', ISBN='0-415-15591-6'}
===实例工厂注入==================================
Publisher{publisher='希腊文明', ISBN='0-415-15612-2'}
===set注入==================================
Book{bookName='平凡世界', bookAuthor='路遥'}
平凡世界
===set注入 类型 ==================================
String类型:泰兰特
integer类型:43
Date类型:Sun Oct 02 22:42:13 CST 2022
Bean 类型Book{bookName='平凡世界', bookAuthor='路遥'}
Bean 类型Orders{orderName='格雷厄姆格林的书单', orderPrice=66.0}
String类型:[《文化苦旅》, 《山河之书》, 《泥步修行》]
List类型:[破惑, 问道, 安顿]
Set类型:[《云边有个小卖铺》,The Bronze Horseman, 《人性的因素》]
Map类型:{master=oss1, slave=oss-2}
Properties类型:{书名:=相约星期二, 作者:=阿尔博姆}
AccountDIBean{name='泰兰特', age=43, birthday=Sun Oct 02 22:42:13 CST 2022, myArrays=[《文化苦旅》, 《山河之书》, 《泥步修行》], myLists=[破惑, 问道, 安顿], mySets=[《云边有个小卖铺》,The Bronze Horseman, 《人性的因素》], myMaps={master=oss1, slave=oss-2}, myProps={书名:=相约星期二, 作者:=阿尔博姆}, book=Book{bookName='平凡世界', bookAuthor='路遥'}, bookOrders=Orders{orderName='格雷厄姆格林的书单', orderPrice=66.0}}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值