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 时,自动装置会抛出异常。