引言

最近在腾讯课堂上学习了spring框架bean的注册(注解形式),为此整理下知识点,方便过后温习,并巩固等。也希望能帮助你们。

核心配置类:

创建核心配置类,需要在类上加上注解@Configuration,配置类可以有多个,相当于spring的xml配置文件,我们想注册的bean都会通过配置类注册进spring的ioc容器,具体实现如下:

package com.jym.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.jym.bean.Person;

@Configuration
public class JymConfig {
	
}
第一种方式注册bean:

使用@bean注解: @bean注解是最简单的一种注册方式,具体实现方式:
实体类preson:

public class Person {
	
	private String name;
	
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public Person() {
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}	

}

配置类 注意:这里的beanid 默认为方法名!!!

@Configuration
public class JymConfig {

	@Bean
	public Person person(){
		return new Person("jym",20);
	}
	
}

测试类:

//获得spring的上下文工具
    ApplicationContext app = new AnnotationConfigApplicationContext(JymConfig.class);
    //获取bean
	Person person = (Person) app.getBean("person");
	System.out.println(person);

优点:简单明了
缺点:当有很多bean需要注册的时候 代码过多

第二种方式注册bean:

使用扫描包注解@ComponentScan 有个属性value 后面写上需要扫描的包名,在spring容器初始化的时候,就会把包下类上加 @Componen, @Repository ,@Service ,@Controller的类都注册进ioc容器中
这是最常用的一种注册bean的方式

@Configuration
@ComponentScan(value="com.jym.interfaceBean")
public class JymConfig {

	@Bean
	public Person person(){
		return new Person("jym",20);
	}
	
}
第三种方式注册bean:

@Import注解 注册的一个或多个bean。
具体实现:
配置类:

@Configuration
@Import(value = { Dog.class,Monkey.class})
//@ComponentScan(value="com.jym.interfaceBean")
public class JymConfig {

	@Bean
	public Person person(){
		return new Person("jym",20);
	}
	
}

测试类代码:

ApplicationContext app = new   AnnotationConfigApplicationContext(JymConfig.class);
    //获得ioc容器的所有bean id
	String[] str = app.getBeanDefinitionNames();
	for (int i = 0; i < str.length; i++) {
		System.out.println(str[i]);
	}

结果:

Spring 注册表 spring注册bean_ide


根据测试结果能看出 需要创建的bean已经在ioc容器中

通过这种方式注册的bean ,ID为类的包名.类名

第四种方式注册bean:

实现 ImportSelector接口
具体实现方式:

  1. 先创建实现类,并重写方法
package com.jym.interfaceBean;

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

public class JymImportSelector implements ImportSelector{

	@Override
	public String[] selectImports(AnnotationMetadata arg0) {
		return new String[]{"com.jym.bean.Cat"};
	}

}

2.将实现类配置到配置类中:

@Configuration
@Import(value = { Dog.class,Monkey.class,JymImportSelector.class})
//@ComponentScan(value="com.jym.interfaceBean")
public class JymConfig {

	@Bean
	public Person person(){
		return new Person("jym",20);
	}
	
}

测试代码跟上面的一样

结果为:

Spring 注册表 spring注册bean_Monkey_02


这种方式也可以配置多个bean

第五种方式注册bean:

使用场景 当ioc容易存在某一个bean的时候 就注册另一个bean
实现ImportBeanDefinitionRegistrar接口注册
具体实现(与ImportSelector步骤相同):

package com.jym.interfaceBean;

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 org.springframework.stereotype.Component;

import com.jym.bean.Monkey;
@Component
public class JymBeanDefinitionRegistry implements ImportBeanDefinitionRegistrar{

	/**
	 * AnnotationMetadata 当前注册类的注解信息
	 * BeanDefinitionRegistry  BeanDefinition注册类
	 */
	@Override
	public void registerBeanDefinitions(AnnotationMetadata arg0, BeanDefinitionRegistry arg1) {
		boolean bean1 = arg1.containsBeanDefinition("com.jym.bean.Cat");
		boolean bean2 = arg1.containsBeanDefinition("com.jym.bean.Dog");
		//如果同时存在cat dog 类  就注册monkey
		if(bean1&&bean2){
			RootBeanDefinition beanDefinition = new RootBeanDefinition(Monkey.class);
			arg1.registerBeanDefinition("monkey", beanDefinition);
		}
	}
	
}

配置类:

package com.jym.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

import com.jym.bean.Dog;
import com.jym.bean.Monkey;
import com.jym.bean.Person;
import com.jym.interfaceBean.JymImportSelector;

@Configuration
@Import(value = { Dog.class,Monkey.class,JymImportSelector.class})
@ComponentScan(value="com.jym.interfaceBean")
public class JymConfig {

	@Bean
	public Person person(){
		return new Person("jym",20);
	}
	
}

结果:

Spring 注册表 spring注册bean_spring_03


根据结果可见 我们的Monkey也在IOC容器中