spring组件注册
一、@Bean
默认为单实例,给容器中注册一个bean,类型为返回值的类型,id默认是方法名作为id
单实例bean:默认在容器启动时创建对象
1、 @Lazy:针对单实例bean,容器启动不创建对象,第一次获取bean创建对象,并进行初始化。
@Configuration public class MainConfig { //给容器中注意一个bean,类型为返回值的类型,id默认是方法名作为id @Bean @Lazy public Person person() { return new Person("jack", 12); } }
2、@Scope
prototype:多实例,IOC容器启动不会调用方法创建对象放在容器中,每次获取的时候才会调用方法创建对象。
singleton:单实例, IOC容器启动会调用方法创建对象到IOC容器中,以后每次获取值都是直接从容器中拿。
request:同一次请求创建一个实例
session:同一次session创建一个实例
@Configuration //告诉Spring这是一个配置类 public class MainConfig { //给容器中注册一个bean,类型为返回值的类型,id默认是方法名作为id @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public Person person() { return new Person("jack", 12); } }
3、@Conditional
按照一定的条件进行判断,满足条件给容器中注册bean
@Configuration public class MainConfig { //如果是mac系统,给容器中注册@Bean("mac") @Conditional({MacCondition.class}) @Bean("mac") public Person person01() { return new Person("Mac OS X", 62); } } public class MacCondition implements Condition { public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { //3.获取当前环境信息 Environment environment = context.getEnvironment(); String property = environment.getProperty("os.name"); if (property.contains("Mac")) { return true; } return false; } }
二、@ComponentScan
包扫描+组件标注注解 @Controller/@Service/@Repository/@Component
value:指定要扫描的包 excludeFilters =Filter[] :指定扫描的时候按照什么规则排除那些组件 includeFilters = Filter[] :指定扫描的时候只需要包含哪些组件 FilterType.ANNOTATION:按照注解 FilterType.ASSIGNABLE_TYPE:按照给定的类型; FilterType.ASPECTJ:使用ASPECTJ表达式 FilterType.REGEX:使用正则指定 FilterType.CUSTOM:使用自定义规则
样例:
@ComponentScan(value = "com.cn", includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class}), @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes ={BookService.class}), @ComponentScan.Filter(type = FilterType.CUSTOM,classes = MyTypeFilter.class) }, useDefaultFilters = false) @Configuration //告诉Spring这是一个配置类 public class MainConfig { } public class MyTypeFilter implements TypeFilter { /** * metadataReader 读取到当前正在扫描的信息 * metadataReaderFactory 可以获取到其他任何类的信息 */ public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { //获取当前注解类的信息 AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); //获取当前正在扫描的类的信息 ClassMetadata classMetadata = metadataReader.getClassMetadata(); //获取当前类资源 Resource resource = metadataReader.getResource(); String className = classMetadata.getClassName(); System.out.println("-->" + className); if(className.contains("er")){ return true; } return false; } }
三、@Import
@Import(Color.class)导入组件,id默认是组件的全类名
ImportSelector(接口):返回需要导入的组件的全类名数组
ImportBeanDefinitionRegistrar:手动注册bean到容器中
@Configuration @Import({Color.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class}) //导入组件,id默认是组件的全类名 public class MainConfig2 { } public class Color { } //自定义逻辑返回需要导入的组件 public class MyImportSelector implements ImportSelector { //AnnotationMetadata 当前标注@Import注解的类的所有注解信息 public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.cn.bean.Blue", "com.cn.bean.Yellow"}; } } public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { /** * AnnotationMetadata * BeanDefinitionRegistry */ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { boolean definition = registry.containsBeanDefinition("com.cn.bean.Yellow"); boolean definition2 = registry.containsBeanDefinition("com.cn.bean.Blue"); if (definition && definition2) { //指定 RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class); registry.registerBeanDefinition("rainBow", rootBeanDefinition); } } }
四、FactoryBean
工厂bean获取的是调用getObject创建的对象
@Configuration public class MainConfig{ @Bean public ColorFactoryBean colorFactoryBean(){ return new ColorFactoryBean(); } } public class ColorFactoryBean implements FactoryBean<Color>{ //返回一个color对象,这个对象会添加到容器中 public Color getObject() throws Exception { return new Color(); } public Class<?> getObjectType() { return Color.class; } /** * true,bean是单实例,在容器中保存一份 * false 多实例,每次获取都会创建一个新的bean */ public boolean isSingleton() { return false; } }
基本翻译
n. 豆;嘴峰;毫无价值的东西
n. (Bean)人名;(英)比恩
vt. 击…的头部