注解@Congiration
三层组件:
扫描器+三层注解
非三层组件:
a.@Bean
b.@Import
c.FactoryBean(工厂Bean)
A、@Bean注解的使用:
在配置类中的方法上加上@Bean,此时该方法就是IOC容器中的对象;
B、@Import注解的使用:
方式一:
直接编写到@Import中, 并且id值 就是全类名;
如:
//在MyConfig中
@Import({Apple.class, Banana.class, Orange.class})
方式二:
自定义ImportSelector接口的实现类,通过selectimports方法实现
(自定义实现类的方法返回值 就是要纳入IOC容器的Bean的全类名)。
并且要告知MyConfig自己编写的实现类。@import(自定义是实现类名.class)
如:
//在ImportSelector接口的实现类【MyImportSelector】中
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[] {"org.neowang.entity.Apple",
"org.neowang.entity.Banana",
"org.neowang.entity.Orange"}; //返回值就是 要加入IOC容器的Bean的全类名
}
}
//在MyConfig中
@Import(MyImportSelector.class)
方式三:
编写ImportBeanDefinitionRegistrar接口的实现类,重写方法。
并且要告知MyConfig自己编写的实现类。@import(自定义是实现类名.class)
如:
//在ImportBeanDefinitionRegistrar接口的实现类【MyImportBeanDefinitionRegistrar】中
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
*
* @param annotationMetadata 注解原数据
* @param beanDefinitionRegistry Bean的注册信息
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
BeanDefinition beanDefinition = new RootBeanDefinition(Orange.class);
//或 BeanDefinition beanDefinition = new RootBeanDefinition("org.neowang.entity.Orange");
beanDefinitionRegistry.registerBeanDefinition("myorange",beanDefinition); //id , class
}
}
//在MyConfig中
@Import(MyImportBeanDefinitionRegistrar.class)
C、FactoryBean(工厂bean)
1.写实现类【如:MyFactoryBean】和重写其中的方法
如:
//MyFactoryBean类
public class MyFactoryBean implements FactoryBean {
//外部要从该容器中拿的对象
@Override
public Object getObject() throws Exception {
return new Apple();
}
//bean的类型
@Override
public Class<?> getObjectType() {
return Apple.class;
}
//要加的bean是不是单例模式
@Override
public boolean isSingleton() {
return true;
}
}
2.注册到@Bean中
如:
//MyConfig中
@Bean
public FactoryBean<Apple> myFactoryBean(){
return new MyFactoryBean();
}
注意:获取对象时要通过 '&' 区分 要获取的对象时哪一个:
不加'&',获取的时FactoryBean工厂类中的实例对象;
如:上述的Apple类对象
加 '&',获取的是 FactoryBean工厂类对象;
如:上述的FactoryBean类对象myFactoryBean;