Java Spring 框架技术从入门到放弃:Spring生态之Spring 对象实例化的本质操作学习笔记

Java Spring 框架技术从入门到放弃:Spring生态之Spring 对象实例化的本质操作学习笔记

一、Spring 对象实例化概述

概念

在 Spring 框架里,对象实例化指的是将类转化为具体对象的过程。Spring 负责管理对象的创建、生命周期和依赖关系,这是 Spring IoC(控制反转)容器的核心功能之一。

生活案例

把 Spring 容器想象成一家大型工厂,而类就像是工厂里的产品设计蓝图。对象实例化就如同工厂依据设计蓝图生产出一个个具体的产品。例如,汽车工厂根据汽车设计蓝图制造出一辆辆汽车,Spring 容器则依据类的定义创建出一个个对象。

二、Spring 对象实例化的方式

1. 构造器实例化

原理

这是最基本的实例化方式,Spring 通过调用类的构造器来创建对象。如果类只有一个无参构造器,Spring 会直接调用它;如果有多个构造器,Spring 会根据配置或自动装配规则选择合适的构造器。

生活案例

假设你要定制一款蛋糕,蛋糕店会根据你选择的蛋糕款式(对应类),按照既定的制作流程(构造器)来制作蛋糕。如果是普通的奶油蛋糕,制作过程相对简单(无参构造器);如果是带有特殊装饰和口味的蛋糕,就需要更复杂的制作流程(有参构造器)。

具体应用
// 定义一个类
public class Cake {
    // 无参构造器
    public Cake() {
        System.out.println("制作一个普通蛋糕");
    }

    // 有参构造器
    public Cake(String flavor) {
        System.out.println("制作一个 " + flavor + " 口味的蛋糕");
    }
}

// Spring 配置文件(XML 方式)
<bean id="cake" class="com.example.Cake">
    <!-- 如果使用有参构造器,可通过 constructor-arg 标签传入参数 -->
    <constructor-arg value="巧克力"/>
</bean>

2. 静态工厂方法实例化

原理

使用静态工厂方法创建对象,Spring 会调用类的静态方法来获取对象实例。静态工厂方法可以根据不同的条件返回不同类型的对象。

生活案例

想象有一家玩具工厂,它有一个静态的生产方法。你可以根据不同的需求,通过这个方法生产出不同类型的玩具,比如机器人、娃娃等。工厂不需要每次都重新创建生产流程,只需要调用这个静态方法就可以生产出所需的玩具。

具体应用
// 静态工厂类
public class ToyFactory {
    public static Toy createToy(String type) {
        if ("robot".equals(type)) {
            return new RobotToy();
        } else if ("doll".equals(type)) {
            return new DollToy();
        }
        return null;
    }
}

// 玩具接口
interface Toy {
    void play();
}

// 机器人玩具类
class RobotToy implements Toy {
    @Override
    public void play() {
        System.out.println("玩机器人玩具");
    }
}

// 娃娃玩具类
class DollToy implements Toy {
    @Override
    public void play() {
        System.out.println("玩娃娃玩具");
    }
}

// Spring 配置文件(XML 方式)
<bean id="robotToy" class="com.example.ToyFactory" factory-method="createToy">
    <constructor-arg value="robot"/>
</bean>

3. 实例工厂方法实例化

原理

通过实例工厂类的非静态方法创建对象。首先需要创建工厂类的实例,然后调用该实例的方法来获取对象实例。

生活案例

还是以玩具工厂为例,这次工厂有一个具体的车间主任(工厂类的实例)。你需要先找到这个车间主任,然后告诉他你想要的玩具类型,车间主任会根据你的需求安排生产(调用非静态方法创建对象)。

具体应用
// 实例工厂类
public class ToyInstanceFactory {
    public Toy createToy(String type) {
        if ("robot".equals(type)) {
            return new RobotToy();
        } else if ("doll".equals(type)) {
            return new DollToy();
        }
        return null;
    }
}

