前回の記事では、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に渡すこともできます