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());
}
}