类 ScriptFactoryPostProcessor

java.lang.Object
cn.taketoday.scripting.support.ScriptFactoryPostProcessor
所有已实现的接口:
Aware, BeanClassLoaderAware, BeanFactoryAware, BeanPostProcessor, InstantiationAwareBeanPostProcessor, SmartInstantiationAwareBeanPostProcessor, DisposableBean, ResourceLoaderAware, cn.taketoday.core.Ordered

public class ScriptFactoryPostProcessor extends Object implements SmartInstantiationAwareBeanPostProcessor, BeanClassLoaderAware, BeanFactoryAware, ResourceLoaderAware, DisposableBean, cn.taketoday.core.Ordered
BeanPostProcessor that handles ScriptFactory definitions, replacing each factory with the actual scripted Java object generated by it.

This is similar to the FactoryBean mechanism, but is specifically tailored for scripts and not built into Framework's core container itself but rather implemented as an extension.

NOTE: The most important characteristic of this post-processor is that constructor arguments are applied to the ScriptFactory instance while bean property values are applied to the generated scripted object. Typically, constructor arguments include a script source locator and potentially script interfaces, while bean property values include references and config values to inject into the scripted object itself.

The following ScriptFactoryPostProcessor will automatically be applied to the two ScriptFactory definitions below. At runtime, the actual scripted objects will be exposed for "bshMessenger" and "groovyMessenger", rather than the ScriptFactory instances. Both of those are supposed to be castable to the example's Messenger interfaces here.

<bean class="cn.taketoday.scripting.support.ScriptFactoryPostProcessor"/>

 <bean id="bshMessenger" class="cn.taketoday.scripting.bsh.BshScriptFactory">
   <constructor-arg value="classpath:mypackage/Messenger.bsh"/>
   <constructor-arg value="mypackage.Messenger"/>
   <property name="message" value="Hello World!"/>
 </bean>

 <bean id="groovyMessenger" class="cn.taketoday.scripting.groovy.GroovyScriptFactory">
   <constructor-arg value="classpath:mypackage/Messenger.groovy"/>
   <property name="message" value="Hello World!"/>
 </bean>

NOTE: Please note that the above excerpt from a Framework XML bean definition file uses just the <bean/>-style syntax (in an effort to illustrate using the ScriptFactoryPostProcessor itself). In reality, you would never create a <bean/> definition for a ScriptFactoryPostProcessor explicitly; rather you would import the tags from the 'lang' namespace and simply create scripted beans using the tags in that namespace... as part of doing so, a ScriptFactoryPostProcessor will implicitly be created for you.

