千家信息网

java如何使用BeanFactoryPostProcessor注入Bean

发表于:2024-12-13 作者:千家信息网编辑
千家信息网最后更新 2024年12月13日,这篇文章主要介绍java如何使用BeanFactoryPostProcessor注入Bean,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用BeanFactoryPostPr
千家信息网最后更新 2024年12月13日java如何使用BeanFactoryPostProcessor注入Bean

这篇文章主要介绍java如何使用BeanFactoryPostProcessor注入Bean,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

使用BeanFactoryPostProcessor注入Bean:

它与 BeanPostProcessor接口类似,可以对bean的定义(配置元数据)进行处理;也就是spring ioc运行BeanFactoryPostProcessor在容器实例化任何其他的bean之前读取配置元数据,并有可能修改它;如果业务需要,可以配置多个BeanFactoryPostProcessor的实现类,通过"order"控制执行次序(要实现Ordered接口)。

第一步:创建实现SpringUtils 接口工具(组件)来获取spring bean

import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanFactoryPostProcessor;import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;import org.springframework.stereotype.Component;@Componentpublic class SpringUtils implements BeanFactoryPostProcessor {    /** Spring应用上下文环境 \*/    private static ConfigurableListableBeanFactory beanFactory;    @Override    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException    {        SpringUtils.beanFactory = beanFactory;    }    @SuppressWarnings("unchecked")    public static  T getBean(String name) throws BeansException    {        return (T) beanFactory.getBean(name);    }    public static  T getBean(Class clz) throws BeansException    {        T result = (T) beanFactory.getBean(clz);        return result;    }}

第二步:创建Groovy脚本装载类,动态解析脚本为Class

package com.example.groovy.testgroovy.task;import groovy.lang.GroovyClassLoader;public class GroovyUtils {    private final static ClassLoader classLoader = GroovyUtils.class.getClassLoader();//获取当前类装载器    //ClassLoader:就是类的装载器,它使JVM可以动态的载入Java类,JVM并不需要知道从什么地方(本地文件、网络等)载入Java类,这些都由ClassLoader完成。    public final static GroovyClassLoader groovyClassLoader = new GroovyClassLoader(classLoader);    //GroovyClassLoader:负责在运行时编译groovy源代码为Class的工作,从而使Groovy实现了将groovy源代码动态加载为Class的功能。    /**     * .     * 获取实例化对象     * @param script groovy脚本内容     * @param      * @return     * @throws IllegalAccessException     * @throws InstantiationException     */    public static  T instanceTaskGroovyScript(String script) throws IllegalAccessException, InstantiationException {        Class taskClz = groovyClassLoader.parseClass(script);        T instance = (T) taskClz.newInstance();        return instance;    }}

第三步:读取脚本内容,执行脚本

@Slf4j@Componentpublic class CallAnalysisGroovyTask {    /**     * .     * 读取脚本内容     *     * @return     */    public String getGroovy() {        String context = "";        try {            String path = "E:\\IDEAFile\\testgroovy\\src\\main\\resources\\groovy\\LoadBean.groovy";            context = FileUtils.readFileToString(new File(path));//将脚本内容转为字符串        } catch (IOException e) {            log.error("file is not found[{}]", e);        }        return context;    }    /**     * .     * 执行groovy脚本     *     * @param script     */    public void execGroovy(String script) {        try {            Runnable runnable = GroovyUtils.instanceTaskGroovyScript(script);//获取实例对象            runnable.run();//调用脚本方法        } catch (Exception t) {            log.error("execGroovy file {} error", script);        }    }}

第四步:在resources目录下创建.groovy文件

@Slf4jclass LoadBean implements Runnable {    /**     * .     * Groovy获取Bean     */    @Override    void run() {        log.info("Groovy开始执行,当前类{}", this.getClass())        ScriptService service = SpringUtils.getBean(ScriptService.class)        log.info("ApplicationContext获取对象[{}]", service.class)        List




0