Memperkenalkan keupayaan skrip ke dalam aplikasi kami boleh meningkatkan fleksibiliti kerja teras kami boleh menumpukan pada pembangunan keupayaan platform teras Fungsi senario tertentu boleh dilaksanakan melalui skrip Sebagai contoh, Jenkins boleh menggunakan skrip Groovy tulis saluran paip, yang boleh menyesuaikan proses binaan secara fleksibel. Spring sendiri menyediakan mekanisme untuk integrasi groovy, yang dibahagikan kepada dua cara Salah satunya adalah menggunakan groovy untuk membangunkan program, yang serupa dengan pembangunan dengan java dan perlu disusun. Satu adalah untuk melaksanakan groovy sebagai skrip tanpa penyusunan. Apa yang kami perkenalkan di sini ialah cara kedua, menggunakan groovy sebagai skrip.
Terdapat dua idea utama untuk menyepadukan skrip groovy dalam musim bunga Salah satunya adalah untuk mentakrifkan kacang dalam skrip groovy, supaya skrip groovy disepadukan ke dalam keseluruhan sistem spring tiada beza menggunakan kacang biasa. Salah satunya ialah memanggil skrip groovy dalam program dan menjadikan skrip groovy sebagai komponen boleh laku. Di bawah ini kami memperkenalkan kedua-dua kaedah ini masing-masing. Terdapat dua cara untuk mengisytiharkan kacang yang ditakrifkan dalam skrip groovy pada musim bunga, satu ialah xml tradisional, dan satu lagi ialah kaedah pengisytiharan groovy yang diperkenalkan dalam spring-framework-4.
Mula-mula kita tentukan antara muka:
public interface MyService { String fun(MyDomain myDomain); }
Berikut ialah idea, kita boleh menulis pelaksanaan antara muka lalai dalam kod java, Jika lalai pelaksanaan tidak memenuhi keperluan senario tertentu, bekerjasama dengan mod strategi dan menggunakan skrip groovy untuk melaksanakan senario tertentu Program ini akan menjadi sangat fleksibel Dengan mekanisme pemuatan panas skrip, apabila logik pemprosesan perlu diubah, semasa perjalanan program, Kami boleh melaraskan kandungan skrip pada bila-bila masa dan ia akan berkuat kuasa tepat pada masanya.
Laksanakan antara muka ini dalam skrip groovy MyServiceImpl.groovy
:
class MyServiceImpl implements MyService { @Autowired FunBean useBean; String myProp; String fun(MyDomain myDomain) { return myDomain.toString() + useBean.getFunName() + myProp; } }
Berikut menerangkan cara mengisytiharkan kacang melalui kaedah konfigurasi xml dan groovy.
Mengisytiharkan kacang melalui konfigurasi xml ialah kaedah tradisional musim bunga baru-baru ini telah digantikan dengan mengisytiharkan melalui kod java cara paling mudah untuk mengisytiharkan kacang yang ditakrifkan dalam skrip groovy.
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang" xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang https://www.springframework.org/schema/lang/spring-lang.xsd"> <lang:groovy id="myServiceXml" script-source="classpath:MyServiceImpl.groovy" refresh-check-delay="10000" > <lang:property name="myProp" value=" this is xml init prop" /> </lang:groovy> </beans>
Kod xml di atas mengisytiharkan kacang myServiceXml dan script-source
menyatakan bahawa sumber kacang ini ialah fail skrip classpath:MyServiceImpl.groovy
. Gantikan classpath dengan fail untuk menentukan fail skrip di mana-mana lokasi. refresh-check-delay
mentakrifkan selang muat semula skrip Apabila kandungan skrip berubah, kandungan skrip boleh dimuat semula secara automatik. lang:property
Teg ini boleh memulakan dan memberikan nilai kepada sifat kacang.
Kami menetapkan nilai awal yang berbeza kepada atribut myProp menggunakan kaedah xml dan groovy untuk mengisytiharkan kacang, yang boleh dilihat dalam kod demonstrasi seterusnya.
Spring-framework-4 memperkenalkan kaedah groovy untuk mengisytiharkan kacang Kami menggunakan groovy untuk mengisytiharkan myServiceGroovy bean. kaedah pengisytiharan groovy lebih mudah dibaca.
Untuk pengenalan terperinci, lihat catatan blog rasmi musim bunga: Groovy Bean Configuration dalam Spring Framework 4
import org.springframework.scripting.groovy.GroovyScriptFactory import org.springframework.scripting.support.ScriptFactoryPostProcessor beans { scriptFactoryPostProcessor(ScriptFactoryPostProcessor) { defaultRefreshCheckDelay = 10000 } myServiceGroovy(GroovyScriptFactory, 'classpath:MyServiceImpl.groovy') { bean -> bean.scope = "prototype" myProp = ' this is Bean Builder init prop' bean.beanDefinition.setAttribute(ScriptFactoryPostProcessor.REFRESH_CHECK_DELAY_ATTRIBUTE, 6000) } }
Melalui GroovyScriptFactory
, anda boleh menentukan lokasi skrip groovy yang mentakrifkan kacang. Melalui ungkapan lambda bean
, anda boleh menetapkan nilai pada sifat kacang Sebagai tambahan kepada sifat myProp yang kami tentukan, anda juga boleh menentukan masa penyegaran skop dan skrip.
Sebelum ini kami mengisytiharkan 2 kacang melalui xml dan groovy: myServiceXml
dan myServiceGroovy
Seterusnya kami memanggilnya dalam program 2 kacang ini.
@SpringBootApplication @ImportResource({"classpath:xml-bean-config.xml", "classpath:BeanBuilder.groovy"}) public class Application implements CommandLineRunner { @Autowired private MyService myServiceXml; @Autowired private MyService myServiceGroovy; public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void run(String... args) throws ScriptException, ResourceException, IllegalAccessException, InstantiationException { MyDomain myDomain = new MyDomain(); myDomain.setName("test"); System.out.println(myServiceXml.fun(myDomain)); myDomain.setName("test2"); System.out.println(myServiceGroovy.fun(myDomain)); } }
Mula-mula kami memperkenalkan fail pengisytiharan kacang melalui @ImportResource
, dan kemudian suntikan kebergantungan dan kaedah penggunaan kacang biasa Anda boleh melihat bahawa dalam penggunaan kacang, kacang yang ditakrifkan oleh skrip dan kacang yang ditulis dalam program kacang tiada bezanya. Dalam kaedah larian, kami memanggil kaedah keseronokan kedua-dua kacang myServiceXml dan myServiceGroovy masing-masing. Jalankan kaedah run untuk melihat output:
MyDomain(name=test)FunBean this is xml init prop MyDomain(name=test2)FunBean this is Bean Builder init prop
Selain melaksanakan beans in groovy seperti yang dinyatakan sebelum ini, kami juga boleh melaksanakannya melalui GroovyScriptEngine yang disediakan oleh groovy Skrip Groovy, kaedah ini tidak bergantung pada rangka kerja spring dan juga boleh digunakan dalam program java biasa.
@Component public class MyEngine { private final GroovyScriptEngine engine; @Autowired private FunBean funBean; public MyEngine() throws IOException { engine = new GroovyScriptEngine(ResourceUtils.getFile("classpath:scripts/").getAbsolutePath() , this.getClass().getClassLoader()); } public void runScript(int x, int y) throws IllegalAccessException, InstantiationException, ResourceException, ScriptException { Class<GroovyObject> calcClass = engine.loadScriptByName("CalcScript.groovy"); GroovyObject calc = calcClass.newInstance(); Object result = calc.invokeMethod("calcSum", new Object[]{x, y}); System.out.println("Result of CalcScript.calcSum() method is " + result); Binding binding = new Binding(); binding.setVariable("arg", "test"); binding.setVariable("funBean", funBean); Object result1 = engine.run("CalcScript.groovy", binding); System.out.println("Result of CalcScript.groovy is " + result1); } }
Mula-mula kita memulakan GroovyScriptEngine dan meneruskan laluan ke fail skrip dalam kaedah pembinaan.
Terdapat dua cara untuk melaksanakan skrip Satu ialah mendapatkan GroovyObject dan melaksanakan kaedah dalam skrip melalui invokeMethod Parameter kaedah dihantar melalui tatasusunan Objek.
Class<GroovyObject> calcClass = engine.loadScriptByName("CalcScript.groovy"); GroovyObject calc = calcClass.newInstance(); Object result = calc.invokeMethod("calcSum", new Object[]{x, y});
Yang kedua ialah menjalankan skrip groovy secara terus, dan anda boleh menghantar pembolehubah kepada skrip groovy melalui Binding.
rreeeeAtas ialah kandungan terperinci Bagaimana untuk mengintegrasikan springboot dengan skrip groovy. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!