Spring(八):Spring配置Bean
在Spring的IOC容器裏配置Bean
配置Bean形式:基於xml文件方式、基於註解的方式
在xml文件中通過bean節點配置bean:
<?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 name="helloSpring" class="com.dx.spring.beans.HelloSpring"> <property name="name" value="Spring"></property> </bean> </beans>
參考:《Spring(二):Spring框架&Hello Spring》中配置過程
id:Bean的名稱
1)在IOC容器中必須是唯一的;
2)若id沒有指定,Spring會自動將全系nag定型為類名作為Bean的名字;
3)id可以指定多個名字,名字之間可用逗號、分號、或空格分隔。
Bean的配置方式:通過全類名(反射實現,此時要求該bean類擁有一個無參數構造器)、通過工廠方法(靜態工廠方法&實例工廠方法)、FactoryBean
IOC容器BeanFactory&ApplicationContext概述
Spring容器
1)在Spring IOC容器讀取Bean配置創建Bean實例之前,必須對它進行實例化。只有在容器實例化後,才可以從IOC容器裏獲取Bean實例並使用。
2)Spring提供了兩種類型IOC容器實現
---BeanFactory:IOC容器的基本實現。BeanFactory是Spring框架的基礎設施,面向Spring本身。
---ApplicationContext:提供了更多的高級屬性,是BeanFactory的子接口。ApplicationContext面向使用Spring框架的開發者,幾乎所有的應用場合都直接使用ApplicationContext,而非底層的BeanFactory。
備註:
1)無論使用兩種方式的哪一種,配置文件是相同的。
2)如何卻別ApplicatinContext是BeanFactory的子接口:
ApplicatinContext的類定義:
// Compiled from ApplicationContext.java (version 1.8 : 52.0, no super bit) public abstract interface org.springframework.context.ApplicationContext
extends org.springframework.core.env.EnvironmentCapable,
org.springframework.beans.factory.ListableBeanFactory,
org.springframework.beans.factory.HierarchicalBeanFactory,
org.springframework.context.MessageSource,
org.springframework.context.ApplicationEventPublisher,
org.springframework.core.io.support.ResourcePatternResolver { // Method descriptor #10 ()Ljava/lang/String; @org.springframework.lang.Nullable public abstract java.lang.String getId(); // Method descriptor #10 ()Ljava/lang/String; public abstract java.lang.String getApplicationName(); // Method descriptor #10 ()Ljava/lang/String; public abstract java.lang.String getDisplayName(); // Method descriptor #16 ()J public abstract long getStartupDate(); // Method descriptor #18 ()Lorg/springframework/context/ApplicationContext; @org.springframework.lang.Nullable public abstract org.springframework.context.ApplicationContext getParent(); // Method descriptor #20 ()Lorg/springframework/beans/factory/config/AutowireCapableBeanFactory; public abstract org.springframework.beans.factory.config.AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws java.lang.IllegalStateException; }從上邊我們知道ApplicationContext是繼承了org.springframework.beans.factory.ListableBeanFactory,org.springframework.beans.factory.HierarchicalBeanFactory接口,而這兩個接口都是繼承了org.springframework.beans.factory.BeanFactory接口。
public interface BeanFactory { String FACTORY_BEAN_PREFIX = "&"; Object getBean(String name) throws BeansException; <T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; <T> T getBean(Class<T> requiredType, Object... args) throws BeansException; boolean containsBean(String name); boolean isSingleton(String name) throws NoSuchBeanDefinitionException; boolean isPrototype(String name) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException; @Nullable Class<?> getType(String name) throws NoSuchBeanDefinitionException; String[] getAliases(String name); }因此,說ApplicationContext是BeanFactory的子接口類。
ApplicaionContext
ApplicationContext的主要實現類:
---ClassPathXmlApplicationContext:從類路徑下加載配置文件
---FileSystemXmlApplicationContext:從文件系統中加載配置文件。
依賴註入的方式:屬性註入;構造函數註入;工廠方法(不推薦、也不常用)
註入屬性值細節
自動裝配
bean之間的關系:繼承;依賴。
bean的作用域:singleton;property;web環境作用域
使用外部屬性文件
SPEL
IOC容器中Bean的聲明周期
Spring4.x新概念:泛型依賴註入。
Spring(八):Spring配置Bean