基于Idea的SpringDemo

快速创建一个spring项目

新建一个工程,选择spring,勾选“Create empty spring-config.xml”,Libraries选择Download会自动下载所需包。

image.png

image.png

创建HelloSpring

package com.Re;

public class HelloSpring {
    private String name;

    public void setName(String name){
        this.name=name;
    }

    public void printHello(){
        System.out.println("Spring say Hello"+name);
    }
}

编辑spring-config.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--指定文件路径-->
    <bean id="helloBean" class="com.Re.HelloSpring">
        <!--通过property给参数赋值 -->
        <property name="name" value="Re"/>
    </bean>
</beans>

创建一个测试类

package com.Re;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class HelloSpringTest {
    public static void main(String[] args) {
        //以classpath路径下的"spring-config.xml"创建ApplicationContext实例
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //在bean工厂获取id为"helloBean"的类
        HelloSpring helloSpring = (HelloSpring) context.getBean("helloBean");
        //调用方法,bean工厂会将参数赋值给方法
        helloSpring.printHello();
    }
}

项目结构及结果

image.png

自动装配Bean

创建Person类

package com.Re.autowiredDemo;

public class Person {
    private String hei;

    public String getHei() {
        return hei;
    }

    public void setHei(String hei) {
        this.hei = hei;
    }
    
    @Override
    public String toString() {
        return "Person{" +
                "hei='" + hei + '\'' +
                '}';
    }
}

创建Customer类

package com.Re.autowiredDemo;

public class Customer {

    private Person person;
    //无参构造
    public Customer() {
    }
    
    //带参构造
    public Customer(Person person) {
        this.person = person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }


}

创建测试类Test.java

package com.Re.autowiredDemo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        Customer customer = (Customer) context.getBean("customer");
        System.out.println(customer);
    }
}

第一种:默认的ref

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--指定文件路径-->
    <bean id="helloBean" class="com.Re.beanDemo.HelloSpring">
        <!--通过property给参数赋值 -->
        <property name="name" value="Re"/>
    </bean>

    <!--默认方式装配,有两个bean:customer和person
        property name="person"指向Customer.setPerson方法
        ref="person"指向"<bean id="person" class="com.Re.autowiredDemo.Person"/>"-->
    <bean id="customer" class="com.Re.autowiredDemo.Customer">
        <property name="person" ref="person"/>
    </bean>

    <bean id="person" class="com.Re.autowiredDemo.Person">
        <!--将“hello”赋值给参数“hei”-->
        <property name="hei" value="hello"/>
    </bean>
</beans>

运行Test.java,验证自动装配成功


image.png

流程猜想
执行: ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
此时根据路径找到配置文件,创建了一个上下文对象
执行: Customer customer = (Customer) context.getBean("customer");

  • 此时通过对象获取配置文件里【id=customer】的配置,
  • 根据配置自动生成Person对象(property name="person"的作用)
  • 通过 ref="person"连接到【id=person】的配置,
  • 通过【property name="hei" value="hello"】给Person类里的hei变量赋值“hello”
  • 然后通过Person.java里重写的toString获得返回值“Person{hei='hello'}”
  • 然后回传给Customer里的person变量
  • 然后通过Customer.java里重写的toString获得返回值“Customer{person=Person{hei='hello'}}”

第二种:byName

如果一个bean的名称与其他bean属性的名称是一样的,那么将自动装配它。例子:Customer.java 增加一个“address”属性,那么Spring会在配置文件里寻找【id=address】的bean,如果找到了就自动装配,如果没找到,就什么都不做

修改Customer

package com.Re.autowiredDemo;

public class Customer {

    //新增一个adress参数
    private Address address;

    private Person person;


    //无参构造
    public Customer() {
    }

    //带参构造
    public Customer(Person person) {
        this.person = person;
    }

    public Customer(Address address) {
        this.address = address;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

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

    @Override
    public String toString() {
        return "Customer{" +
                "address=" + address +
                ", person=" + person +
                '}';
    }
}


新建Address.java

package com.Re.autowiredDemo;

public class Address {
    private String myaddress;

    public void setMyaddress(String myaddress) {
        this.myaddress = myaddress;
    }

    @Override
    public String toString() {
        return "Address{" +
                "myaddress='" + myaddress + '\'' +
                '}';
    }
}

修改配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--指定文件路径-->
    <bean id="helloBean" class="com.Re.beanDemo.HelloSpring">
        <!--通过property给参数赋值 -->
        <property name="name" value="Re"/>
    </bean>

