scope 作⽤域
Spring 管理的 bean 是根据 scope 来⽣成的,表示 bean 的作⽤域,共4种,默认值是 singleton。
● singleton:单例,表示通过 IoC 容器获取的 bean 是唯⼀的。
● prototype:原型,表示通过 IoC 容器获取的 bean 是不同的。
● request:请求,表示在⼀次 HTTP 请求内有效。
● session:回话,表示在⼀个⽤户会话内有效。
request 和 session 只适⽤于 Web 项⽬,⼤多数情况下,使⽤单例和原型较多。
prototype 模式当业务代码获取 IoC 容器中的 bean 时,Spring 才去调⽤⽆参构造创建对应的 bean。
singleton 模式⽆论业务代码是否获取 IoC 容器中的 bean,Spring 在加载 spring.xml 时就会创建
bean。
Spring 的继承
与 Java 的继承不同,Java 是类层⾯的继承,⼦类可以继承⽗类的内部结构信息;Spring 是对象层⾯的继承,⼦对象可以继承⽗对象的属性值。

<bean id="student3" class="com.yin.Student" scope="prototype">
    <property name="id" value="3"></property>
    <property name="name" value="xiaoxiao"></property>
    <property name="age" value="18"></property>
    <property name="addresses" >
        <list>
            <ref bean="address"></ref>
            <ref bean="address2"></ref>
        </list>
    </property>
</bean>
<bean id="student4" class="com.yin.Student" parent="student3">
    <property name="name" value="mingming"></property>
</bean>
<bean id="address" class="com.yin.Address">
    <property name="id" value="1"></property>
    <property name="name" value="科技路"></property>
</bean>
<bean id="address2" class="com.yin.Address">
    <property name="id" value="1"></property>
    <property name="name" value="高新区"></property>
</bean>

Spring 的继承关注点在于具体的对象,⽽不在于类,即不同的两个类的实例化对象可以完成继承,前提是⼦对象必须包含⽗对象的所有属性,同时可以在此基础上添加其他的属性。
Spring 的依赖
与继承类似,依赖也是描述 bean 和 bean 之间的⼀种关系,配置依赖之后,被依赖的 bean ⼀定先创建,再创建依赖的 bean,A 依赖于 B,先创建 B,再创建 A。

<bean id="student5" class="com.yin.Student" depends-on="user2"></bean>
<bean id="user2" class="com.yin.User"></bean>

Spring 的 p 命名空间
p 命名空间是对 IoC / DI 的简化操作,使⽤ p 命名空间可以更加⽅便的完成 bean 的配置以及 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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
">
<bean id="student" class="com.southwind.entity.Student" p:id="1"
p:name="张三" p:age="22" p:address-ref="address"></bean>
<bean id="address" class="com.southwind.entity.Address" p:id="2"
p:name="科技路"></bean>
</beans>

Spring 的⼯⼚⽅法
IoC 通过⼯⼚模式创建 bean 的⽅式有两种:
● 静态⼯⼚⽅法

package com.yin;
public class Car {
    private  long id;
    private  String name;

    public Car() {
    }

    public Car(long id, String name) {
        this.id = id;
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Car{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

配置静态⼯⼚创建 Car

<bean id="car1" class="factory.Staticcar" factory-method="getCar">
    <constructor-arg value="1"></constructor-arg>
</bean>

● 实例⼯⼚⽅法

package factory;
import com.yin.Car;
import java.util.HashMap;
import java.util.Map;

public class instancecar {
    private Map<Long, Car> carMap;
    public  instancecar(){
        carMap =new HashMap<Long, Car>();
        carMap.put(1L,new Car(1L,"baoma"));
        carMap.put(2L,new Car(2L,"beichi"));
    }
    public   Car getCar(long id){
        return  carMap.get(id);
    }
}
<!--    配置实例工厂-->
    <bean id="carfactory" class="factory.instancecar"></bean>
<!--    赔偿实例工厂创建car-->
    <bean id="car2" factory-bean="carfactory" factory-method="getCar">
        <constructor-arg value="2"></constructor-arg>
    </bean>

IoC ⾃动装载(Autowire)
IoC 负责创建对象,DI 负责完成对象的依赖注⼊,通过配置 property 标签的 ref 属性来完成,同时
Spring 提供了另外⼀种更加简便的依赖注⼊⽅式:⾃动装载,不需要⼿动配置 property,IoC 容器会⾃动选择 bean 完成注⼊。
⾃动装载有两种⽅式:
● byName:通过属性名⾃动装载

<bean id="car" class="com.yin.Car">
    <property name="id" value="1"></property>
    <property name="name" value="dazhong"></property>
</bean>
<bean id="person1" class="com.yin.Person" autowire="byName">
    <property name="id" value="1"></property>
    <property name="name" value="haha"></property>

</bean>

● byType:通过属性的数据类型⾃动装载

<bean id="car" class="com.southwind.entity.Car">
<property name="id" value="2"></property>
<property name="name" value="奔驰"></property>
</bean>
<bean id="person" class="com.southwind.entity.Person" autowire="byType">
<property name="id" value="11"></property>
<property name="name" value="张三"></property>
</bean>

byType 需要注意,如果同时存在两个及以上的符合条件的 bean 时,⾃动装载会抛出异常。

最后修改:2021 年 05 月 10 日 09 : 09 PM
如果觉得我的文章对你有用,请随意赞赏