spring通过bean名称,方法名,反射调用服务。

示例代码

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Method;

public class SpringReflectUtils implements ApplicationContextAware {
    /**
     * Spring容器 spring应用上下文对象
     */
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringReflectUtils.applicationContext = applicationContext;
    }

    /**
     * 对象名称获取spring bean对象
     * @param name
     * @return
     * @throws BeansException
     */
    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }

    /**
     * 根据 服务名称 ,方法名 反射调用  spring bean 中的 方法
     * @param serviceName 服务名
     * @param methodName 方法名
     * @param params 参数
     * @return
     * @throws Exception
     */
    public static Object springInvokeMethod(String serviceName, String methodName, Object[] params) throws Exception {
        Object service = getBean(serviceName);
        Class<? extends Object>[] paramClass = null;
        if (params != null) {
            int paramsLength = params.length;
            paramClass = new Class[paramsLength];
            for (int i = 0; i < paramsLength; i++) {
                paramClass[i] = params[i].getClass();
            }
        }
        // 找到方法
        Method method = ReflectionUtils.findMethod(service.getClass(), methodName, paramClass);
        // 执行方法
        return ReflectionUtils.invokeMethod(method, service, params);
    }
}
### Spring Bean 生命周期各阶段调用方法详解 #### 1. 实例化(Instantiation) 在这一阶段,Spring 容器通过反射机制创建 Bean 的实例。如果 Bean 配置了 `factory-method` 或者指定了自定义工厂类,则会按照指定的方式进行实例化[^1]。 ```java // 假设有一个简单的 Java 类作为 Bean public class MyBean { public MyBean() { System.out.println("MyBean instance created"); } } ``` #### 2. 属性注入(Populate Properties / Dependency Injection) 在此阶段,Spring 容器将配置文件或注解中声明的依赖项注入到已经创建好的 Bean 中。这可以通过构造函数注入、Setter 注入或者字段注入来完成[^2]。 ```java @Autowired private AnotherBean anotherBean; @Value("${my.property}") private String myProperty; ``` 当上述代码中的 `AnotherBean` 和 `my.property` 被成功解析并赋值时,即完成了属性注入过程。 #### 3. 初始化(Initialization) 此阶段分为两个子阶段: - **Aware 接口回调**:如果 Bean 实现了一些特定接口(如 `ApplicationContextAware`, `BeanNameAware`),则会在该阶段调用这些接口的相关方法。 - **初始化前处理**:执行 `PostProcessor` 处理逻辑,例如 `BeanFactoryPostProcessor` 和 `BeanPostProcessor` 的前置操作。 - **自定义初始化方法**:如果有配置 `<bean init-method="...">` 或实现了 `InitializingBean` 接口,则会触发相应的初始化方法。 以下是常见的初始化方式: ```java @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; // ApplicationContextAware 接口实现 } @Override public void afterPropertiesSet() throws Exception { initialize(); // InitializingBean 接口实现 } public void customInitMethod() { System.out.println("Custom initialization method called"); // 自定义 init 方法 } ``` #### 4. 使用(Usage) 一旦 Bean 成功初始化完毕,它就可以被应用程序所使用。在这个阶段,Spring 不再干预 Bean 的行为,而是交由业务逻辑控制其运行状态[^3]。 #### 5. 销毁(Destruction) 对于单例作用域外的其他作用域(如原型 Prototype),只有在其显式销毁时才会进入此阶段;而对于单例 Bean,在应用上下文关闭时自动触发销毁逻辑。具体包括以下几个方面: - 执行 `DisposableBean` 接口中定义的 `destroy()` 方法; - 如果有配置 `<bean destroy-method="...">`,则会调用对应的销毁方法。 示例代码如下所示: ```java @Override public void destroy() throws Exception { cleanupResources(); } public void customDestroyMethod() { System.out.println("Custom destruction method called"); // 自定义 destroy 方法 } ``` --- ### 总结 以上便是 Spring Bean 生命周期的主要阶段及其对应调用方法概述。理解这些细节有助于开发者更好地利用 Spring 提供的功能特性,从而构建更加灵活高效的系统架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值