给容器中注册组件:
1、 包扫描+组件标注注解(@Contorller @Service @Repository @Component)
2、 @Bean[导入第三方包里面的组件]
3、 @Import[快速给容器中导入一个组件]
4、 @ImportSelector:返回需要导入的组件的全类名
5、 @ImportBeanDefinitRegistrar:通过调用beanDefinitionRegistry.registerBeanDefinition()方法
@Bean注解
Pom.xml加入context包
<dependency>
<dependency> |
创建一个javaBean
public class Persion { get set … |
创建一个配置类
@Configuration //告诉spring这是一个配置类
public class MainConfig {
@Bean("persion") //给容器中注册一个Bean,类型为返回值类型 ,用方法名作Id
public Persion persion(){
return new Persion("lisi","20","男");
}
} |
加载输出
public class Main {
public static void main(String[] args) {
//将配置类传入进来
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
Persion bean = applicationContext.getBean(Persion.class);
System.out.println(bean);
//获取persion的方法名
String[] namesForType = applicationContext.getBeanNamesForType(Persion.class);
for (String name:namesForType){
System.out.println(name);
}
}
} 输出结果:Persion{userName='lisi', age='20', sex='男'} persion |
@ComponentScan
@Configuration //告诉spring这是一个配置类 @Controller @Repository @Service public class IOCtest { 输出结果: mainConfig bookController bookDao bookService persion
//根据配置条件排除要扫描的包 输出结果: mainConfig bookController bookDao bookService persion //根据配置条件指定要扫描的包,useDefaultFilters = false清除默认设置 输出结果: mainConfig bookController bookService persion 注:@ComponentScans中可以配置多个扫描策略! |
根据自定义规则扫描
@Configuration //告诉spring这是一个配置类
|
自定义规则扫描配置类
//自定义规则扫描 输出结果: ======>com.jbit.test.IOCtest ======>com.jbit.config.MyTypeFilter ======>com.jbit.main.Main ======>com.jbit.pojo.Persion org.springframework.context.annotation.internalConfigurationAnnotationProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor org.springframework.context.annotation.internalRequiredAnnotationProcessor org.springframework.context.annotation.internalCommonAnnotationProcessor org.springframework.context.event.internalEventListenerProcessor org.springframework.context.event.internalEventListenerFactory mainConfig myTypeFilter bookController bookDao persion bookService |
@Scope
@Configuration //告诉spring这是一个配置类 @Configuration //告诉spring这是一个配置类 @Test 如果是单实例,ioc容器启动会调用方法创建对象放到ioc容器中,以后每次获取就是直接加从容器(map.get())中拿。 如果是多实例ioc容器并不会去调用方法创建对象放在容器中,每次获取方法的时候都会调用对象。 |
@Lazy (针对单实例)
懒加载:单实例bean,默认在容器启动的时候创建对象,懒加载,容器启动不创建对象,第一次使用(获取)Bean创建对象,并初始化。 @Configuration |
@Conditional
按照一定的条件进行判断,满足条件给容器中注册Bean
@Bean("bill")
输出结果: persion bill liues {persion=Persion{userName='zhansan', age='22', sex='男'}, bill=Persion{userName='Bill Gates', age='62', sex='男'}, liues=Persion{userName='liues', age='48', sex='男'}} 如果系统是windows容器中放入bill,如果是linux就给容器中放入linus //判断系统是否是linux //判断系统是否是windows @Conditional({WindowsCondition.class}) @Test 输出结果: Windows 10 persion bill {persion=Persion{userName='zhansan', age='22', sex='男'}, bill=Persion{userName='Bill Gates', age='62', sex='男'}} //判断容器中是否包某一个Bean,也可以给容器中注册一个Bean
如果将Conditional({WindowsCondition.class})放在类上,那么就味着,只要满足条件这个类中的Bean就会生效。 注:改变系统配置在Run Vm arguments下加入-Dos.name=linux
|
@Import
public class Color { public class Red {
} @Import({Color.class,Red.class})//@Import导入组件,id默认的是全类名
public class MainConfig2 {
@Lazy
@Bean("persion")
public Persion persion(){
return new Persion("zhansan","22","男");
}
@Conditional({WindowsCondition.class})
@Bean("bill")
public Persion persion01(){
return new Persion("Bill Gates","62","男");
} } @Test
public void testImport(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
printBean(applicationContext);
}
private void printBean(AnnotationConfigApplicationContext applicationContext){
String[] names = applicationContext.getBeanDefinitionNames();
for(String name:names){
System.out.println(name);
}
} 输出结果: mainConfig2 com.jbit.pojo.Color com.jbit.pojo.Red persion bill |
@ImportSelector
//定义一个Blue类 public class Blue {
} //自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector {
//返回值就是到导入到容器中的组件全类名
//annotationMetadata:当前标注@Import注解类的所有注解信息
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
//方法不能返回null,可以返回空数组
return new String[]{"com.jbit.pojo.Blue"};
}
} //将MyImportSelector类加到@Import中 @Import({Color.class,Red.class,MyImportSelector.class})//@Import导入组件,id默认的是全类名
public class MainConfig2 { } //测试 @Test
public void testImport() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
printBean(applicationContext);
Blue bean = applicationContext.getBean(Blue.class);
System.out.println(bean);
}
private void printBean(AnnotationConfigApplicationContext applicationContext) {
String[] names = applicationContext.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
} 输出结果: mainConfig2 com.jbit.pojo.Color com.jbit.pojo.Red com.jbit.pojo.Blue persion bill com.jbit.pojo.Blue@78047b92 |
//定义一个RainBow类 public class RainBow {
} //创建一个MyBeanDefinitionRegistrar类实现ImportBeanDefinitionRegistrar public class MyBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* @param annotationMetadata:当前类的注解信息
* @param beanDefinitionRegistry:beanDefinition注册类 把所有需要添加到容器中的bean,调用beanDefinitionRegistry.registerBeanDefinition手工注册进来
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
boolean definition = beanDefinitionRegistry.containsBeanDefinition("com.jbit.pojo.Red");
boolean definition1 = beanDefinitionRegistry.containsBeanDefinition("com.jbit.pojo.Blue");
//如果有条件为true,就注册一个RainBow的Bean到ioc容器中
if (definition && definition1) {
//指定一个bean名
RootBeanDefinition rootBean = new RootBeanDefinition(RainBow.class);
//注册一个Bean
beanDefinitionRegistry.registerBeanDefinition("rainBow",rootBean);
}
}
} //将MyBeanDefinitionRegistrar类放入到@Import中 @Import({Color.class,Red.class,
MyImportSelector.class,MyBeanDefinitionRegistrar.class})//@Import导入组件,id默认的是全类名
public class MainConfig2 { //测试 @Test
public void testImport() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
printBean(applicationContext);
Blue bean = applicationContext.getBean(Blue.class);
System.out.println(bean);
}
private void printBean(AnnotationConfigApplicationContext applicationContext) {
String[] names = applicationContext.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
} 输出结果: mainConfig2 com.jbit.pojo.Color com.jbit.pojo.Red com.jbit.pojo.Blue persion bill rainBow com.jbit.pojo.Blue@1460a8c0
|
使用FactoryBean注册Bean
public class Color { public class FactoryColor implements FactoryBean<Color> { @Bean @Test 输出结果: class com.jbit.pojo.Color ====================================== class com.jbit.config.FactoryColor |