// Spring 配置文件(XML 方式)
<bean id="toyFactory" class="com.example.ToyInstanceFactory"/>
<bean id="dollToy" factory-bean="toyFactory" factory-method="createToy">
    <constructor-arg value="doll"/>
</bean>

三、Spring 对象实例化的本质

反射机制

Spring 对象实例化的本质是基于 Java 的反射机制。反射允许程序在运行时动态地获取类的信息,包括构造器、方法和字段等,并可以通过这些信息来创建对象、调用方法和访问字段。

生活案例

反射机制就像是一个万能钥匙,它可以在不知道具体房间(类)布局的情况下,打开房间的门(创建对象),并了解房间里的物品(类的属性和方法)。Spring 利用反射机制,根据类的定义和配置信息,动态地创建对象。

具体应用

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectionExample {
    public static void main(String[] args) {
        try {
            // 获取类的 Class 对象
            Class<?> clazz = Class.forName("com.example.Cake");
            // 获取无参构造器
            Constructor<?> constructor = clazz.getConstructor();
            // 通过构造器创建对象
            Object cake = constructor.newInstance();
        } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException |
                 IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

四、Spring 对象实例化的生命周期

生命周期阶段

  1. 实例化:通过构造器、静态工厂方法或实例工厂方法创建对象。
  2. 属性赋值:Spring 容器将对象的依赖属性注入到对象中。
  3. 初始化:调用对象的初始化方法,例如实现 InitializingBean 接口的 afterPropertiesSet 方法,或者使用 @PostConstruct 注解标记的方法。
  4. 使用:对象可以被使用,处理业务逻辑。
  5. 销毁:在容器关闭时,调用对象的销毁方法,例如实现 DisposableBean 接口的 destroy 方法,或者使用 @PreDestroy 注解标记的方法。
生活案例

以一辆汽车的生命周期为例,首先汽车在工厂里被生产出来(实例化),然后安装各种零部件(属性赋值),接着进行检测和调试(初始化),之后就可以上路行驶(使用),最后当汽车达到使用年限或出现严重故障时,就会被报废处理(销毁)。

具体应用

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class Car {
    private String brand;

    public Car() {
        System.out.println("汽车被生产出来");
    }

    public void setBrand(String brand) {
        this.brand = brand;
        System.out.println("安装 " + brand + " 品牌标识");
    }

    @PostConstruct
    public void init() {
        System.out.println("汽车初始化完成,准备上路");
    }

    public void drive() {
        System.out.println(brand + " 汽车正在行驶");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("汽车报废处理");
    }
}

// Spring 配置文件(XML 方式)
<bean id="car" class="com.example.Car">
    <property name="brand" value="宝马"/>
</bean>

五、最佳实践与注意事项

最佳实践

  • 优先使用构造器注入依赖,这样可以确保对象在创建时就具备所有必要的依赖。
  • 合理使用静态工厂方法和实例工厂方法,根据实际需求选择合适的实例化方式。
  • 遵循 Spring 对象的生命周期,在初始化和销毁方法中进行必要的操作,例如资源的初始化和释放。

注意事项

  • 反射机制虽然强大,但会带来一定的性能开销,应避免在性能敏感的场景中过度使用。
  • 在使用有参构造器时,要确保参数的正确性,避免出现 NoSuchMethodException 等异常。

六、预习后续知识

1. Spring AOP

学习 Spring AOP(面向切面编程),了解如何在对象的生命周期中添加额外的功能,例如日志记录、事务管理等。

2. Spring Boot 自动配置

掌握 Spring Boot 自动配置的原理,了解 Spring Boot 如何自动实例化和配置对象,简化开发过程。

3. Spring 事务管理

学习 Spring 事务管理的机制,了解如何在对象的业务操作中实现事务的一致性和隔离性。

通过对 Spring 对象实例化的本质操作的学习,我们可以更好地理解 Spring 框架的核心原理,提高开发效率和代码质量。同时,为后续学习更高级的 Spring 技术打下坚实的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zl515035644

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值