spring中定义Bean的方式

141 阅读1分钟

xml定义bean

在xml中注册一个bean

<bean id="realizeIoc" class="feng.ioc.control.RealizeIoc"/>

@component方式定义bean

可以配合@ComponentScan来配置扫描路径,当类上添加Component时,会把当前类当成一个Bean

@Component
public class Feng {
    public void method(){
        System.out.println("你调用了我");
    }
}

@Bean方式定义bean

这个注解主要用在方法上,声明当前方法体中包含了最终产生 bean 实例的逻辑,方法的返回值是一个 Bean。这个 bean 会被 Spring 加入到容器中进行管理,默认情况下 bean 的命名就是使用了 bean 注解的方法名。@Bean 一般和 @Component 或者 @Configuration 一起使用。

    @Bean
    public Feng feng(){
        return new Feng();
    }
}

BeanDefinition定义一个Bean

编程式的用法定义一个bean

    public static void main(String[] args) {
//        加载容器
       AnnotationConfigApplicationContext applicationContext= new AnnotationConfigApplicationContext();
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
//      定义bean的类型
        beanDefinition.setBeanClass(Feng.class);
//        添加bean到applicationCintext里面
        applicationContext.registerBeanDefinition("feng",beanDefinition);
//      refresh  用于刷新整个Spring 上下文信息,定义了整个 Spring 上下文加载的流程。
        applicationContext.refresh();
//        获取spring中的bean
       Feng feng = applicationContext.getBean("feng",Feng.class);
        System.out.println(feng);
    }
}

FactoryBean定义bean

实现FactoryBean接口间接的定义一个bean

@Component
public class Feng  implements FactoryBean {
    //返回所定义bean的对象
    @Override
    public Object getObject() throws Exception {
        Config config = new Config();
        return config;
    }
    //返回所定义bean的对象的类型
    @Override
    public Class<?> getObjectType() {
        return Config.class;
    }
}

通过supplier定义bean

    public static void main(String[] args) {
//        加载容器
       AnnotationConfigApplicationContext applicationContext= new AnnotationConfigApplicationContext();
        applicationContext.registerBean(Feng.class, new Supplier<Feng>() {
            @Override
            public Feng get() {
                Feng feng = new Feng();
                feng.setName("你好");
             return feng;
            }
        });
//      refresh  用于刷新整个Spring 上下文信息,定义了整个 Spring 上下文加载的流程。
        applicationContext.refresh();


       Feng feng = applicationContext.getBean("feng",Feng.class);
        System.out.println(feng.getName());

    }
}