Springを使用して適切なオブジェクトをオンデマンドで注入


依存注入はSpringの大きな特色であり、日常的な使用では、プロファイルや注釈、または単一の例、またはファクトリモードを直接使用し、springコンテナの初期化時に使用するすべてのオブジェクトを初期化しますが、自分のnewクラスだけでspringで属性を注入したい場合があります.以下のようにします.
class PersonDao{
@Value("${insertSql}")
val insertSql:String = _
def save(){..}
....
}
 
class Person extends PersonDao{
...
}
 
目標はnew Person時に@Valueのような自動注入属性をロードできるようにすることであり、実装戦略は以下の通りであり、BeanAwareFactoryを実現するために単一のクラスを設計し、Springのファクトリクラスだけを考え、beanとしてspringロードを行うことである.単例モードであるため、他のクラスもこのファクトリオブジェクトを取得することができる.に対する境界温度ノードが作成できません.
 

  
  
  
  
  1. package org.jsi.di.spring; 
  2.  
  3. import org.apache.commons.logging.Log; 
  4. import org.apache.commons.logging.LogFactory; 
  5. import org.springframework.beans.BeansException; 
  6. import org.springframework.beans.factory.BeanFactory; 
  7. import org.springframework.beans.factory.BeanFactoryAware; 
  8. import org.springframework.beans.factory.config.AutowireCapableBeanFactory; 
  9.  
  10.  
  11. public class RichDomainObjectFactory implements BeanFactoryAware { 
  12.  
  13.     private static final Log LOG = LogFactory.getLog(RichDomainObjectFactory.class); 
  14.  
  15.     private AutowireCapableBeanFactory factory = null
  16.  
  17.     public <T> T createAndAutowire(Class<T> clazz) { 
  18.         T instance = null
  19.         try { 
  20.             instance = clazz.newInstance(); 
  21.             autowire(instance); 
  22.         } catch (InstantiationException e) { 
  23.             throw new RuntimeException(e); 
  24.         } catch (IllegalAccessException e) { 
  25.             throw new RuntimeException(e); 
  26.         } 
  27.         return instance; 
  28.     } 
  29.  
  30.     public void autowire(Object instance) { 
  31.         if (factory != null) { 
  32.             factory.autowireBeanProperties(instance, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false); 
  33.         } else { 
  34.             LOG.warn("No " + AutowireCapableBeanFactory.class.getName() + " has been defined. Autoworing will not work."); 
  35.         } 
  36.     } 
  37.  
  38.     public void setBeanFactory(BeanFactory factory) throws BeansException { 
  39.         this.factory = (AutowireCapableBeanFactory) factory; 
  40.     } 
  41.  
  42.     private static RichDomainObjectFactory singleton = new RichDomainObjectFactory(); 
  43.  
  44.     public static RichDomainObjectFactory autoWireFactory() { 
  45.         return singleton; 
  46.     } 
  47.  
  48.     public static void setInstance(RichDomainObjectFactory richDomainObjectFactory) { 
  49.         singleton = richDomainObjectFactory; 
  50.     } 
  51.  

以上、springのプロファイルに次のように書き込みます.

これでPersonのObjectを実現します
Object Person{
def apply(name:String) = RichDomainObjectFactory.autoWireFactory().autowire(new Person(name))
}
後のnewのPersonクラスの場合は、Person("alfred")を直接呼び出せばよいので、生成されたPersonクラスにはinsertSqlなどが注入されている