spring元件註冊就是讓spring的ioc容器去管理元件的這個bean,
spring元件基於註解的註冊方法主要有以下幾種:
首先需要乙個@configuration註解的配置類,告訴spring容器配置的入口,和xml配置檔案的功能一樣
首先新建乙個person類,屬性為string:name,integer:age;
新建配置類,**如下:
@configuration//表示當前類為乙個配置類
public class mainconfig01
}
測試類如下:
@test
public void test01()
}
列印出來容器中的元件除了spring本身自帶的還有這兩個: mainconfig01 person
@bean預設beandefinitionname為方法名,也可以指定@bean("alen")@bean 和xml檔案配置中的標籤一致,也可以指定以下屬性
2.1.預設為單例模式,scope可以指定單例還是多例,單例預設在容器建立是建立元件並放入容器,多例則在獲取時建立
2.2指定init-method和destory-method,單例下bean的生命週期交給容器管理,init-method和destory-method都會執行,多例下只 會執行destory-method
2.3.@lazy註解,元件會在容器獲取時初始化建立。
在@componentscan註解中,
1.缺省會自動掃瞄以下四個註解註解的元件
/**
* indicates whether automatic detection of classes annotated with
* , , or should be enabled.
*/boolean usedefaultfilters() default true;
2.標籤值為@filter的兩個過濾器
filter excludefilters() default {};//排除
filter includefilters() default {};//包含
值為@filter,預設的過濾型別為註解格式,
/**
* the type of filter to use.
* default is .
* @see #classes
* @see #pattern
*/filtertype type() default filtertype.annotation;
在filter type列舉型別中還有其他幾個格式
public enum filtertype
按照自定義的規則
implementation.
我們需要去實現typefilter介面,舉個例子,**如下:
public class myflitertype implements typefilter
return false;
}}
配置類如下:
@configuration
@componentscan(value = "com.practice.bean")
public class mainconfig01
}
測試類:
@test
public void test02()
}
結果為:
org.springframework.context.annotation.internalconfigurationannotationprocessor
org.springframework.context.annotation.internalautowiredannotationprocessor
org.springframework.context.annotation.internalcommonannotationprocessor
org.springframework.context.event.internaleventlistenerprocessor
org.springframework.context.event.internaleventlistene***ctory
mainconfig01
controllerdemo
daodemo
servicedemo
person
includefilters此處不再講解,需要將usedefaultfilters = false置為false,因為預設開啟會掃瞄componernt四個註解。
自定義乙個條件,需要實現condition類,**如下
public class mycondition implements condition
return false;
}}
此類的意思是在作業系統在windows環境下則載入
在掃瞄的com.practice.bean包中加了@component註解的某個類上加上@conditional(value = mycondition.class)註解
我們將啟動引數改為-dos.name=linux,則此元件將不會再被註冊。
1. 直接匯入
在bean的包下先建乙個 myimport類,我們將此註解@import(value = )加在我們的主配置類上,執行測試類,
可以看到,輸出的元件中包含了該類的全類名(預設id為全類名)。
2.importselector:匯入元件選擇器,
2.1實現介面importselector:
public class myimportselector implements importselector ;
}}
配置類註解@import(value = ),執行測試類,可以看到myimport元件已註冊
2.2importbeandefinitionregistrar:匯入元件定義註冊器
作用:實現importbeandefinitionregistrar介面,我們可以為容器註冊元件。
新建importbeandefinitionregistrartest類以做測試:
public class importbeandefinitionregistrartest
新建myimportbeandefinitionregistrar類,為容器註冊importbeandefinitionregistrartest類的bean定義資訊,匯入該元件。
**如下:
public class myimportbeandefinitionregistrar implements importbeandefinitionregistrar
}
配置類註解改為@import(value = ),執行測試類,可以看到importbeandefinitionregistrartest元件已註冊。
factorybean實現類如下:
public class myfactorybean implements factorybean
@override
public class<?> getobjecttype()
}
配置類修改為
@configuration
@componentscan(value = "com.practice.bean")
public class mainconfig01
}
執行測試類,可以看到myfactorybean已被註冊。那麼這個myfactorybean就是myfactorybean類嗎?
我們在測試類中加上:
system.out.println(bean);
列印出的bean為com.practice.bean.person類,說明person已被註冊到容器中。
那麼怎麼獲取這個myfactorybean類元件呢,使用&符號,原始碼中已給出說明。
/**
* used to dereference a instance and distinguish it from
* beans created by the factorybean. for example, if the bean named
* is a factorybean, getting
* will return the factory, not the instance returned by the factory.
*/string factory_bean_prefix = "&";
列印bean.getclass.console顯示class com.practice.bean.myfactorybean。 Spring註解(一) 元件註解
1 configuration 告訴spring這是乙個配置類 2 bean 給容器中註冊乙個bean 型別為返回值的型別,id預設是用方法名作為id 預設是單例項 3 componentscan 包掃瞄,自動把 controller service repository component下的元件...
spring整理(一)元件整合
簡單來說,spring 框架是乙個分層架構,由 7 個定義良好的模組組成的輕量級開源框架。spring模組構建在核心容器之上,核心容器定義了建立 配置和管理 bean 的方式,它是乙個基於ioc di和aop的構架多層j2ee系統的框架。可以說spring是企業應用開發的 一站式 選擇,並貫穿表現層...
Spring註解開發 一
註解開發 將xml格式的配置,按照annotation改寫增強 依賴 org.springframework spring context 5.0.2.release junit junit 4.12 test 什麼都不做,無自定義的bean 使用註解 package cn.config impor...