使用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> t getbean(string name) throws beansexception { return (t) beanfactory.getbean(name); } public static <t> t getbean(class<t> 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 <t> * @return * @throws illegalaccessexception * @throws instantiationexception */ public static <t> 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<script> item = service.findall()//执行bean中数据查询方法 for (script s : item) { log.info("创建人:[{}],规则id:[{}],名称:[{}]", s.getcreateperson(), s.getruleid(), s.getscriptname()) } log.info("groovy结束执行,当前类{}", this.getclass()) }}
第五步:实例化脚本,执行方法 @getmapping("/loadbean") public void loadbean(){ string script = callanalysisgroovytask.getgroovy(); //获取脚本 callanalysisgroovytask.execgroovy(script);//实例化脚本,执行方法 log.info("数据查询成功..."); }
脚本运行结果:
以上就是java如何使用beanfactorypostprocessor注入bean的详细内容。