Bean的不同配置方式比較與應用場景
基於XML配置
Bean的定義: 在XML文件中通過<bean>元素定義。
Bean的名稱: 通過<bean>的id或name屬性定義。
Bean的註入: 通過<property>子元素或通過p命名空間的動態屬性。
Bean生命過程方法:通過<bean>的init-method和destory-method屬性指定Bean實現類的方法名。最多只能指定一個初始化方法和一個銷毀方法。
Bean作用範圍: 通過<bean>的scope屬性指定。
Bean延遲初始化: 通過<bean>的lazy-init屬性指定,默認為default,繼承於<beans>的default-lazy-init設置,該值默認為false。
應用場景:
1、Bean實現類來源於第三方類庫,如 DataSoure、JdbcTemplate等,因無法在類中標註註解,所以通過XML配置方式比較好。
2、命名空間的配置,如aop、context等,只能采用基於XML的配置。
基於註解配置
Bean的定義: 在Bean實現類處通過標註@Compoent或衍型類(@Repository、@Service、@Controller)定義Bean。
Bean的名稱: 通過註解的value屬性定義,如@Component("name")。默認名稱為小寫字母開頭的類名(不帶包名)name。
Bean的註入: 通過通過在成員變更或方法入參處標註@Autowired,按類型匹配自動註入。還可以配合使用@Qualifier按名稱匹配方式註入。
Bean生命過程方法:通過在目標方法上標註@PostConstruct 和@PreDestroy註解指定初始化或銷毀方法,可以定義任意多個。
Bean作用範圍: 通過在類定義處標註@Scope指定,如@Scope("prototype")
Bean延遲初始化: 通過在類定義處標註@Lazy指定,如@Lazy(true)。
應用場景:
1、Bean的實現類是當前項目開發的,可以直接在Java類中使用基於註解的配置。
基於Java類配置
Bean的定義: 在標註了@Configuration的Java類中,通過在類方法上標註@Bean定義一個Bean。方法必須提供Bean的實例化邏輯。
Bean的名稱: 通過@Bean的name屬性定義,如@Bean("user")。默認名稱為方法名。
Bean的註入: 比較靈活,可以在方法處通過@Autowired使方法入參綁定Bean,然後在方法中通過代碼進行註入;還可以通過調用配置類@Bean方法進行註入。
Bean生命過程方法:通過@Bean的initMethod或destoryMethod指定一個初始化或銷毀方法。對於初始化方法來說,可以直接在方法內通過代碼的方法靈活定義初始化邏輯。
Bean作用範圍: 通過在Bean方法定義處標註@Scope指定。
Bean延遲初始化: 通過在Bean方法定義處標註@Lazy指定。
應用場景:
1、基於JAVA類配置的優勢在於可以通過代碼方法控制Bean初始化的整體邏輯。如果實例化Bean的邏輯比較復雜,則比較適合基於Java類配置的方式。
基於Groovy DSL配置
Bean的定義: 在Groovy文件中通過DSL定義Bean。
Bean的名稱: 通過Groovy的DSL定義Bean的名稱(Bean的類型,Bean構建函數參數)。
Bean的註入: 比較靈活,可以在方法處通過ref()方法進行註入,如:ref("logDao")。
Bean生命過程方法:通過bean->bean.initMethod或bean.destoryMethod指定一個初始化或銷毀方法。
Bean作用範圍: 通過bean->bean.scope="prototype"指定。
Bean延遲初始化: 通過bean->bean.lazyInit=true指定。
應用場景:
1、基於Groovy DSL配置的優勢在於可以通過Groovy腳本靈活控制Bean初始化的過程。如果實例化Bean的邏輯比較復雜,則比較適合基於Groovy DSL配置的方式。
Bean的不同配置方式比較與應用場景