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测试方法,结果:
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测试方法,结果:
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测试方法,结果: