欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaWeb学习笔记-spring-04-ioc-bean装载

程序员文章站 2022-05-23 10:20:04
...

Bean装载

//id:bean名称
//class:bean类名
//id也可以使用name,id命名有规范,name没有
//id与name可以定义多个,使用逗号,分号或空格分隔
//不允许出现两个相同id的bean,可以出现相同name的bean,后者会覆盖前者,所有应尽量使用id
//id与name未指定,自动使用全限定类名作为Bean名称
<bean id="foo" class="com.smart.bean.Foo"/>

如果出现多个相同匿名bean

<bean class="com.smart.Car"/>
<bean class="com.smart.Car"/>
<bean class="com.smart.Car"/>
getBean("com.smart.Car")//第一个bean
getBean("com.smart.Car#1")//第二个bean
getBean("com.smart.Car#2")//第三个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="car" class="com.smart.Car"></bean>
</beans>

依赖注入

属性Setter注入

public class Car2 {
    //javabean属性必须满足变量前面两个字母大小写一致,否则spring会出错
    private int maxSpeed;
    private String brand;
    private double price;

    public int getMaxSpeed() {
        return maxSpeed;
    }

    public void setMaxSpeed(int maxSpeed) {
        this.maxSpeed = maxSpeed;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}
<?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="car" class="com.smart.Car2">
        <property name="maxSpeed">
            <value>200</value>
        </property>
        <property name="brand">
            <value>红旗</value>
        </property>
        <property name="price">
            <value>200000</value>
        </property>
    </bean>

</beans>

构造器注入

public class User{
    private Stirng name;
    public User(String name){
        this.name = name;
    }
}

配置Bean

<bean name="user" class="xxx.User">
    <constructor-arg>
        <value>无语</value>
    </constructor-arg>
    <constructor-arg>
        <value>30</value>
    </constructor-arg>
    <constructor-arg>
        <value></value>
    </constructor-arg>
</bean>

construct-arg属性
index
type

<bean id="car" class="com.smart.Car">
    <!--索引从0开始-->
    <constructor-arg index="0" value="xxx"/>
    <constructor-arg index="1" value="xxx"/>
    <constructor-arg index="2" value="xxx"/>
</bena>
<bena id="car" class="com.smart.Car">
    <constructor-arg index="0" type="java.lang.String">
        <value>xxx</value>
    </constructor-arg>
    <constructor-arg index="1" type="java.lang.String">
        <value>xxx</value>
    </constructor-arg>
    <constructor-arg index="2" type="int">
        <value>200</value>
    </constructor-arg>
</bean>

循环依赖








引用其他bean




注入参数详解

字面值

<bena id="car" class="com.smart.Car">
    <property name="maxSpeed">
        <value>200</value>
    </property>
    <property name="brand">
        <!-- <![CDATA[]]处理特殊字符串,防止破坏xml结构>-->
        <value>![CDATA[红旗&CA72]]</value>
    </property>
</bean>

引入其他bean

<!--car bean-->
<bean id="car" class="com.smart.Car"/>
<bean id="boss" class="com.smart.Boss">
    <property name="car">
        <ref bean="car"></ref>
    </property>
</bean>
  • ref
    • bean //引用同一容器或父容器的bean
    • local //引用同一配置文件中的bean
    • parent //引用父容器中的bean
<!--在父容器中定义car-->
<bean id="car" class="com.smart.Car">
    <property name="brand" value="xxx"/>
    <property name="maxSpeed" value="200"/>
    <property name="price" value="2000"/>
</bean>
<!--定义和父容器car相同id的bean-->
<bean id="car" class="com.smart.Car">
    <property name="brand" value="xxx">
    <property name="maxSpeed" value="200"/>
    <property name="price" value="2000"/>
</bean>
<bean id="boss" class="com.smart.Boss">
    <property name="car">
        <!--引用父容器car,使用<ref bean="car"/>将引用本容器的car-->
        <ref parent="car"/>
    </propery>
</bean>
//父容器
ClassPathXmlApplicationContext pFactory = new ClassPathXmlApplicationContext(new String[]{"com/smart/beans.xml"});
//指定pFactory为该容器父容器
ApplicationContext factory = new ClassPathXmlApplicationContext(new String[]{com/smart/beans2.xml},pFactory);
Boss boss = (Boss)factory.getBean("boss");
System.out.println(boss.getCar().toString());

集合类型属性

list

<bean id="boss" class="com.smart.Boss">
    <property name="favorites">
        <list>
            <!--可以通过value注入字面值,也可以通过ref注入bean-->
            <value>xxx</value>
            <value>xxx</value>
            <value>xxx</value>
        </list>
    </property>
</bean>

map

<bean id="boss" class="com.smart.Boss">
    <property name="jobs">
        <map>
            <entity>
                <key><value>xxx</value></key>
                <value>xxx</value>
            </entity>
            <entity>
                <key><value>xxx</value></key>
                <value>xxx</value>
            </entity>
        </map>
    </property>
</bean>
<!--map键和值是对象-->
<entity>
    <key><ref bena="keyBean"></key>
    <ref bena="valueBean"/>
</entity>

properties

<!--properties只能使用字符串,没有value子元素标签-->
<bean id="boss" class="com.smart.Boss">
    <property name="mails">
        <props>
            <prop key="jobMail">[email protected]</prop>
            <prop key="lifeMail">[email protected]</prop>
        </props>
    </property>
</bean>

通过util命名空间配置集合类型bean

xmlns:util="http://www.springframework.org/schema/util"
xsi:scheamLocation="http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-.1.xsd"
<!--list类型-->
<util:list id="favoriteList1" list-class="java.util.LinkedList"
    <value>xxx</value>
    <value>xxx</value>
    <value>xxx</value>
</uil:list>
<!--set类型,可以使用set-class指定set实现类-->
<util:set id="favoriteSet1">
    <value>xxx</value>
    <value>xxx</value>
    <value>xxx</value>  
</util:set>
<!--map类型,可以使用map-class指定map实现类-->
<util:map id="emails">
    <entry key="AM" value="xxx"/>
    <entry key="PM" value="xxx">
</util:map>

p元素简化配置

<xmlns:p="http://www.springframework.org/schema/p">
<bean id="car" class="com.smart.Car"
    p:brand="xxx"
    p:maxSpeed="xxx"
    p:price="xxx"/>
p:<属性名>="xxx"
p:<属性名>_ref="xxx"

自动装配

元素自动装配类型属性autowire=”<自动装配类型>”

自动装配类型|说明

byName|根据名称自动匹配
byType|根据类型自动匹配
constructor|与byType类似,只针对构造函数注入
autodetect|根据bean自省机制决定采用byType还是constructor

中的default-autowire属性可以配置全局自动匹配,默认为no,表示不自动装配,其他可选配置为byName,byType,constructor,autodetect
中定义的自动装配策略会被自动装配策略覆盖