Spring中实例化Bean的三种方式

朴灿烈づ我的快乐病毒、 2023-02-21 06:34 27阅读 0赞

目录直通车

1、构造器方法实例化 Bean

2、静态工厂实例化 Bean

3、实例工厂实例化 Bean

静态工厂实例化Bean与实例工厂实例化Bean的区别


实例化 Bean 是 Bean 生命周期的第一步。

假设现在有一个下面这样的实体类

  1. public class Car {
  2. private String brand;
  3. private int price;
  4. public Car(){}
  5. public Car(String brand, int price) {
  6. this.brand = brand;
  7. this.price = price;
  8. }
  9. public String getBrand() {
  10. return brand;
  11. }
  12. public void setBrand(String brand) {
  13. this.brand = brand;
  14. }
  15. public int getPrice() {
  16. return price;
  17. }
  18. public void setPrice(int price) {
  19. this.price = price;
  20. }
  21. @Override
  22. public String toString() {
  23. return "Car{" +
  24. "brand='" + brand + '\'' +
  25. ", price='" + price + '\'' +
  26. '}';
  27. }
  28. }

1、构造器方法实例化 Bean

构造器方法分有参和无参两种,在XML中对上面这个实体进行实例化。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd" profile="dev">
  6. <!-- 无参构造实例化 -->
  7. <bean id="car1" class="com.fun.entity.Car"/>
  8. <!-- 有参构造器实例化 -->
  9. <bean id="car2" class="com.fun.entity.Car">
  10. <!-- 指定构造器参数 index对应构造器中参数的位置 -->
  11. <!-- 也可以通过指定参数类型,指定参数名称来注入属性-->
  12. <constructor-arg index="0" value="大众"/>
  13. <constructor-arg index="1" value="300000"/>
  14. </bean>
  15. </beans>

之后再Main函数中,通过 ApplicationContext applicationContext = new ClassPathXmlApplicationContext()创建出IOC容器并 将xml文件加载到容器,通过applicationContext对象即可获取到 person1 和 person2了。

2、静态工厂实例化 Bean

  1. <!-- 通过静态工厂方法来配置bean
  2. 此处配置的是car,而不是StaticFactory -->
  3. <bean id="car1" class="com.fun.StaticFactory" factory-method="getCar">
  4. <!-- constructor-args 传入value参数到getCar函数 -->
  5. <constructor-arg value="Audi"/>
  6. </bean>
  7. /**
  8. * 静态工厂方法
  9. */
  10. public class StaticFactory {
  11. private static Map<String,Car> cars = new HashMap<>();
  12. static {
  13. cars.put("Audi",new Car("Audi",300000));
  14. cars.put("Benz",new Car("Benz",660000));
  15. }
  16. public static Car getCar(String name){
  17. return cars.get(name);
  18. }
  19. }

通过xml中传入的 name,获取到对应 car 对象。

  1. public class StaticFactoryApplication {
  2. public static void main(String[] args) {
  3. ApplicationContext ctx = new
  4. ClassPathXmlApplicationContext("com/spring/beans/InstantiateBean/InstanceAndStaticFactory/bean-factory.xml");
  5. Car car1 = (Car) ctx.getBean("car1");
  6. System.out.println(car1);
  7. }

3、实例工厂实例化 Bean

  1. <!-- 实例工厂方法 -->
  2. <bean id="carFactory" class="com.fun.InstanceFactory"/>
  3. <bean id="car2" factory-bean="carFactory" factory-method="getCar">
  4. <constructor-arg value="benz"/>
  5. </bean>
  6. /**
  7. * 实例工厂方法
  8. * 现需要创建工厂本身再调用工厂的实例方法来返回bean的实例
  9. */
  10. public class InstanceFactory {
  11. private Map<String,Car> cars = new HashMap<>();
  12. public InstanceFactory(Map<String, Car> cars) {
  13. this.cars = cars;
  14. }
  15. public InstanceFactory() {
  16. cars = new HashMap<>();
  17. cars.put("audi",new Car("audi",300000));
  18. cars.put("benz",new Car("benz",660000));
  19. }
  20. public Car getCar(String name) {
  21. return cars.get(name);
  22. }
  23. }
  24. public class FactoryApplication {
  25. public static void main(String[] args) {
  26. ApplicationContext ctx = new
  27. ClassPathXmlApplicationContext("com/spring/beans/InstantiateBean/InstanceAndStaticFactory/bean-factory.xml");
  28. Car car2 = (Car) ctx.getBean("car2");
  29. System.out.println(car2);
  30. }
  31. }

静态工厂实例化Bean与实例工厂实例化Bean的区别

对比如下两者的 XML。

  1. <!-- 静态工厂方法 -->
  2. <bean id="car1" class="com.fun.StaticFactory" factory-method="getCar">
  3. <constructor-arg value="Audi"/>
  4. </bean>
  5. <!-- 实例工厂方法 -->
  6. <bean id="carFactory" class="com.fun.InstanceFactory"/>
  7. <bean id="car2" factory-bean="carFactory" factory-method="getCar">
  8. <constructor-arg value="benz"/>
  9. </bean>

发表评论

表情:
评论列表 (有 0 条评论,27人围观)

还没有评论,来说两句吧...

相关阅读