给容器中注册组件:
1)包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)
2)@Bean[导入的第三方包里面的组件]
3)@Import[快速给容器中导入一个组件]
① @Import(要导入到容器中的组件):容器中就会自动注册这个组件,id默认是全类名
②ImportSelector:返回需要导入的组件的全类名数组
③ImportBeanDefinitionRegistrar:手动注册bean到容器中
4)使用Spring提供的FactoryBean(工厂Bean);
①默认获取到的是工厂bean调用getObejct()方法创建的对象
②要获取工厂Bean本身,我们需要给bean的id前面添加一个“&”,例如“colorFactoryBean”和“&colorFactoryBean”
@Import的参数是一个类类型的数组
示例代码:
package com.debuggg.test1.main3;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({Color.class})
public class MainConfig2 {
使用ImportSelector的实现类的方式批量导入
1) ImportSelector是一个接口
2) ImportSelector的实现类需要返回一个全类名的数组,该数组即为加载bean的全类名
示例代码:
MyImportSelector
package com.debuggg.test1.main3;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.debuggg.test1.main3.Pink","com.debuggg.test1.main3.Blue"};
}
}
@Import处的代码
package com.debuggg.test1.main3;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({Color.class,MyImportSelector.class})
public class MainConfig2 {
使用ImportBeanDefinitionRegistrar进行手工注册
该类是一个接口类,需要实现默认方法
default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
}
//AnnotationMetadata: 当前类的注解信息
//BeanDefinitionRegistry : BeanDefinition(注册类)
// 把所有需要添加到容器的Bean:调用
// BeanDefinitionRegistry.registerBeanDefinition()手工注册
示例代码:
package com.debuggg.test1.main3;
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;
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* 作者 ZYL
* 功能描述 : AnnotationMetadata: 当前类的注解信息
* BeanDefinitionRegistry : BeanDefinition(注册类)
* 把所有需要添加到容器的Bean:调用
* BeanDefinitionRegistry.registerBeanDefinition()手工注册
* 日期 2020-04-13 21:40
* 参数 importingClassMetadata
* 参数 registry
* 返回值 void
*/
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//这里可以调用判断某个bean是否存在来进行注册
boolean blue = registry.containsBeanDefinition("com.debuggg.test1.main3.Blue");
if(blue){
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Yellow.class);
registry.registerBeanDefinition("yellow",rootBeanDefinition);
}
}
}
配置类的示例代码:
package com.debuggg.test1.main3;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({Color.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {
使用FactoryBean的方式创建bean
Spring提供的FactoryBean是一个接口,里面提供了3个主要的方法
①getObject() 返回的就是创建的bean
②getObjectType() 返回值的类类型
③isSingleton() 确认该bean是单例还是不是单例,如果不是,则每次调用就生成一个bean
继承方法ColorFactoryBean的代码:
package com.debuggg.test1.main3;
import org.springframework.beans.factory.FactoryBean;
public class ColorFactoryBean implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new Color();
}
@Override
public Class<?> getObjectType() {
return Color.class;
}
public boolean isSingleton() {
return true;
}
}
bean的生成:
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}
调用的话:bean的id是colorFactoryBean,获得的对象是Color的对象,如果想要获得ColorFactoryBean本身对象,则需要在id前面加一个 "&" ,例如:“&colorFactoryBean”
注意:本文归作者所有,未经作者允许,不得转载