Spring中有两种类型的bean,一种是普通bean,另一种是工厂bean(FactoryBean)。
1普通bean
先定义一个类
package com.spring.Book;
class Book{
private String bname;
public void setBname(String bname){
this.bname=bname;
}
public void testBook(){
System.out.println("booktest");
}
}
然后写配置文件
<bean id="book" class="com.spring.Book">
<property name="bname" value="Spring"></property>
</bean>
测试类来测试代码
class Test{
@Test
public void testBook(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//加载配置文件
Book book=context.getBean("book",Book.class);//获取对象通过id
//配置文件中bean标签里class属性的类型是Book,这里对象的返回类型也是Book
book.testBook();
}
}
2 FactoryBean
作用:FactoryBean是一个接口,它可以用来创建工厂对象,然后通过工厂对象生产出没有添加@Component注解的类对象。
原理:其实就是一个多态的实现。工厂对象实现FactoryBean接口后,会重写getObject方法和getObjectType方法。然后在获取对象的时候不会从原来的单例Bean的Map中获取对象,而是将工厂对象强转为FactoryBean后,再调用FactoryBean的getObject()方法来获取真正的实例化对象。
定义工厂类实现FactoryBean接口
class Factory implements FactoryBean<Book>{
public Book getObject() throws Exception{
ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");
Book book=context.getBean("book",Book.class);
return book;
}
public Class<?> getObjectType(){
return null;
}
public boolean is Singleton(){
return false;
}
}
写配置文件bean2.xml
<bean id="factory" class="com.spring.Factory"></bean>
//测试类的方法
public void test(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean2.xml");
Book book=context.getBean("book",Book.class);
book.testBook();
}