4 Spring IoC工厂方法 & 自动转载

1 Spring 的工厂方法

IoC 通过工厂模式创建 bean 的方式有两种:

  • 静态工厂方法
  • 实例工厂方法

1.1 静态工厂方法示例

(1)创建实体类 Car

package com.southwind.entity;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Car {
    private Long id;
    private String name;
}

(2)创建静态工厂 StaticCarFactory

package com.southwind.Factory;

import com.southwind.entity.Car;

import java.util.HashMap;
import java.util.Map;

public class StaticCarFactory {
    private static Map<Long, Car> carMap;
    static{
        carMap = new HashMap<>();
        carMap.put(1L,new Car(1L,"宝马"));
        carMap.put(2L,new Car(2L,"奔驰"));
    }

    public static Car getCar(long id){
        return carMap.get(id);
    }
}

(3)配置静态工厂创建 Car

    <!-- 配置静态工厂创建 Car -->
    <bean id="car" class="com.southwind.Factory.StaticCarFactory" factory-method="getCar">
        <constructor-arg value="2"></constructor-arg>
    </bean>

(4)测试

package com.southwind.test;

import com.southwind.Factory.StaticCarFactory;
import com.southwind.entity.Car;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test2 {
    public static void main(String[] args) {
//        Car car = StaticCarFactory.getCar(1L);
//        System.out.println(car);
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-factory.xml");
        Car car = (Car) applicationContext.getBean("car");
        System.out.println(car);
    }
}

1.2 实例工厂方法示例

(1)创建实例工厂 InstanceCarFactor

package com.southwind.Factory;

import com.southwind.entity.Car;

import java.util.HashMap;
import java.util.Map;

public class InstanceCarFactory {
    private static Map<Long, Car> carMap;

    public InstanceCarFactory(){
        carMap = new HashMap<>();
        carMap.put(1L,new Car(1L,"宝马"));
        carMap.put(2L,new Car(2L,"奔驰"));
    }

    public Car getCar(long id){
        return carMap.get(id);
    }
}

(2)配置实例工厂创建 Car

	<!-- 配置实例工厂 bean -->
    <bean id="carFactory" class="com.southwind.Factory.InstanceCarFactory"></bean>
    <!-- 配置实例工厂创建Car -->
    <bean id="car2" factory-bean="carFactory" factory-method="getCar">
        <constructor-arg value="1"></constructor-arg>
    </bean>

(3)测试

//        InstanceCarFactory instanceCarFactory = new InstanceCarFactory();
//        Car car = instanceCarFactory.getCar(1);
//        System.out.println(car);

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-factory.xml");
Car car = (Car) applicationContext.getBean("car2");
System.out.println(car);

2 IoC 自动装载(Autowire)

IoC 负责创建对象,DI 负责完成对象的依赖注入,通过配置 property 标签的 ref 属性来完成。同时 Spring 提供了另外一种更加简便的依赖注入方式:自动装载,不需要手动配置 property,IoC容器来自动选择 bean 完成注入。自动装载有两种方式:

  • byName:通过属性名自动装载
  • byType:通过属性的数据类型自动装载

2.1 byName

<!-- 假设 Car 类有一个属性为 Address address -->
<bean id="address" class="com.Address" autowire="byName"></bean>
<bean id="car" class="com.Car"></bean>

<!-- 则会自动将bean中 id为address的bean 赋给car对象的address属性 -->

2.2 byType

<!-- 假设 Car 类有一个属性为 Address address -->
<bean id="address" class="com.Address" autowire="byType"></bean>
<bean id="car" class="com.Car"></bean>

<!-- 则会自动将bean中 Class为Address的bean 赋给car对象的address属性 -->

注意:如果同时存在两个及以上符合条件的 bean 时,自动装置会抛出异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值