1、ApplicationContextjava
1.ApplicationContext的結構體系spring
ApplicationContext接口是一個BeanFactory基礎上封裝了更多功能的,Spring中最爲經常使用的IoC容器,其包含兩個子接口:ConfigurableApplicationContext、WebApplicationContext。json
首先來理解一下相關的概念:容器是spring的核心,使IoC管理全部和組件,spring有兩種容器:a、BeanFactoy;b、ApplicationContext應用上下文。其中BeanhFactory使用延遲加載全部的Bean,爲了從BeanhFactory獲得一個Bean,只要調用getBean()方法,就能得到Bean。而ApplicationContext:restful
a、提供文本信息解析,支持I18N。(咱們公司採用這個方式進行文本解析。)
b、提供載入文件資源的通用方法。
c、向註冊爲監聽器的Bean發送事件。
d、ApplicationContext接口擴展BeanFactory接口。
e、ApplicationContext提供附加功能。app
ApplicationContext的三個實現類:框架
a、ClassPathXmlApplication:把上下文文件當成類路徑資源
b、FileSystemXmlApplication:從文件系統中的XML文件載入上下文定義信息。異步
c、XmlWebApplicationContext:從Web系統中的XML文件載入上下文定義信息。ui
2.二者之間的區別:spa
Spring提供了兩種不一樣的容器:一種是最基本的BeanFactory,另外一種是擴展的ApplicationContext。BeanFactory 僅提供了最基本的依賴注入支持,而 ApplicationContext 則擴展了BeanFactory ,提供了更多的額外功能。兩者對Bean的初始化也有很大區別。BeanFactory當須要調用時讀取配置信息,生成某個類的實例。若是讀入的Bean配置正確,則其餘的配置中有錯誤也不會影響程序的運行。而ApplicationContext 在初始化時就把 xml 的配置信息讀入內存,對 XML 文件進行檢驗,若是配置文件沒有錯誤,就建立全部的Bean ,直接爲應用程序服務。相對於基本的BeanFactory,ApplicationContext 惟一的不足是佔用內存空間。當應用程序配置Bean較多時,程序啓動較慢。ApplicationContext會利用Java反射機制自動識別出配置文件中定義的BeanPostProcessor、InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor,並自動將它們註冊到應用上下文中;而BeanFactory須要在代碼中經過手工調用addBeanPostProcessor()方法進行註冊。.net
做用:
1. BeanFactory負責讀取bean配置文檔,管理bean的加載,實例化,維護bean之間的依賴關係,負責bean的聲明週期。
2. ApplicationContext除了提供上述BeanFactory所能提供的功能以外,還提供了更完整的框架功能:
a. 國際化支持。
b. 資源訪問:Resource rs = ctx. getResource(「classpath:config.properties」), 「file:c:/config.properties」
c. 事件傳遞:經過實現ApplicationContextAware接口。
3.獲取bean的方式
方法一:在初始化時保存ApplicationContext對象 。
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("userService");/
方法二:經過Spring提供的utils類獲取ApplicationContext對象 。
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc); ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc); ac1.getBean("beanId"); ac2.getBean("beanId");
方法三:繼承自抽象類ApplicationObjectSupport 。
方法四:繼承自抽象類WebApplicationObjectSupport 。
方法五:實現接口ApplicationContextAware 。(現階段所作項目採用了此方法)
public class SpringContextUtil implements ApplicationContextAware { // Spring應用上下文環境 private static ApplicationContext applicationContext; /** * 實現ApplicationContextAware接口的回調方法。設置上下文環境 * * @param applicationContext */ public void setApplicationContext(ApplicationContext applicationContext) { SpringContextUtil.applicationContext = applicationContext; } /** * @return ApplicationContext */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 獲取對象 * * @param name * @return Object * @throws BeansException */ public static Object getBean(String name) throws BeansException { return applicationContext.getBean(name); } }
注意:儘管,spring提供的後三種方法可以實現在普通的類中繼承或實現對應的類或接口來獲取spring 的ApplicationContext對象,但是在使用是必定要注意實現了這些類或接口的普通java類必定要在Spring 的配置文件applicationContext.xml文件裏進行配置。不然獲取的ApplicationContext對象將爲null。也就是SpringContextUtil 要配置在xml中。
方法六:經過Spring提供的ContextLoader。
資料:http://blog.csdn.net/u011202334/article/details/51509235
2、spring中的經常使用註解。
@Configuration:把一個類做爲一個IoC容器,它的某個方法頭上若是註冊了@Bean,就會做爲這個Spring容器中的Bean。
@Lazy(true) :表示延遲初始化。
@Service:用於標註業務層組件。 (使用不少)
@Controller:用於標註控制層組件(如struts中的action)。(使用不少)
@Repository:用於標註數據訪問組件,即DAO組件。(使用不少)
@Component:泛指組件,當組件很差歸類的時候,咱們可使用這個註解進行標註。
@Scope:註解 做用域。(通常使用默認)
@PostConstruct:用於指定初始化方法(用在方法上)。(使用不少)
@PreDestory:用於指定銷燬方法(用在方法上)。
@DependsOn:定義Bean初始化及銷燬時的順序。(使用不少,做用在類上)
@Primary:自動裝配時當出現多個Bean候選者時,被註解爲@Primary的Bean將做爲首選者,不然將拋出異常。
@Autowired: 默認按類型裝配,若是咱們想使用按名稱裝配,能夠結合@Qualifier註解一塊兒使用。以下:
@Autowired @Qualifier("personDaoBean") 存在多個實例配合使用。(使用不少)
@Async:異步方法,方法將在執行的時候,將會在獨立的線程中被執行,調用者無需等待它的完成。
@PathVariable :@RequestMapping URI template 樣式映射時, 即 someUrl/{paramId}, 這時的paramId可經過 @Pathvariable註解綁定它傳過來的值到方法的參數上。(使用不少,restful風格上)
@RequestParam(required = true):能夠設置默認參數。(使用不少)
@RequestMapping(value="/",produces=""):設置URL,能夠帶不少參數;method: 指定請求的method類型, GET、POST、PUT、DELETE等;produces: 指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回;例如,方法僅處理request請求中Accept頭中包含了"application/json"的請求,同時暗示了返回的內容類型爲application/json;headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請求。(使用不少)
@ResponseBody:轉爲json。(使用不少)
Spring 4.2新特性:
@Data:註解在類上;提供類全部屬性的 getting 和 setting 方法,此外還提供了equals、canEqual、hashCode、toString 方法
@Setter:註解在屬性上;爲屬性提供 setting 方法
@Getter:註解在屬性上;爲屬性提供 getting 方法
@Log4j :註解在類上;爲類提供一個 屬性名爲log 的 log4j 日誌對象
@NoArgsConstructor:註解在類上;爲類提供一個無參的構造方法。