Spring注解驱动开发实战 | 第六篇:组件注册[email protected]的使用

给容器中注册组件的方式有很多种,

a. 如果是自己写的类就用@Controller,@Service,@Repository,@Component加上包扫描注册

b. 如果是引入的第三方组件,就可以用@Bean,@Import注册


  1 初步使用  


 在com.wsc.bean中创建Color类和Blue类

package com.wsc.bean;

public class Blue {

}
package com.wsc.bean;

public class Color {

}

在MainConfigIOC2.java中加上@Import注解

package com.wsc.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;

import com.wsc.bean.Blue;
import com.wsc.bean.Color;
import com.wsc.bean.Person;
import com.wsc.condition.LinuxCondition;
import com.wsc.condition.WindowsCondition;

@Configuration
@Import(value = { Color.class ,Blue.class})
public class MainConfigIOC2 {
	@Scope
	@Lazy
	@Bean("person")
	public Person person(){
		System.out.println("把Person添加到容器....");
		return new Person("赤脚医生", 18);
	}
	
	/**
	 * @Conditional({Condition}) : 
	 * 按照一定的条件进行判断,满足条件给容器中注册bean
	 * 
	 * 如果系统是windows,给容器中注册("bill")
	 * 如果是linux系统,给容器中注册("linus")
	 */
	@Conditional(WindowsCondition.class)
	@Bean("bill")
	public Person person01(){
		return new Person("Bill Gates",65);
	}
	
	@Conditional(LinuxCondition.class)
	@Bean("linus")
	public Person person02(){
		return new Person("linus", 58);
	}
	
}

在IOCTest.java中添加testImport测试方法

 /*@Import
		 * 
		 * 导进组件
	     */
	    @Test
		public void testImport(){
	    	AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigIOC2.class);
			printBeans(applicationContext);
			Blue bean = applicationContext.getBean(Blue.class);
			System.out.println(bean);
			
		
		}
		
		private void printBeans(AnnotationConfigApplicationContext applicationContext){
			String[] definitionNames = applicationContext.getBeanDefinitionNames();
			for (String name : definitionNames) {
				System.out.println(name);
			}
		}

运行testImport测试方法,结果:

Spring注解驱动开发实战 | 第六篇:组件注册[email protected]的使用

 

2 ImportSelector的使用

在com.wsc.bean中创建Red类和Yellow类

package com.wsc.bean;

public class Red {

}
package com.wsc.bean;

public class Yellow {

}

在com.wsc.conditon下创建MyImportSelector 实现ImportSelector接口,并重载selectImports方法

package com.wsc.condition;

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

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

	//返回值,就是到导入到容器中的组件全类名
	//AnnotationMetadata:当前标注@Import注解的类的所有注解信息

	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		//importingClassMetadata
		//方法不要返回null值
		return new String[]{"com.wsc.bean.Red","com.wsc.bean.Yellow"};
	}

}

 

在MainConfigIOC2.java中加上@Import注解属性MyImportSelector.class

package com.wsc.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;

import com.wsc.bean.Blue;
import com.wsc.bean.Color;
import com.wsc.bean.Person;
import com.wsc.condition.LinuxCondition;
import com.wsc.condition.MyImportSelector;
import com.wsc.condition.WindowsCondition;

@Configuration
@Import(value = { Color.class ,Blue.class,MyImportSelector.class})
public class MainConfigIOC2 {
	@Scope
	@Lazy
	@Bean("person")
	public Person person(){
		System.out.println("把Person添加到容器....");
		return new Person("赤脚医生", 18);
	}
	
	/**
	 * @Conditional({Condition}) : 
	 * 按照一定的条件进行判断,满足条件给容器中注册bean
	 * 
	 * 如果系统是windows,给容器中注册("bill")
	 * 如果是linux系统,给容器中注册("linus")
	 */
	@Conditional(WindowsCondition.class)
	@Bean("bill")
	public Person person01(){
		return new Person("Bill Gates",65);
	}
	
	@Conditional(LinuxCondition.class)
	@Bean("linus")
	public Person person02(){
		return new Person("linus", 58);
	}
	
}

在IOCTest.java中运行testImport测试方法,结果:

Spring注解驱动开发实战 | 第六篇:组件注册[email protected]的使用

 

3 ImportBeanDefinitionRegistrar的使用

在com.wsc.bean中创建RainBow类

package com.wsc.bean;

public class RainBow {

}

在com.wsc.condition中创建MyImportBeanDefinitionRegistrar类实现ImportBeanDefinitionRegistrar接口

package com.wsc.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.wsc.bean.RainBow;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

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

}

在MainConfigIOC2.java中加上@Import注解属性MyImportBeanDefinitionRegistrar.class

package com.wsc.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;

import com.wsc.bean.Blue;
import com.wsc.bean.Color;
import com.wsc.bean.Person;
import com.wsc.condition.LinuxCondition;
import com.wsc.condition.MyImportBeanDefinitionRegistrar;
import com.wsc.condition.MyImportSelector;
import com.wsc.condition.WindowsCondition;

@Configuration
@Import(value = { Color.class ,Blue.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class MainConfigIOC2 {
	@Scope
	@Lazy
	@Bean("person")
	public Person person(){
		System.out.println("把Person添加到容器....");
		return new Person("赤脚医生", 18);
	}
	
	/**
	 * @Conditional({Condition}) : 
	 * 按照一定的条件进行判断,满足条件给容器中注册bean
	 * 
	 * 如果系统是windows,给容器中注册("bill")
	 * 如果是linux系统,给容器中注册("linus")
	 */
	@Conditional(WindowsCondition.class)
	@Bean("bill")
	public Person person01(){
		return new Person("Bill Gates",65);
	}
	
	@Conditional(LinuxCondition.class)
	@Bean("linus")
	public Person person02(){
		return new Person("linus", 58);
	}
	
}

在IOCTest.java中运行testImport测试方法,结果:

Spring注解驱动开发实战 | 第六篇:组件注册[email protected]的使用