spring中bean,factorybean與beanfactory
1. 普通Bean的建立
spring 中的普通bean的建立是通過讀取配置檔案,將所有配置檔案資訊儲存到beandefinition中,在使用getbean的時候通過反射建立例項,然後再將屬性值填充。
1.1 普通bean的注入方式
1) 使用構造器注入
<bean id="person" class="framework.spring.test.Person">
<constructor-arg index="0" value="1"/>
<constructor-arg index="1" value="name"/>
</bean>
2) 使用setter方法注入
給屬性新增set方法注入的時候使用如下方式:
<bean id="user" class="framework.spring.test.User">
<property name="id" value="1"/>
<property name="name" value="name"/>
<property name="person" ref="person"/>
</bean>
3) 使用註解方式注入
@Autowired
private Person person;
註解可以加在屬性上,也可以加在set方法上
2. FactoryBean的建立
由於普通bean建立的時候只能通過反射,不能自定義bean的建立方式,因而如果有需要自定義bean建立方式的需要的時候,可以使用factorybean。
1)自定義factorybean
建立factorybean,spring在定義bean的時候為我們提供了factory-bean這樣一個屬性,說明這個bean是一個由工廠類建立的物件,這個物件通過指定的factory-method方法生成。
public class JDBConnectionFactory implements DBConnectionFactory {
private String nodeName;
public JDBConnectionFactory(String nodeName) {
this.nodeName = nodeName;
}
public Connection create() {
Connection connection = null;
try {
connection = new JDBC4Connection(nodeName, 0 ,new Properties(), "", "");
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
}
2)通過factoryBean介面建立bean
一般情況下,Spring 通過反射機制利用 的 class 屬性指定實現類例項化 Bean ,在某些情況下,例項化 Bean 過程比較複雜,如果按照傳統的方式,則需要在 中提供大量的配置資訊。配置方式的靈活性是受限的,這時採用編碼的方式可能會得到一個簡單的方案。 Spring 為此提供了一個 org.springframework.bean.factory.FactoryBean 的工廠類介面,使用者可以通過實現該介面定製例項化 Bean 的邏輯。
FactoryBean介面有這樣幾個方法:
a) T getObject() throws Exception;
b) Class
public class PersonFactoryBean implements FactoryBean<Person>{
public Person getObject() throws Exception {
return new Person(0,"");
}
public Class<?> getObjectType() {
return Person.class;
}
public boolean isSingleton() {
return false;
}
}
<bean id="personByFactory" class="framework.spring.test.PersonFactoryBean"/>
3. BeanFactory
BeanFactory:建立bean的工廠,BeanFactorty是一個介面,spring中所有物件的建立都圍繞著BeanFactory展開。spring中BeanFacroty的實現包括AutowireCapableBeanFactory、DefaultListableBeanFactory、XmlBeanFactory等,通常在springIOC中,會通過beanFactory建立factoryBean。BeanFactory介面中的方法包括:
4. BeanFactory與FactoryBean的區別
BeanFactory是個Factory,也就是IOC容器或物件工廠,FactoryBean是個Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)來進行管理的。但對FactoryBean而言,這個Bean不是簡單的Bean,而是一個能生產或者修飾物件生成的工廠Bean,它的實現與設計模式中的工廠模式和修飾器模式類似。