動的噴射スプリング動的登録豆春IOCたBeanFactoryランタイムと一緒にカスタム注釈

 

 

MyControllerカスタム注釈:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented 
公共@interface MyController { 
    文字列MUV()デフォルト""。
}

 

初期化がUserServcie注入しました:

@Service(値= "そのUserServiceの")
パブリッククラスUserServiceの{ 

    パブリック文字列doService(文字列CO'S){ 
        リターン( "春--- I ---注入行うサービス方法"); 
    } 
}

 

でカスタム注釈バッチ動的噴射MyController1,2によると:

@MyController 
パブリッククラスMyController1 { 
    パブリック文字列getRes(){ 
        リターン"(Iは動的に注入" + this.getClass()のgetName()+ ")"; 
    } 
}

 

ダイナミック注射しUserControllerで:

UserControllerで{クラス公開

    ; UserServiceのプライベートUserServiceの

//パブリックUserServiceのgetUserService(){ 
ことUserServiceのを返す; // 
//} 

    / ** 
     *これは必要である
     * @paramのUserServiceのは、
     * / 
    公共ボイドsetUserService(UserServiceのUserServiceの){ 
        this.userService =そのUserServiceの; 
    } 

    パブリック文字列toAction(文字列のコンテンツ){ 
        するSystem.out.println( "I UserControllerでtoAction方法が動的登録され、最初の注入方法userService.doServiceを呼び出す開始"); 
        文字列userService.doService RES =(コンテンツ)。
        myController1 myController1 =(myController1)SpringContextUtil.getBean( MyController1.class)。
        MyController2 myController2 =(MyController2)SpringContextUtil.getBean(MyController2.class)。
        )(+ myController2.getRes)(RES +コンテンツ+ myController1.getResを返します。
    } 

}

 

主な機能をspringboot:

@SpringBootApplication 
パブリッククラスDemoSpringbootApplication { 

	パブリック静的無効メイン(文字列[] args){ 
		のApplicationContextのApplicationContext = SpringApplication.run(DemoSpringbootApplication.class、引数)。
		SpringContextUtil.setApplicationContext(ApplicationContextの)。

		//将のApplicationContext转换为ConfigurableApplicationContext 
		ConfigurableApplicationContext configurableApplicationContext =(ConfigurableApplicationContext)SpringContextUtil.getApplicationContext(); 

		DefaultListableBeanFactory defaultListableBeanFactory =(DefaultListableBeanFactory)configurableApplicationContext.getBeanFactory(); 

		//通过BeanDefinitionBuilder创建豆定义
		BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserController.class)。
 
		//設定されたプロパティUserServiceの、[必要]は、豆に定義されている。この属性参照セッターを持っている:UserServiceの、ここUserServiceの春のコンテナが管理されていますが。
		BeanDefinitionBuilder.addPropertyReference( "UserServiceの" 、 "UserServiceの"); 

		//登録豆
		defaultListableBeanFactory.registerBeanDefinition( "UserControllerで"、beanDefinitionBuilder.getRawBeanDefinition()); 

		System.out.printlnは() "カスタム注釈MyControllerに応じて動的噴射を開始"; 
		セット<クラス<>>? ClassUtil.getClassesController = SET(); 
		のSystem.out.println( "合計" + set.size()+ "クラスはカスタム注釈を満たす"); 
		(Clでクラス<?>:SET)についての{ 
			BeanDefinitionBuilder beanDefinitionBuilderAno = BeanDefinitionBuilder。genericBeanDefinition(CL)。
			defaultListableBeanFactory.registerBeanDefinition(cl.getName()、beanDefinitionBuilderAno.getRawBeanDefinition())。 
			System.out.println( "成功した注入" + cl.getName());
		}

		UserControllerでUserControllerで=(UserControllerで)SpringContextUtil.getBean( "UserControllerで")。
		文字列RES = userController.toAction( "入参")。
		System.out.println(RES)。
	} 

}

 

 

パッケージ、クラススキャン、カスタム注釈、参照を横断:

すべてのクラス注釈付きメソッドのJavaパッケージトラバーサル

 

参考:

春IOCたBeanFactory実行時に動的登録豆

おすすめ

転載: www.cnblogs.com/silyvin/p/11570069.html
おすすめ