目录
一 后处理机制实现方式
代码
package com.qing.config;
import com.qing.sevice.impl.BookServiceImpl2;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
public class MyPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
//注册一个bean
BeanDefinition beanDefinition= BeanDefinitionBuilder.
rootBeanDefinition(BookServiceImpl2.class).
getBeanDefinition();
//beanDefinition可以设置单例啥的
registry.registerBeanDefinition("bookService",beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
}
import
package com.qing.config;
import org.springframework.context.annotation.Import;
@Import({MyPostProcessor.class})
public class SpringConfig8 {
}
测试
package com.qing.app;
import com.qing.config.SpringConfig8;
import com.qing.sevice.BookService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App8 {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig8.class);
BookService bookService= ctx.getBean("bookService", BookService.class);
bookService.check();
}
}
结果
扫描二维码关注公众号,回复:
14366640 查看本文章
二 import导入加载顺序比较
MyDefinitionRegistrar加载BookServiceImpl1
package com.qing.config;
import com.qing.sevice.impl.BookServiceImpl1;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
public class MyDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
//metadata 元数据的用法同动态加载bean
BeanDefinition beanDefinition= BeanDefinitionBuilder.
rootBeanDefinition(BookServiceImpl1.class).
getBeanDefinition();
//beanDefinition可以设置单例啥的
registry.registerBeanDefinition("bookService",beanDefinition);
}
}
后处理机制MyPostProcessor加载BookServiceImpl2
package com.qing.config;
import com.qing.sevice.impl.BookServiceImpl2;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
public class MyPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
//注册一个bean
BeanDefinition beanDefinition= BeanDefinitionBuilder.
rootBeanDefinition(BookServiceImpl2.class).
getBeanDefinition();
//beanDefinition可以设置单例啥的
registry.registerBeanDefinition("bookService",beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
}
ImportSelector加载BookServiceImpl3
package com.qing.config;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata metadata) {
return new String[]{"com.qing.sevice.impl.bookServiceImpl3"};
}
}
package com.qing.sevice.impl;
import com.qing.sevice.BookService;
import org.springframework.stereotype.Service;
@Service("bookService")
public class BookServiceImpl3 implements BookService {
@Override
public void check() {
System.out.println("book service 3..");
}
}
import
package com.qing.config;
import org.springframework.context.annotation.Import;
@Import({MyImportSelector.class,MyPostProcessor.class,MyDefinitionRegistrar.class,})
public class SpringConfig8 {
}
测试
package com.qing.app;
import com.qing.config.SpringConfig8;
import com.qing.sevice.BookService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App8 {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig8.class);
BookService bookService= ctx.getBean("bookService", BookService.class);
bookService.check();
}
}
因为bean的名字都是bookService,所以会覆盖,猜猜最后会是哪一个实现类?
会是写在最后面MyDefinitionRegistrar加载的BookServiceImpl1 吗?
运行结果显示的是后处理机制MyPostProcessor加载的BookServiceImpl2
结论:import导入,后处理机制优先级最高,在其他都处理完之后,再加载.
三 后处理机制和register的加载顺序比较
前面的代码不变,就测试类加了registerBean
结论:因为就近,register比后处理机制的优先级还高!
总结