Bean的声明方式
通过编码方式进行声明
继承CodeDefinitionLoderRegistry类,重写loadBean()方法
public class MyCodeBeanDefinition extends CodeDefinitionLoaderRegistry {
@Override
public void loadBean() {
this.register("BeanTest1", BeanTest1.class);
this.register("BeanTest2", BeanTest2.class);
}
}
然后编码使用register(bean的名称,bean所对应类)进行注册,和XML的声明方式是类似的。
通过注解@Bean的方式声明
@Bean
public class BeanTest1 implements BeanTest {
@Override
public void print() {
System.out.println("BeanTest1");
}
}
@Bean
public class BeanTest2 implements BeanTest {
@Override
public void print() {
System.out.println("BeanTest2");
}
}
获取Bean
从工厂中获取Bean
public static void foo() {
// 第一步:c根据声明的方式选择 1 or 2
// 方式一: 创建注册类,注册类中使用编码实现注册逻辑
AbstractDefinitionLoaderRegistry registry = new MyCodeBeanDefinition();
// 方式二: 创建注册类,Bean通过注解的方式自动注入
AbstractDefinitionLoaderRegistry registry = new AnnotationDefinitionLoaderRegistry();
// 第二步:注册类添加到工厂中
ApplicationContext factory = new ApplicationContext(registry);
// 第三步:获取Bean
BeanTest obj1 = factory.getBeanInstance("BeanTest1", BeanTest1.class);
BeanTest obj2 = factory.getBeanInstance("BeanTest2", BeanTest2.class);
obj1.print();
obj2.print();
}
通过注解自动注入Bean
使用@Autowired自动注入
@Bean
public class AutowiredTest {
@Autowired
public BeanTest1 beanTest1;
@Autowired
public BeanTest2 beanTest2;
public void print1() {
beanTest1.print();
}
public void print2() {
beanTest2.print();
}
}