比較官方的解釋是 Spring Bean是事物處理組件類和實體類(POJO)對象的總稱,是可以被實例化、可以被spring容器管理的java對象。能夠把bean看作是一個組件,這個組件用來具體實現某個業務功能。總結性的講,Bean就是由IOC容器初始化、裝配及管理的對象,除此以外,和程序中的其餘對象沒有區別。java
在spring中bean是由spring容器建立和管理的,各組件之間的依賴關係也是由spring容器管理的,這在很大程度上減小了開發者的工做量。可是你也不是什麼都不須要作的,你要告訴spring要建立哪些bean而且如何將這些bean裝配在一塊兒。看個圖吧:spring
①基於xml配置裝配函數
聲明一個簡單的bean,在xml中能夠按照以下形式聲明一個bean:this
<bean id=」foo」 class="com.test.Foo" >
<property name=」fooPro」 value=」proVal」>
<property name=」otherObj」 ref=」otherObj」>
</bean>
複製代碼
這裏聲明瞭一個簡單的Bean,建立Bean的類由class屬性指定(須要全限定類名),id是Bean的惟一標識,若是沒有指定id屬性的值則取權限定類名做爲id,com.test.Foo類的定義以下:spa
Public Class Foo{
private string fooPro;
private OtherObj otherObj;
public void setFooPro(string fooPro){
this.fooPro = fooPro;
}
public void setOtherObj (OtherObj otherObj){
this.otherObj = otherObj;
}
…
}
複製代碼
<property>元素實現屬性注入,即將「proVal」賦值給com.test.Foo的「fooPro」屬性,這裏注入的是一個常量值。若是該Bean依賴於另外一個Bean,那麼使用ref屬性代替value屬性將所依賴的Bean注入,ref屬性的值指向的是依賴的Bean的id。爲了讓配置文件變得簡潔,Spring提供了p-命名空間來替代property元素,做用是相同的,簡潔配置以下:code
<bean id=」foo」 class="com.test.Foo" p:fooPro=」proVal」 p:otherObj-ref=「otherObj」 ></bean>
複製代碼
常量值屬性的注入爲:p:屬性名=」屬性值」,Bean屬性的注入:p:屬性名-ref=」引用的Bean的id」。以上使用的是setter方法注入,Spring還提供了一種構造器注入的方式,簡單介紹一下(使用的較少,通常都是用setter注入的形式):component
<bean id=」foo」 class="com.test.Foo" >
<constructor-arg value=」proVal」>
<constructor-arg ref=」otherObj」>
</bean>
複製代碼
屬性值的注入是按構造函數中的參數順序依次賦值的。cdn
②基於Java代碼裝配xml
使用Java代碼裝配首先須要建立一個配置類(JavaConfig)對象
@Configuration
public class FooConf{
@Bean
public OtherObj otherObj(){
return new OtherObj();
}
}
複製代碼
@Configuration代表該類是一個配置類,@Bean註解用於聲明一個Bean,@Bean註解的方法通知Spring該方法會返回一個Bean而且會註冊爲Spring應用上下文的Bean。
③基於註解的裝配(自動化裝配)
Spring從兩個角度實現自動化裝配:
第一步:組件掃描(component scanning),Spring會自動發現應用上下文中所建立的bean。
第二不步:自動裝配( autowiring),Spring自動知足bean之間的依賴。
建立能被掃描到的Bean:
@Component
public class Foo(){
}
複製代碼
@Component註解代表該類是一個組件類,它將通知Spring爲該類建立一個Bean。那麼該如何讓Spring去掃描@Component註解的類呢?有兩種方式:
使用@ComponentScan註解啓用組件掃描
@Configuration
@ComponentScan
public class FooConf{
}
複製代碼
若是沒有其餘配置的話,@ComponentScan默認會掃描與配置類相同的包,查找帶有@Component註解的類,可使用basePackages屬性設置掃描的基礎包。
使用xml啓用組件掃描
在xml配置文件中添加<context:component-scan base-package=」要掃描的基礎包」 />,做用同@ComponentScan註解。
@Component註解可以讓Foo類注入到Spring容器中,可是若是Foo類依賴於其餘類怎麼辦呢?使用@AutoWried註解。
@Component
public class Foo{
//成員變量使用@AutoWired
@AutoWried
private OtherObj otherObj;
……
}
@Component
public class Foo{
private OtherObj otherObj;
//構造方法使用@AutoWired
@AutoWried
public Foo (OtherObj otherObj){
this.otherObj = otherObj;
}
}
@Component
public class Foo{
private OtherObj otherObj;
//Setter方法使用@AutoWired
@AutoWried
Public void setOtherObj (OtherObj otherObj){
this.otherObj = otherObj;
}
}
複製代碼
如上,@AutoWried註解可以用在構造器或者setter方法或者成員變量上,做用就是把Foo類依賴的Bean注入進來。
其實在啓動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor後置處理器,當容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查找須要的bean,並裝配給該對象的屬性。
@Resource也能夠把Foo類以來的Bean注入進來,可是@AutoWired默認是按類型裝配,@Resource是按名字裝配。當依賴Bean有多個實現類時,就可使用@Resource註解裝配指定的實現類(@Resource(name="otherObjImpl1")……)。
歡迎你們關注公衆號,瞭解更多文章,你們一塊兒進步!