自定义规则
public class MyTypeFilter implements TypeFilter { /** *MetadataReader:读取到的当前正在扫描的类的信息 *MetadataReaderFactory:可以获取到其他任何类信息 */ public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { //获取当前类注解的信息 AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); //获取当前正在扫描的类的信息 ClassMetadata classMetadata = metadataReader.getClassMetadata(); //获取当前类资源信息(类路径) Resource resource = metadataReader.getResource(); String className = classMetadata.getClassName(); System.out.println("-->"+className); if(className.contains("er")){ return true; } return false; } }[快速给容器中导入一个主键]
1、@Import(要导入容器的主键):容器就会自动注册这个组件,id默认是全类名
在配置类中
@Import({Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class}) //导入组件,id默认是全类名2、ImportSelector:返回需要导入组件的全类名
public class MyImportSelector implements ImportSelector { //放回值就是要导入到容器中的主键全类名 //AnnotationMetadata:当前标注@Import注解的类的所有信息 public String[] selectImports(AnnotationMetadata annotationMetadata) { //方法不能返回null值 return new String[]{"com.ljq.bean.Blue","com.ljq.bean.Yellow"}; } } 3、ImportBeanDefinitionRegistrar:手动注册bean到容器中 public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { /** * * @param annotationMetadata:当前类的注解信息 * @param beanDefinitionRegistry:BeanDefinition注册类: * 把所有需要添加到容器中的bean:调用 * BeanDefinitionRegistry.registerBeanDefinition手动注册 */ public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { boolean definition = beanDefinitionRegistry.containsBeanDefinition("com.ljq.bean.Red"); boolean definition1 = beanDefinitionRegistry.containsBeanDefinition("com.ljq.bean.Blue"); if (definition&&definition1){ //指定bean定义信息,(bean的类型,bean。。。) RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class); //注册一个bean,指定bean名 beanDefinitionRegistry.registerBeanDefinition("rainBow",beanDefinition); } } }需要在配置类中
@Bean public ColorFactoryBean colorFactoryBean(){ return new ColorFactoryBean(); }测试
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class); String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();//看到容器中所有的Bean Blue bean = applicationContext.getBean(Blue.class); System.out.println(bean); //工厂Bean获取的是调用getObject创建的对象 Object colorFactoryBean = applicationContext.getBean("colorFactoryBean"); Object colorFactoryBean1 = applicationContext.getBean("colorFactoryBean"); Object colorFactoryBean2 = applicationContext.getBean("&colorFactoryBean"); ColorFactoryBean colorFactoryBean3 = applicationContext.getBean(ColorFactoryBean.class); System.out.println(colorFactoryBean==colorFactoryBean1); System.out.println("bean类型"+colorFactoryBean.getClass()); System.out.println("bean类型2"+colorFactoryBean2.getClass()); System.out.println("bean类型3"+colorFactoryBean2.getClass()); false bean类型class com.ljq.bean.Color bean类型2class com.ljq.bean.ColorFactoryBean bean类型3class com.ljq.bean.ColorFactoryBean1、默认获取到的是工厂bean调用getObject创建的对象
2、要获取工厂bean本身需要给id前面加一个&
&colorFactoryBean
@PostConstruct :在bean创建完成并且属性赋值完成,执行初始化
@PreDestroy :在容器销毁之前通知我们进行清理工作
@Component public class Dog { public Dog(){ System.out.println("Dog constructor..."); } //对象创建并赋值之后调用 @PostConstruct public void init(){ System.out.println("Dog...PostConstruct...."); } //在容器移除之前调用 @PreDestroy public void detory(){ System.out.println("Dog ....PreDestroy"); } }在bean的初始化前后进行一些处理工作:
PostProcessorBeforeInitialization:在初始化之前工作
PostProcessorAfterInitialization: 在初始化之后
/** * 后置化处理器:初始化前后进行处理工作 * 将后置处理器加入容器中 */ @Component public class MyBeanPostProcessor implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { System.out.println("postProcessBeforeInitialization.."+s+"=>"+o); return o; } public Object postProcessAfterInitialization(Object o, String s) throws BeansException { System.out.println("postProcessAfterInitialization.."+s+"=>"+o); return o; } }