从以下版本开始:
4.0
作者:
Juergen Hoeller, Rob Harrop, Rick Evans, Mark Fisher, Sam Brannen
  • 字段详细资料

    • INLINE_SCRIPT_PREFIX

      public static final String INLINE_SCRIPT_PREFIX
      The Resource-style prefix that denotes an inline script.

      An inline script is a script that is defined right there in the (typically XML) configuration, as opposed to being defined in an external file.

      另请参阅:
    • REFRESH_CHECK_DELAY_ATTRIBUTE

      public static final String REFRESH_CHECK_DELAY_ATTRIBUTE
      The refreshCheckDelay attribute.
    • PROXY_TARGET_CLASS_ATTRIBUTE

      public static final String PROXY_TARGET_CLASS_ATTRIBUTE
      The proxyTargetClass attribute.
    • LANGUAGE_ATTRIBUTE

      public static final String LANGUAGE_ATTRIBUTE
      The language attribute.
    • logger

      protected final cn.taketoday.logging.Logger logger
      Logger available to subclasses.
  • 构造器详细资料

    • ScriptFactoryPostProcessor

      public ScriptFactoryPostProcessor()
  • 方法详细资料

    • setDefaultRefreshCheckDelay

      public void setDefaultRefreshCheckDelay(long defaultRefreshCheckDelay)
      Set the delay between refresh checks, in milliseconds. Default is -1, indicating no refresh checks at all.

      Note that an actual refresh will only happen when the ScriptSource indicates that it has been modified.

      另请参阅:
    • setDefaultProxyTargetClass

      public void setDefaultProxyTargetClass(boolean defaultProxyTargetClass)
      Flag to signal that refreshable proxies should be created to proxy the target class not its interfaces.
      参数:
      defaultProxyTargetClass - the flag value to set
    • setBeanClassLoader

      public void setBeanClassLoader(ClassLoader classLoader)
      指定者:
      setBeanClassLoader 在接口中 BeanClassLoaderAware
    • setBeanFactory

      public void setBeanFactory(BeanFactory beanFactory)
      指定者:
      setBeanFactory 在接口中 BeanFactoryAware
    • setResourceLoader

      public void setResourceLoader(cn.taketoday.core.io.ResourceLoader resourceLoader)
      从接口复制的说明: ResourceLoaderAware
      Set the ResourceLoader that this object runs in.

      This might be a ResourcePatternResolver, which can be checked through instanceof ResourcePatternResolver. See also the ResourcePatternUtils.getResourcePatternResolver method.

      Invoked after population of normal bean properties but before an init callback like InitializingBean's afterPropertiesSet or a custom init-method. Invoked before ApplicationContextAware's setApplicationContext.

      指定者:
      setResourceLoader 在接口中 ResourceLoaderAware
      参数:
      resourceLoader - the ResourceLoader object to be used by this object
      另请参阅:
      • PatternResourceLoader
      • PatternResourceLoader.fromResourceLoader(cn.taketoday.core.io.ResourceLoader)
    • getOrder

      public int getOrder()
      指定者:
      getOrder 在接口中 cn.taketoday.core.Ordered
    • predictBeanType

      @Nullable public Class<?> predictBeanType(Class<?> beanClass, String beanName)
      指定者:
      predictBeanType 在接口中 SmartInstantiationAwareBeanPostProcessor
    • postProcessBeforeInstantiation

      public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
      指定者:
      postProcessBeforeInstantiation 在接口中 InstantiationAwareBeanPostProcessor
    • prepareScriptBeans

      protected void prepareScriptBeans(BeanDefinition bd, String scriptFactoryBeanName, String scriptedObjectBeanName)
      Prepare the script beans in the internal BeanFactory that this post-processor uses. Each original bean definition will be split into a ScriptFactory definition and a scripted object definition.
      参数:
      bd - the original bean definition in the main BeanFactory
      scriptFactoryBeanName - the name of the internal ScriptFactory bean
      scriptedObjectBeanName - the name of the internal scripted object bean
    • resolveRefreshCheckDelay

      protected long resolveRefreshCheckDelay(BeanDefinition beanDefinition)
      Get the refresh check delay for the given ScriptFactory BeanDefinition. If the BeanDefinition has a metadata attribute under the key REFRESH_CHECK_DELAY_ATTRIBUTE which is a valid Number type, then this value is used. Otherwise, the defaultRefreshCheckDelay value is used.
      参数:
      beanDefinition - the BeanDefinition to check
      返回:
      the refresh check delay
    • resolveProxyTargetClass

      protected boolean resolveProxyTargetClass(BeanDefinition beanDefinition)
    • createScriptFactoryBeanDefinition

      protected BeanDefinition createScriptFactoryBeanDefinition(BeanDefinition bd)
      Create a ScriptFactory bean definition based on the given script definition, extracting only the definition data that is relevant for the ScriptFactory (that is, only bean class and constructor arguments).
      参数:
      bd - the full script bean definition
      返回:
      the extracted ScriptFactory bean definition
      另请参阅:
    • getScriptSource

      protected ScriptSource getScriptSource(String beanName, String scriptSourceLocator)
      Obtain a ScriptSource for the given bean, lazily creating it if not cached already.
      参数:
      beanName - the name of the scripted bean
      scriptSourceLocator - the script source locator associated with the bean
      返回:
      the corresponding ScriptSource instance
      另请参阅:
    • convertToScriptSource

      protected ScriptSource convertToScriptSource(String beanName, String scriptSourceLocator, cn.taketoday.core.io.ResourceLoader resourceLoader)
      Convert the given script source locator to a ScriptSource instance.

      By default, supported locators are Framework resource locations (such as "file:C:/myScript.bsh" or "classpath:myPackage/myScript.bsh") and inline scripts ("inline:myScriptText...").

      参数:
      beanName - the name of the scripted bean
      scriptSourceLocator - the script source locator
      resourceLoader - the ResourceLoader to use (if necessary)
      返回:
      the ScriptSource instance
    • createConfigInterface

      protected Class<?> createConfigInterface(BeanDefinition bd, @Nullable Class<?>[] interfaces)
      Create a config interface for the given bean definition, defining setter methods for the defined property values as well as an init method and a destroy method (if defined).

      This implementation creates the interface via CGLIB's InterfaceMaker, determining the property types from the given interfaces (as far as possible).

      参数:
      bd - the bean definition (property values etc) to create a config interface for
      interfaces - the interfaces to check against (might define getters corresponding to the setters we're supposed to generate)
      返回:
      the config interface
      另请参阅:
      • InterfaceMaker
    • createCompositeInterface

      protected Class<?> createCompositeInterface(Class<?>[] interfaces)
      Create a composite interface Class for the given interfaces, implementing the given interfaces in one single Class.

      The default implementation builds a JDK proxy class for the given interfaces.

      参数:
      interfaces - the interfaces to merge
      返回:
      the merged interface as Class
      另请参阅:
    • createScriptedObjectBeanDefinition

      protected BeanDefinition createScriptedObjectBeanDefinition(BeanDefinition bd, String scriptFactoryBeanName, ScriptSource scriptSource, @Nullable Class<?>[] interfaces)
      Create a bean definition for the scripted object, based on the given script definition, extracting the definition data that is relevant for the scripted object (that is, everything but bean class and constructor arguments).
      参数:
      bd - the full script bean definition
      scriptFactoryBeanName - the name of the internal ScriptFactory bean
      scriptSource - the ScriptSource for the scripted bean
      interfaces - the interfaces that the scripted bean is supposed to implement
      返回:
      the extracted ScriptFactory bean definition
      另请参阅:
    • createRefreshableProxy

      protected Object createRefreshableProxy(TargetSource ts, @Nullable Class<?>[] interfaces, boolean proxyTargetClass)
      Create a refreshable proxy for the given AOP TargetSource.
      参数:
      ts - the refreshable TargetSource
      interfaces - the proxy interfaces (may be null to indicate proxying of all interfaces implemented by the target class)
      返回:
      the generated proxy
      另请参阅:
    • destroy

      public void destroy()
      Destroy the inner bean factory (used for scripts) on shutdown.
      指定者:
      destroy 在接口中 DisposableBean