IOC操作Bean管理-工厂Bean(FactoryBean)
前言
- Spring中有两种Bean:一种是普通Bean,另一种是工厂Bean(FactoryBean)。
两种区别:
- 普通Bean:在配置文件中定义的Bean类型与返回类型一致
- 工厂Bean:在配置文件中定义的Bean类型可以和返回类型不一样
工厂Bean创建流程
- 第一步:创建一个类,让这个类作为工厂bean,实现接口Factory Bean
- 第二步:实现接口里的方法,在实现的方法中定义返回的Bean类型
示例:
工厂类代码:
package com.yang.pojo;
import org.springframework.beans.factory.FactoryBean;
/**
* @program: TestSpring
* @description: 简单示范工厂Bean
* @author: 陈阳
* @create: 2021-01-21 21:15
**/
public class MyBean implements FactoryBean<Book> {
/**
*
* @return 上边的泛型和本方法返回值类型一致
* @throws Exception
*/
public Book getObject() throws Exception {
Book book = new Book("测试1", "陈阳", new BooksType("测试"));
return book;
}
public Class<?> getObjectType() {
return null;
}
public boolean isSingleton() {
return false;
}
}
返回类的代码:
package com.yang.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: TestSpring
* @description: 图书类
* @author: 陈阳
* @create: 2021-01-21 20:19
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
private String bookName;
private String author;
private BooksType booksType;
}
XML代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--定义的工厂bean -->
<bean id="myBean" class="com.yang.pojo.MyBean" />
</beans>
测试代码:
package com.yang.run;
import com.sun.org.apache.xpath.internal.SourceTree;
import com.yang.pojo.ArrayAndCollection;
import com.yang.pojo.Book;
import com.yang.pojo.MyBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.sql.SQLOutput;
import java.util.Arrays;
/**
* @program: TestSpring
* @description: 测试bean对象是否创建成功
* @author: 陈阳
* @create: 2021-01-21 19:40
**/
public class TestBean {
@Test
public void testFactory(){
ApplicationContext context = new ClassPathXmlApplicationContext("FactoryBean.xml");
//注:这里的Book.class应是myBean(工厂类)的返回类
Book myBean = context.getBean("myBean", Book.class);
System.out.println(myBean.toString());
}
}
返回结果: