Java BeanDefination接口詳細講解
功能作用
BeanDefinition 是定義 Bean 的配置元信息接口,包含:
Bean 的類名
設置父 bean 名稱、是否為 primary、
Bean 行為配置信息,作用域、自動綁定模式、生命周期回調(diào)、延遲加載、初始方法、銷毀方法等
Bean 之間的依賴設置,dependencies
構(gòu)造參數(shù)、屬性設置

BeanDefinition 子類方法更為豐富些。
派生出 AnnotatedBeanDefinition 接口,以及常用子類 RootBeanDefinition、GenericBeanDefinition。
可以使用 BeanDefinitionBuilder 或 new BeanDefinition 實現(xiàn)類構(gòu)建 BeanDefinition 對象。
為什么這樣設計
假設沒有BeanDefinition
假設沒有 沒有BeanDefinition 這一層的存在,Spring 實例化Bean的模型是這樣的,

這個時候,由于版本更迭,xml配置的形式 被棄用,需要使用 注解的方式注解Bean,由于解析工作與實例化的代碼 冗雜在一起, xml那一套完全 不被使用, 需要重新寫一套 邊解析注解,邊實例化的 邏輯。由于設計的缺陷,導致了開發(fā)的工作量提升, 且代碼復用性 也不高。

有BeanDefinition
現(xiàn)在 存在BeanDefinition,Spring 解析xml文件,實例化Bean的模型是這樣的,

此時需要增加 掃描注解 實例化Bean的邏輯,那么就只有 解析的工作不一樣,后面的實例化部分的邏輯可以共用。 而解析 其實只是 ioc 很小的一部分而已。實現(xiàn)了 解析配置和 實例化的耦合,增加了代碼的復用性,可維護性, 可拓展性。

如果 再需要加一種 注冊Bean的方式, 比如文件,網(wǎng)絡,那么只要 拓展 對應的解析階段的邏輯 , 保持 實例化Bean的邏輯不變。

BeanDefinition 屬性介紹

示例
User.java
package constxiong;
public class User {
private Integer id;
private String name;
public User() {
}
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}構(gòu)建和注冊 BeanDefinition 對象測試類
package constxiong;
import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;
/**
* 測試 BeanDefinition 構(gòu)建
* @author ConstXiong
*/
public class Test {
public static void main(String[] args) {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
// BeanDefinitionBuilder 構(gòu)建 BeanDefinition
BeanDefinitionBuilder builder = BeanDefinitionBuilder
.genericBeanDefinition(User.class)
.addPropertyValue("id", 1) //屬性設置
.addPropertyValue("name", "constxiong");
beanFactory.registerBeanDefinition("user1", builder.getBeanDefinition());
User user = beanFactory.getBean("user1", User.class);
System.out.println(user);
//直接 new 的方式,創(chuàng)建 BeanDefinitionBuilder 對象
RootBeanDefinition beanDefinition = new RootBeanDefinition(User.class);
//構(gòu)造參數(shù)
ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues();
constructorArgumentValues.addIndexedArgumentValue(0, 1);
constructorArgumentValues.addIndexedArgumentValue(1, "user2");
beanDefinition.setConstructorArgumentValues(constructorArgumentValues);
beanFactory.registerBeanDefinition("user2", beanDefinition);
User user2 = beanFactory.getBean("user2", User.class);
System.out.println(user2);
}
}到此這篇關于Java BeanDefination接口詳細講解的文章就介紹到這了,更多相關Java BeanDefination內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Eclipse中創(chuàng)建Web項目最新方法(2023年)
在Java開發(fā)人員中,最常用的開發(fā)工具應該就是Eclipse,下面這篇文章主要給大家介紹了關于Eclipse中創(chuàng)建Web項目2023年最新的方法,需要的朋友可以參考下2023-09-09