    <!--&lt;!&ndash;默认方式装配,有两个bean:customer和person-->
        <!--property name="person"指向Customer.setPerson方法-->
        <!--ref="person"指向"<bean id="person" class="com.Re.autowiredDemo.Person"/>"&ndash;&gt;-->
    <!--<bean id="customer" class="com.Re.autowiredDemo.Customer">-->
        <!--<property name="person" ref="person"/>-->
    <!--</bean>-->

    <!--<bean id="person" class="com.Re.autowiredDemo.Person">-->
        <!--&lt;!&ndash;将“hello”赋值给参数“hei”&ndash;&gt;-->
        <!--<property name="hei" value="hello"/>-->
    <!--</bean>-->

    <!--byName方式自动装配-->
    <bean id="customer" class="com.Re.autowiredDemo.Customer" autowire="byName"/>

    <bean id="address" class="com.Re.autowiredDemo.Address">
        <property name="myaddress" value="杭州西湖"/>
    </bean>


</beans>

运行测试Test.java


image.png

修改配置文件,将Address的id改一下,造成与Customer属性不一致的情况,测试验证找不到bean。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--指定文件路径-->
    <bean id="helloBean" class="com.Re.beanDemo.HelloSpring">
        <!--通过property给参数赋值 -->
        <property name="name" value="Re"/>
    </bean>

    <!--&lt;!&ndash;默认方式装配,有两个bean:customer和person-->
        <!--property name="person"指向Customer.setPerson方法-->
        <!--ref="person"指向"<bean id="person" class="com.Re.autowiredDemo.Person"/>"&ndash;&gt;-->
    <!--<bean id="customer" class="com.Re.autowiredDemo.Customer">-->
        <!--<property name="person" ref="person"/>-->
    <!--</bean>-->

    <!--<bean id="person" class="com.Re.autowiredDemo.Person">-->
        <!--&lt;!&ndash;将“hello”赋值给参数“hei”&ndash;&gt;-->
        <!--<property name="hei" value="hello"/>-->
    <!--</bean>-->

    <!--byName方式自动装配-->
    <bean id="customer" class="com.Re.autowiredDemo.Customer" autowire="byName"/>

    <bean id="address2" class="com.Re.autowiredDemo.Address">
        <property name="myaddress" value="杭州西湖"/>
    </bean>


</beans>

运行测试Test.java,address=null


image.png

第三种:byType

类型自动装配,通过判断一个bean属性的数据类型与其他bean的数据类型相同,自动装配
拿上面的例子说,Customer类里的属性address的类型是“Address”,与“Address” bean中的数据类型是一样的,所以Spring会通过setter方法自动装配 setAddress(Address address)

修改配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--指定文件路径-->
    <bean id="helloBean" class="com.Re.beanDemo.HelloSpring">
        <!--通过property给参数赋值 -->
        <property name="name" value="Re"/>
    </bean>

    <!--&lt;!&ndash;默认方式装配,有两个bean:customer和person-->
        <!--property name="person"指向Customer.setPerson方法-->
        <!--ref="person"指向"<bean id="person" class="com.Re.autowiredDemo.Person"/>"&ndash;&gt;-->
    <!--<bean id="customer" class="com.Re.autowiredDemo.Customer">-->
        <!--<property name="person" ref="person"/>-->
    <!--</bean>-->

    <!--<bean id="person" class="com.Re.autowiredDemo.Person">-->
        <!--&lt;!&ndash;将“hello”赋值给参数“hei”&ndash;&gt;-->
        <!--<property name="hei" value="hello"/>-->
    <!--</bean>-->

    <!--&lt;!&ndash;byName方式自动装配&ndash;&gt;-->
    <!--<bean id="customer" class="com.Re.autowiredDemo.Customer" autowire="byName"/>-->

    <!--<bean id="address2" class="com.Re.autowiredDemo.Address">-->
        <!--<property name="myaddress" value="杭州西湖"/>-->
    <!--</bean>-->


    <!--通过类型自动装配-->
    <bean id="customer" class="com.Re.autowiredDemo.Customer" autowire="byType"/>
    <bean id="address2" class="com.Re.autowiredDemo.Address">
        <property name="myaddress" value="杭州余杭"/>
    </bean>



</beans>

运行测试Test.java


image.png

如果配置文件里创建了两个一样类型的bean,就会装配失败,程序不知道要选择哪个。
所以,如果使用按类型自动装配,那么要确保bean只有唯一一个数据类型声明。


image.png

参考https://www.yiibai.com/spring/spring-auto-wiring-beans-in-xml.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容