Spring使用——给容器注册组件

配置类

/**

  • 给容器注册组件:
  • 1)包扫描+组件标注注解(@Controller,@Service,@Component,@Repository)[局限:自己写的]
  • 2)@Bean [导入的第三方包里面的组件]
  • 3)@Import[快速的给容器中导入组件]
  • 1)@Import(要导入到容器中的组件),容器中就会自动注册这个组件,id默认是全类名
  • 2)@ImportSelecor:返回需要导入的组件的全类名的数组
  • 3)ImportBeanDefinitionRegistrar:手动注册bean到容器中
  • 4)Spring提供的FactoryBean(工厂Bean)
  •  	1)默认获取的是工厂Bean调用getObejct()创建的对象
    
  •      2)要想获取工厂类型的Bean,我们需要再beanId前面添加一个&符号
    

*/

package com.ysy.config;

import com.ysy.bean.Color;
import com.ysy.bean.ColorFactoryBean;
import com.ysy.bean.Red;
import com.ysy.Person;
import com.ysy.condition.LinuxCondition;
import com.ysy.condition.MacCondition;
import com.ysy.condition.MyImportBeanDefinitionRegistrar;
import com.ysy.condition.MyImportSelector;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.*;

/**
 * @author shanyangyang
 * @date 2020/5/27
 */
@Configuration
//导入组件,id默认是全类名
@Import({Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {
	/**
	 * 默认是单例的
	 * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE
	 * @see ConfigurableBeanFactory#SCOPE_SINGLETON
	 * 单实例情况下,ioc容器启动会调用方法创建对象放到IOC容器中,以后每次调用从容器中(map.get)拿;
	 * request:同一个请求
	 * session:同一个session
	 *
	 * 懒加载:
	 * 		单实例bean,容器启动时,先不创建对象,第一次使用的时候再创建对象,并进行初始化
	*/
//	@Scope("prototype")
	@Lazy
	@Bean("person")
	public Person person(){
		System.out.println("给容器添加bean");
		return new Person("zhangsan",21);
	}

/**@Conditional
 * 按照一定条件进行判断,满足条件注册Bean
 *如果是windows系统则注册ali,否则注册百度;
 * 可以放在类上,表示condition为true时,配置类中所有bean一起生效
*/

@Conditional({MacCondition.class})
@Bean("ali")
public Person person01(){
	return new Person("alibaba",12);
}

@Conditional({LinuxCondition.class})
	@Bean("baidui")
	public Person person02(){
		return new Person("baidu",24);
	}

/**
 * 给容器注册组件:
 * 1)包扫描+组件标注注解(@Controller,@Service,@Component,@Repository)[局限:自己写的]
 * 2)@Bean [导入的第三方包里面的组件]
 * 3)@Import[快速的给容器中导入组件]
 *    1)@Import(要导入到容器中的组件),容器中就会自动注册这个组件,id默认是全类名
 *    2)@ImportSelecor:返回需要导入的组件的全类名的数组
 *    3)ImportBeanDefinitionRegistrar:手动注册bean到容器中
 *    4)Spring提供的FactoryBean(工厂Bean)
 *    		1)默认获取的是工厂Bean调用getObejct()创建的对象
 *    	    2)要想获取工厂类型的Bean,我们需要再beanId前面添加一个&符号
*/

@Bean
	public ColorFactoryBean colorFactoryBean(){
	return new ColorFactoryBean();
}
}

其中的实体类

package com.ysy.bean;

/**
 * @author shanyangyang
 * @date 2020/5/29
 */
public class Color {
}

package com.ysy.condition;

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

/**
 * @author shanyangyang
 * @date 2020/5/29
 * 自定义逻辑,返回需要导入的组件
 */
public class
MyImportSelector implements ImportSelector {
	//返回值就是导入到容器中的组件全类名
	//AnnotationMetadata:当前标注@Import注解的类的所有注解信息
	//方法不要返回null
	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {

		return new String[]{"com.ysy.Bean.Blue","com.ysy.Bean.Yellow"};
	}
}
package com.ysy.condition;

import com.ysy.bean.RainBow;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @author shanyangyang
 * @date 2020/5/29
 */
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
	/**
	 *AnnotationMetadata:当前类的注解信息
	 * BeanDefinitionRegistry:BeanDefinition注册类
	 * 		把所有需要添加到容器中的bean,调用BeanDefinitionRegistry.registerBeanDefinition手工注册
	 * */
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,
			BeanNameGenerator importBeanNameGenerator) {

		boolean definition = registry.containsBeanDefinition("com.ysy.Bean.Red");
		boolean definition1 = registry.containsBeanDefinition("com.ysy.Bean.Blue");
		if(definition && definition1){
			//指定Bean定义信息,(bean的类型等等)
			RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
			//注册一个Bean,指定Bean名字
			registry.registerBeanDefinition("rainBowl",rootBeanDefinition);
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章