BeanDefinition技巧-1

结论:

AbstractBeanDefinition.AUTOWIRE_BY_TYPE :设置当前bd的属性注入方式为set***方法按类型注入;

话不多说直接刚代码

定义一个bdRegistry后置处理器 测试 具体bean的set**方法拉起

public class MyObject4 implements InitializingBean {
    private SqlSessionTemplate sqlSessionTemplate;
    private MyObject2 myObject2;
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        // 如果IOC中存在 SqlSessionFactory 类型bean,则当前set方法就会被拉起
        sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
    }
    public void setMyObject2(MyObject2 myObject2) {
        // 如果IOC中存在 MyObject2  类型bean,则当前set方法就会被拉起
        this.myObject2 = myObject2; // 
    }
    public void setService(MyService1 myService) {
        // 如果IOC中存在 MyService1 类型bean,则当前set方法就会被拉起
        System.out.println(myService);
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println(sqlSessionTemplate);
    }
}

// BeanDefinitionRegistry 后置处理器,用于拓展 bd
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        RootBeanDefinition db2 = new RootBeanDefinition(MyObject4.class);
        db2.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
        registry.registerBeanDefinition("myObject4", db2);
    }
// ...
}

再强调一次:按类型,寻址IOC中对应类型的bean,拉起调用set**** 对应方法。

你可能感兴趣的:(BeanDefinition技巧-1)