p03基本注解
使用@Bean注解加入容器
@import注解把bean加入容器,但是属性name为null
@import与ImportSelector接口结合使用把bean加入容器
public class Blue {
}
public class Red {
}
/**
* 自定义实现
*/
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.atguigu.spring.bean.Blue"};
}
}
@Configuration
//@Import(Person.class)
//注册red,注册接口实现类,从而注册blue
@Import({Red.class, MyImportSelector.class})
public class MainConfig {
// @Bean
// public Person person(){
// Person person = new Person();
// person.setName("李四");
// return person;
// }
}
public class AnnotationMainTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
Red red = annotationConfigApplicationContext.getBean(Red.class);
Blue blue = annotationConfigApplicationContext.getBean(Blue.class);
System.out.println(red);
System.out.println(blue);
}
}
结果:两个bean都加入了容器
使用@Import注解与ImportBeanDefinitionRegistrar接口实现类实现bean加入容器
打印容器中的bean名称
@ lookup场景
person scope使用单例,但是cat scope使用原型模式prototype
如果person中使用@autowire直接注入cat 的bean,多个person中 cat还是是同一个cat的bean(因为person是单例的,创建容器的时候,就已经创建好了person和cat),
要想注入不同的cat
1.去除@autowire注解
2.get方法上使用@loopup注解
@Lookup 表示去容器中找。但是注意:@Bean的这种方式注册的Person @Lookup不生效,使用包扫描的方式可以
p04 spring源码分析-spring框架整体流程
p05 spring源码-资源与资源加载器接口
Resource接口
ResourceLoader接口
p06 BeanFactory 中一个重要的档案馆
AnnotationConfigApplicationContext组合了档案馆
档案管的类关系
p07 什么时候BeanDefinition放入档案馆
DefaultListableBeanFactory实现了BeanDefinitionRegister bean定义注册器
p08读取bean信息
p09 spring源码分析-抛出了BeanPostProcessor
bean可以实现各种aware接口