引言
最近在腾讯课堂上学习了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]);
}
结果:
根据测试结果能看出 需要创建的bean已经在ioc容器中
通过这种方式注册的bean ,ID为类的包名.类名
第四种方式注册bean:
实现 ImportSelector接口
具体实现方式:
- 先创建实现类,并重写方法
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);
}
}
测试代码跟上面的一样
结果为:
这种方式也可以配置多个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);
}
}
结果:
根据结果可见 我们的Monkey也在IOC容器中