- @Configuration
- public class MyConfiguration {
- @Bean
- public Person person() {
- Person person = new Person();
- person.setName("spring");
- return person;
- }
- }
- @Component
- public class Person {
- private String name;
-
- public String getName() {
-
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public String toString() {
- return "Person{" +
- "name='" + name + '\'' +
- '}';
- }
- }
-
- @ComponentScan(basePackages = "com.springboot.initbean.*")
- public class Demo1 {
- public static void main(String[] args) {
- AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);
- Person bean = applicationContext.getBean(Person.class);
- System.out.println(bean);
- }
- }
@import注解源码
- @Target(ElementType.TYPE)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface Import {
-
- /** * 用于导入一个class文件 * {@link Configuration @Configuration}, {@link ImportSelector}, * {@link ImportBeanDefinitionRegistrar}, or regular component classes to import. */
- Class<?>[] value();
-
- }
然后自动的就被放置在IOC容器中了。
- public class Person {
- private String name;
-
- public String getName() {
-
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Override
- public String toString() {
- return "Person{" +
- "name='" + name + '\'' +
- '}';
- }
- }
- /*** 直接使用@Import导入person类,然后尝试从applicationContext中取,成功拿到**/
- @Import(Person.class)
- public class Demo1 {
-
- public static void main(String[] args) {
- AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);
- Person bean = applicationContext.getBean(Person.class);
- System.out.println(bean);
- }
- }
- @Import(MyImportSelector.class)
- public class Demo1 {
- public static void main(String[] args) {
- AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);
- Person bean = applicationContext.getBean(Person.class);
- System.out.println(bean);
- }
- }
-
- class MyImportSelector implements ImportSelector {
- @Override
- public String[] selectImports(AnnotationMetadata importingClassMetadata) {
- return new String[]{"com.springboot.pojo.Person"};
- }
- }
bean的定义(bean的元数据),也是需要放在IOC容器中进行管理的,先有bean的元数据,
applicationContext再根据bean的元数据去创建Bean。
- @Import(MyImportBeanDefinitionRegistrar.class)
- public class Demo1 {
- public static void main(String[] args) {
- AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);
- Person bean = applicationContext.getBean(Person.class);
- System.out.println(bean);
- }
- }
-
- class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
-
- @Override
- public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
- // 构建一个beanDefinition, 关于beanDefinition我后续会介绍,可以简单理解为bean的定义.
- AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Person.class).getBeanDefinition();
- // 将beanDefinition注册到Ioc容器中.
- registry.registerBeanDefinition("person", beanDefinition);
- }
- }
DeferredImportSelector 它是 ImportSelector 的子接口,所以实现的方法和第二种无异。
只是Spring的处理方式不同,它和Spring Boot中的自动导入配置文件 延迟导入有关
- @Import(MyDeferredImportSelector.class)
- public class Demo1 {
- public static void main(String[] args) {
- AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);
- Person bean = applicationContext.getBean(Person.class);
- System.out.println(bean);
- }
- }
- class MyDeferredImportSelector implements DeferredImportSelector {
- @Override
- public String[] selectImports(AnnotationMetadata importingClassMetadata) {
- // 也是直接将Person的全限定名放进去
- return new String[]{Person.class.getName()};
- }
- }
FactoryBean, 后缀为bean,那么它其实就是一个bean,
BeanFactory,顾名思义 bean工厂,它是IOC容器的顶级接口
- @Configuration
- public class Demo1 {
- @Bean
- public PersonFactoryBean personFactoryBean() {
- return new PersonFactoryBean();
- }
-
- public static void main(String[] args) {
- AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);
- Person bean = applicationContext.getBean(Person.class);
- System.out.println(bean);
- }
- }
-
- class PersonFactoryBean implements FactoryBean<Person> {
-
- /** * 直接new出来Person进行返回. */
- @Override
- public Person getObject() throws Exception {
- return new Person();
- }
- /** * 指定返回bean的类型. */
- @Override
- public Class<?> getObjectType() {
- return Person.class;
- }
- }
等beanDefinition加载完毕之后,对beanDefinition进行后置处理,
可以在此进行调整IOC容器中的beanDefinition,从而干扰到后面进行初始化bean。
- public class Demo1 {
- public static void main(String[] args) {
- AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
- MyBeanDefinitionRegistryPostProcessor beanDefinitionRegistryPostProcessor = new MyBeanDefinitionRegistryPostProcessor();
- applicationContext.addBeanFactoryPostProcessor(beanDefinitionRegistryPostProcessor);
- applicationContext.refresh();
- Person bean = applicationContext.getBean(Person.class);
- System.out.println(bean);
- }
- }
-
- class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
-
- @Override
- public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
- AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Person.class).getBeanDefinition();
- registry.registerBeanDefinition("person", beanDefinition);
- }
- @Override
- public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
-
- }
- }