Springコアポストプロセッサ-BeanDefinitionRegistryPostProcessor

前回の記事では、object-> beanを組み合わせるいくつかの方法が紹介されました

次に、ポストプロセッサも実装できます。コードを確認します。

public class User {

	public User(){
		System.out.println("init-user");
	};
}

@Component
public class TestBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
		RootBeanDefinition userBean = new RootBeanDefinition(User.class);
		//新增Bean定义
		registry.registerBeanDefinition("userBo", userBean);
	}

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		BeanDefinition beanDefinition = beanFactory.getBeanDefinition("userBo");
		beanDefinition.setScope("prototype");
		System.out.println("Scope:"+beanDefinition.getScope());
	}
}

この書き換え方法はpostProcessBeanFactoryによく知られており、以前のブログですでに証明されています。主に最初のものを見てください

postProcessBeanDefinitionRegistry(BeanDefinitionRegistryレジストリ)では、bdレジストラが渡されます。

RootBeanDefinitionはBeanDefinitionの品詞であり、SpringのすべてのBeanは、このオブジェクトを使用してオブジェクトをBeanにルート化します。

これで、bdレジストラができました。プロキシクラスをroot化できますか?

インターフェイスをBeanに変えた上記の別の投稿でテストを続けましょう

前の記事のブログを変更して、このインターフェースImportBeanDefinitionRegistrarをインターフェースBeanDefinitionRegistryPostProcessorに変更しましょう。 

コードをご覧ください

public class TestBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
		//扫描TestMapper这个接口
		BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(TestMapper.class);
		GenericBeanDefinition beanDefinition =(GenericBeanDefinition) builder.getBeanDefinition();
		beanDefinition.setBeanClass(TestFactoryBean.class);
		beanDefinition.getConstructorArgumentValues().addGenericArgumentValue("org.springframework.spring.mybatis.mapper.TestMapper");
beanDefinition.setScope("singleton");//定义作用域
		registry.registerBeanDefinition("testMapper",beanDefinition);
	}

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		BeanDefinition beanDefinition = beanFactory.getBeanDefinition("testMapper");
		System.out.println("setScope before:"+beanDefinition.getScope());//很尴尬这儿也是空的,因为是代理对象的原因吗?/需要先定义作用域,已解决
		beanDefinition.setScope("prototype");
		System.out.println("setScope after:"+beanDefinition.getScope());
	}
}

現在のインターフェースに置き換えられたカスタムアノテーション置換構成

@Retention(RetentionPolicy.RUNTIME)
//@Import(TestImportBeanDifinitionRegistrar.class)
@Import(TestBeanDefinitionRegistryPostProcessor.class)
public @interface TestScanMapper {
}

オープンアノテーションを構成クラス@TestScanMapperに追加します

テスト

public class MainDemo {
		public static void main(String[] args) {
			AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
			TestMapper bean =(TestMapper) ac.getBean("testMapper");
			System.out.println("TestMapper hashcode():"+bean.hashCode());//很尴尬是空的
		}

}

プログラムはとてもフレンドリーで、実行時にエラーは報告されません............

次に、インターフェースはbeanFactory内のBeanの元の注釈プロパティを変更できるだけでなく、オブジェクトをSpring Managementに渡し、プロキシオブジェクトをSpringManagementに渡すこともできます

おすすめ

転載: blog.csdn.net/qq_38108719/article/details/100593855