FactoryBean特殊的相当于有两个对象
@ComponentScan("com.springmybatis")
public class SpringMybaitApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(SpringMybaitApplication.class);
//获取BeanDefinition对象
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(TestFactoryBean.class);
applicationContext.registerBeanDefinition("user", beanDefinition);
applicationContext.refresh();
System.out.println(applicationContext.getBean("user"));
System.out.println(applicationContext.getBean("&user"));
// UserService userService = applicationContext.getBean("usrservice", UserService.class);
// userService.test();
}
}
不加&表示生产出来的Bean
加&表示FactoryBean本身
通过构造函数进行赋值来解决生产多个Mapper对象
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(TestFactoryBean.class);
beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(UserMapper.class);
registry.registerBeanDefinition("user", beanDefinition);
AbstractBeanDefinition beanDefinition1 = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition1.setBeanClass(TestFactoryBean.class);
beanDefinition1.getConstructorArgumentValues().addGenericArgumentValue(OrderMapper.class);
registry.registerBeanDefinition("user1", beanDefinition1);
AbstractBeanDefinition beanDefinition2 = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition2.setBeanClass(TestFactoryBean.class);
beanDefinition2.getConstructorArgumentValues().addGenericArgumentValue(MemberMapper.class);
registry.registerBeanDefinition("user2", beanDefinition2);
通过list数据结构解决写死的问题
List<Class> mapprlist=new ArrayList<>();
mapprlist.add(UserMapper.class);
mapprlist.add(OrderMapper.class);
mapprlist.add(MemberMapper.class);
for (Class mapper : mapprlist) {
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(TestFactoryBean.class);
beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(mapper);
registry.registerBeanDefinition("user", beanDefinition);
}
对于spring来说,不会将接口扫描到容器中,只会讲带有@Component注解的类扫描到容器中
Mybatis只关心接口
spring默认把一些接口给过滤掉,所以可以继承类改变函数来进行改变行为
继承ClassPathBeanDefintitionScanner方法进行路劲扫描
mybatis通过sqlSessFactory生成接口代理对象
spring里面的set注入
使用的Mappper是怎么注入的,出现空值怎么解决
路径不能写死,可以通过spring注解进行配置
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(BeanDefinitionRegister.class)
public @interface TestScan {
String value();
}
Map<String, Object> annotationAttributes = importingClassMetadata.getAnnotationAttributes(String.valueOf(TestScan.class));
String path = (String)annotationAttributes.get("value");
TestMapperScanner scanner = new TestMapperScanner(registry);
scanner.addIncludeFilter(new TypeFilter() {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
return true;
}
});
int scan = scanner.scan(path);
System.out.println(scan);