目录
一.@Bean直接导入单个类
二.@ComponentScan组件扫描
三.@import导入
四.把需要注入的对象封装为FactoryBean
一.@Bean直接导入单个类
//默认是方法名
//指定value 则以value为准
@Bean("stu")
public Student stu() {
return new Student("ws",100);
}
test
@Test
public void Test1() {
ApplicationContext app = new AnnotationConfigApplicationContext(MyConfigura.class);
Object bean = app.getBean("stu");
System.out.println(bean);
}
二.@ComponentScan组件扫描
@ComponentScan 默认扫描(@Controller.@Service、@Repostory、@Component)
@Component
@Data
public class Pig {
}
test:
@Test
public void Test2() {
ApplicationContext app = new AnnotationConfigApplicationContext(MyConf.class);
System.out.println(app.getBean("pig"));
}
三.@import导入
1.import直接参数导入
@Configuration
@import({Cat.class})
public class MyConfigura {
}
test:
@Test
public void Test1() {
ApplicationContext app = new AnnotationConfigApplicationContext(MyConfigura.class);
Object bean = app.getBean("com.ws.project.entity.Cat");
//import直接导入加的bean是全类名
System.out.println(bean);
}
2.importselector自定义规则实现
实现importSelector接口
public class MyimportSelector implements importSelector {
@Override
public String[] selectimports(Annotationmetadata annotationmetadata) {
//直接在
return new String[]{"com.ws.project.entity.Cat1",
"com.ws.project.entity.Cat2"};
}
}
@Configuration
//@import({Cat.class})
@import({MyimportSelector.class})
public class MyConfigura {
}
test
@Test
public void Test1() {
ApplicationContext app = new AnnotationConfigApplicationContext(MyConfigura.class);
Object bean1 = app.getBean("com.ws.project.entity.Cat1");
Object bean = app.getBean("com.ws.project.entity.Cat2");
System.out.println(bean1 + "n" +bean);
}
3.实现importBeanDefinitionRegistrar
获得BeanDefinitionRegistry可以手动直接往Ioc容器中塞
public class MyimportBeanDefinitionRegistrar implements importBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(Annotationmetadata importingClassmetadata, BeanDefinitionRegistry registry) {
//可以加入一些逻辑
//比如 当容器中存在Cat1 和 Cat2 我才可以创建 Cat3
boolean cat1 = registry.containsBeanDefinition("com.ws.project.entity.Cat1");
boolean cat2 = registry.containsBeanDefinition("com.ws.project.entity.Cat2");
if (cat1 & cat2) {
//创建beanDefinition
BeanDefinition beanDefinition = new RootBeanDefinition(Cat3.class);
//放到容器中
registry.registerBeanDefinition("cat3",beanDefinition);
}
}
}
@Configuration
//@import({Cat.class})
@import({MyimportSelector.class,MyimportBeanDefinitionRegistrar.class})
public class MyConfigura {
}
Test
@Test
public void Test1() {
ApplicationContext app = new AnnotationConfigApplicationContext(MyConfigura.class);
Object bean = app.getBean("cat3");
System.out.println(bean);
}
四.把需要注入的对象封装为FactoryBean
继承FactoryBean
public class MyFactoryBean implements FactoryBean{ @Override public Dog getObject() throws Exception { return new Dog(); } @Override public Class> getObjectType() { return Dog.class; } @Override public boolean isSingleton() { //是否单例 return true; } }
把MyFactoryBean注册
@Configuration
public class MyConfigura {
@Bean
public MyFactoryBean factoryBean() {
return new MyFactoryBean();
}
}
Test: getBean(factoryBean) 会发现拿到的是Dog对象
@Test
public void Test1() {
ApplicationContext app = new AnnotationConfigApplicationContext(MyConfigura.class);
Object bean = app.getBean("factoryBean");
System.out.println(bean);
}



