spring常用注解@Import

1.先来看下@Import的官方文档解释
在这里插入图片描述

解释下意思:
1.该类主要是为了将组件注册到容器中
2.注解里面value值可以有四种类型,通过引入这四种类型的数组,来注册进容器,分别为Configuration, ImportSelector, ImportBeanDefinitionRegistrar or regular component ,其中Configuration为引入有@Configuration注解的类,ImportSelector,ImportBeanDefinitionRegistrar 为对应接口的实现类,regular component就是普通的实体bean

1.Configuration

 通俗点理解就是可以通过此注解导入多个配置类,spring早期使用xml进行配置的时候,可以通过如下引入多个配置文件,这里就是这种用处,目前用得不多,就不赘述,反正不外乎注解里面加上有注解@Configuration的类
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xsi:schemaLocation="  
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
       ">  
        <import resource="classpath:META-INF/db.xml" />
		<import resource="classpath:META-INF/huatuo-db.xml" />
		<import resource="classpath:META-INF/db-mapper.xml" />
		<import resource="classpath:META-INF/huatuo-db-mapper.xml" />
		<import resource="classpath:META-INF/webservice.xml" />
		<import resource="classpath:META-INF/dubbo.xml" />
		<import resource="classpath:META-INF/spring/physicalExamService.xml" />
</beans> 

2.ImportSelector

先查看下该注解

在这里插入图片描述
目前此类就一个方法,方法的返回值为类名全路径的数组
举例:

package com.atguigu.condition;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector {

	//返回值,就是到导入到容器中的组件全类名
	//AnnotationMetadata:当前标注@Import注解的类的所有注解信息
	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		// TODO Auto-generated method stub
		//importingClassMetadata
		//方法不要返回null值
		return new String[]{"com.atguigu.bean.Blue","com.atguigu.bean.Yellow"};
	}

}

3.ImportBeanDefinitionRegistrar

先来看下此接口的注释信息
在这里插入图片描述
目前此接口只有一个方法,返回值为空,参数有该类的所有注解的信息,spring容器的注册器
实例:

package com.atguigu.condition;

import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

import com.atguigu.bean.RainBow;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

	/**
	 * AnnotationMetadata:当前类的注解信息
	 * BeanDefinitionRegistry:BeanDefinition注册类;
	 * 		把所有需要添加到容器中的bean;调用
	 * 		BeanDefinitionRegistry.registerBeanDefinition手工注册进来
	 */
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		
		boolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red");
		boolean definition2 = registry.containsBeanDefinition("com.atguigu.bean.Blue");
		if(definition && definition2){
			//指定Bean定义信息;(Bean的类型,Bean。。。)
			RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
			//注册一个Bean,指定bean名
			registry.registerBeanDefinition("rainBow", beanDefinition);
		}
	}

}

4.regular component

这个就是普通的bean类了
实例

package com.atguigu.bean;

public class Color {
	
	private Car car;

	public Car getCar() {
		return car;
	}

	public void setCar(Car car) {
		this.car = car;
	}

	@Override
	public String toString() {
		return "Color [car=" + car + "]";
	}
}

好了,现在可以试下,有没有注册进容器
配置类

@Configuration
@Import({Color.class,Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
//@Import导入组件,id默认是组件的全类名
public class MainConfig2 {
	
	
//	@Scope("prototype")
	@Lazy
	@Bean("person")
	public Person person(){
		System.out.println("给容器中添加Person....");
		return new Person("张三", 25);
	}
}

public class IOCTest {
	AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
	
	
	@Test
	public void testImport(){
		printBeans(applicationContext);
		Blue bean = applicationContext.getBean(Blue.class);
		System.out.println(bean);
		
		//工厂Bean获取的是调用getObject创建的对象
		Object bean2 = applicationContext.getBean("colorFactoryBean");
		Object bean3 = applicationContext.getBean("colorFactoryBean");
		System.out.println("bean的类型:"+bean2.getClass());
		System.out.println(bean2 == bean3);
		
		Object bean4 = applicationContext.getBean("&colorFactoryBean");
		System.out.println(bean4.getClass());
	}
	
	private void printBeans(AnnotationConfigApplicationContext applicationContext){
		String[] definitionNames = applicationContext.getBeanDefinitionNames();
		for (String name : definitionNames) {
			System.out.println(name);
		}
	}
}

都注册成功
在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页