Spring跨年最重要的就是IOC和AOP,IOC的意思就是控制反转,不用用户自己去new对象,而是去交给容器处理,也就是context,他实际就是一个HashMap,他是存储的是实例的名称和实例
大致为HashMap<String,Object> 对象创建默认是单例模式,在容器加载的时候创建,将这个对象放入Spring容器中,他的穿件方式是根据类名进行反射创建,根据条件有动态反射和Cglib反射
那么现在来学习一下怎么给容器注册组件
给容器注册组件的方式
1.@Bean 注解
使用方式:
@Bean("person")
public Person getPerson(){
return new Person(1,"zhangsan",20);
}
将Person组件命名为person,通过此方法将该实例添加入Spring容器
2.包扫描+组件的标注注解(@ComponentScan: @Controller,@Service,@Repponsitory,@Compont)
3.使用@Import:和@Bean类似
a.@Import(要导入到容器中的组件):容器会自动注册这个组件,bean的id\为全类名
@Configurable
@Import(value = {Dog.class})
public class Config1 {}
加@Import注解后会将Dog这个组件加入到容器中
b.ImportSelector:是一个接口,返回需要导入到容器的组件全类名
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.zh.case1.bean.Dog"};
}
}
@Configurable
@Import(value = {ZhImportSelector.class})
public class Config1{}
实现此接口也会将Dog组件加入到容器
c.ImportBeanDefinitonRegistrar:
public class ZhImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* AnnotationMetadata:当前类的注解信息
* BeanDefinitionRegistry:BeanDefinition注册类
* @param importingClassMetadata
* @param registry
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
registry.registerBeanDefinition("dog",new RootBeanDefinition(Dog.class));
}
}
@Configurable
@Import(value = {ZhImportBeanDefinitionRegistrar.class})
public class Config1{}
4.使用FactoryBean<>接口
public class MyFactoryBean implements FactoryBean<Pig> {
@Override
public Pig getObject() throws Exception {
return new Pig();
}
@Override
public Class<?> getObjectType() {
return Pig.class;
}
//设置是否为单例bean
@Override
public boolean isSingleton() {
return true;
}
}
他只有调用getObject方法才会加载这个组件,而不是再初始化的时候自动加载进去
以上就是往Spring容器中添加组件的四种方式