1. 程式人生 > >Spring 框架常用語法進行總結

Spring 框架常用語法進行總結

 

Spring 框架常用語法進行總結:

spring框架的二大主要的功能就是IOC和AOP。

IOC: 控制反轉(依賴注入)

AOP: 面向切面程式設計

學習spring最好的方法就是去看官網,裡面有詳細的說明及使用原則

介紹spring 中的註解的使用,xml配置等目前在市面上面較少。

 

首先介紹Java自帶的元註解 (元註解就是 能註解到註解上的註解,能用在其他註解上的註解 )

Java5.0定義了4個標準的meta-annotation型別

@Target :

用於描述註解的範圍,即註解在哪用。它說明了Annotation所修飾的物件範圍:Annotation可被用於 packages、types(類、介面、列舉、Annotation型別)、型別成員(方法、構造方法、成員變數、列舉值)、方法引數和本地變數(如迴圈變數、catch引數)等。取值型別(ElementType)

   CONSTRUCTOR:用於描述構造器
  FIELD:用於描述域即類成員變數
  LOCAL_VARIABLE:用於描述區域性變數
  METHOD:用於描述方法
  PACKAGE:用於描述包
  PARAMETER:用於描述引數
  TYPE:用於描述類、介面(包括註解型別) 或enum宣告
  TYPE_PARAMETER:1.8版本開始,描述類、介面或enum引數的宣告
  TYPE_USE:1.8版本開始,描述一種類、介面或enum的使用宣告
  
eg :

public @interface Log {
  ......
}

 

@Retention :

用於描述註解的生命週期,表示需要在什麼級別儲存該註解,即保留的時間長短。取值型別RetentionPolicy)

   SOURCE:在原始檔中有效(即原始檔保留)
  CLASS:在class檔案中有效(即class保留)
  RUNTIME:在執行時有效(即執行時保留)  
eg:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
  ......
}

 

@Documented :

用於描述其它型別的annotation應該被作為被標註的程式成員的公共API,因此可以被例如javadoc此類的工具文件化。它是一個標記註解,沒有成員。

eg :

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
  ......
}
@Inherited :

用於表示某個被標註的型別是被繼承的。如果一個使用了@Inherited修飾的annotation型別被用於一個class,則這個annotation將被用於該class的子類。

 

 

Spring 常用的註解

在註解配置中常用的啟動方法就是:

<!--在XML中啟用方法-->
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
Person bean = (Person) applicationContext.getBean("person");
System.out.println(bean);

--------------------------------------------------------------------------
   <!--在註解中啟用方法-->
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
Person bean = applicationContext.getBean(Person.class);
System.out.println(bean);


getBeanNamesForType:得到當前IOC容器載入進來的bean的名稱
String[] namesForType = applicationContext.getBeanNamesForType(Person.class);
for (String name : namesForType) {
System.out.println(name);
}
@Component

元件,沒有明確的角色

@Service

在業務邏輯層使用(service層)

@Repository

在資料訪問層使用(dao層)

@Controller

在展現層使用,控制器的宣告(Controller)

@Bean

注入ioc容器中,預設是以方法的名稱作為注入容器裡面的名稱,需注意@bean可以不在配置類裡面使用,不過經過@Bean註解使用過的方法所在的類也會被載入到ioc容器裡面。

//配置類==配置檔案

@Configuration

告訴Spring這是一個配置類,用在一個類的上面,配置類

@Configuration == <bean id="person" class="com.opendev.entity.Person"></bean>

@ComponentScan

value:指定要掃描的包,用在配置類上面,告訴程式在spring中的掃包範圍

@ComponentScans

掃描多個包還有提供掃包的自定義掃包規則

 

package com.atguigu.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.ComponentScans;

import com.atguigu.bean.Person;

//配置類==配置檔案
@Configuration  //告訴Spring這是一個配置類

@ComponentScans(
value = {
@ComponentScan(value="com.atguigu",includeFilters = {
/*@Filter(type=FilterType.ANNOTATION,classes={Controller.class}),
@Filter(type=FilterType.ASSIGNABLE_TYPE,classes={BookService.class}),*/
@Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})
},useDefaultFilters = false)
}
)
//@ComponentScan value:指定要掃描的包
//excludeFilters = Filter[] :指定掃描的時候按照什麼規則排除那些元件
//includeFilters = Filter[] :指定掃描的時候只需要包含哪些元件
//FilterType.ANNOTATION:按照註解
//FilterType.ASSIGNABLE_TYPE:按照給定的型別;
//FilterType.ASPECTJ:使用ASPECTJ表示式
//FilterType.REGEX:使用正則指定
//FilterType.CUSTOM:使用自定義規則
public class MainConfig {

//給容器中註冊一個Bean;型別為返回值的型別,id預設是用方法名作為id
@Bean("person")//聲明瞭注入ioc容器裡面的物件為person,預設都是以方法名作為id
public Person person01(){
return new Person("lisi", 20);
}
}

 

//類中元件統一設定。滿足當前條件,這個類中配置的所有bean註冊才能生效;

@Conditional

裡面需要寫上相應介面的實現類

@Import

匯入元件,id預設是元件的全類名

spring中bean的作用域

預設是單例項的

//預設是單例項的
/**
* ConfigurableBeanFactory#SCOPE_PROTOTYPE    
* @see ConfigurableBeanFactory#SCOPE_SINGLETON  
* @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST request
* @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION sesssion
* @return\
* @Scope:調整作用域
* prototype:多例項的:ioc容器啟動並不會去呼叫方法建立物件放在容器中。
* 每次獲取的時候才會呼叫方法建立物件;
* singleton:單例項的(預設值):ioc容器啟動會呼叫方法建立物件放到ioc容器中。
* 以後每次獲取就是直接從容器(map.get())中拿,
* request:同一次請求建立一個例項
* session:同一個session建立一個例項
*
* 懶載入:
* 單例項bean:預設在容器啟動的時候建立物件;
* 懶載入:容器啟動不建立物件。第一次使用(獲取)Bean建立物件,並初始化;
*
*/
//@Scope("prototype")
@Lazy
@Bean("person")
public Person person(){
System.out.println("給容器中新增Person....");
return new Person("張三", 25);
}
spring中bean 的生命週期
/**
* bean的生命週期:
* bean建立---初始化----銷燬的過程
* 容器管理bean的生命週期;
* 我們可以自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法
*
* 構造(物件建立)
* 單例項:在容器啟動的時候建立物件
* 多例項:在每次獲取的時候建立物件\
*
* BeanPostProcessor.postProcessBeforeInitialization
* 初始化:
* 物件建立完成,並賦值好,呼叫初始化方法。。。
* BeanPostProcessor.postProcessAfterInitialization
* 銷燬:
* 單例項:容器關閉的時候
* 多例項:容器不會管理這個bean;容器不會呼叫銷燬方法;
*
*
* 遍歷得到容器中所有的BeanPostProcessor;挨個執行beforeInitialization,
* 一但返回null,跳出for迴圈,不會執行後面的BeanPostProcessor.postProcessorsBeforeInitialization
*
* BeanPostProcessor原理
* populateBean(beanName, mbd, instanceWrapper);給bean進行屬性賦值
* initializeBean
* {
* applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
* invokeInitMethods(beanName, wrappedBean, mbd);執行自定義初始化
* applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
*}
*
*
*
* 1)、指定初始化和銷燬方法;
* 通過@Bean指定init-method和destroy-method;
* 2)、通過讓Bean實現InitializingBean(定義初始化邏輯),
* DisposableBean(定義銷燬邏輯);
* 3)、可以使用JSR250;
* @PostConstruct:在bean建立完成並且屬性賦值完成;來執行初始化方法
* @PreDestroy:在容器銷燬bean之前通知我們進行清理工作
* 4)、BeanPostProcessor【interface】:bean的後置處理器;
* 在bean初始化前後進行一些處理工作;
* postProcessBeforeInitialization:在初始化之前工作
* postProcessAfterInitialization:在初始化之後工作
*
* Spring底層對 BeanPostProcessor 的使用;
* bean賦值,注入其他元件,@Autowired,生命週期註解功能,@Async,xxx BeanPostProcessor;
*
*
*
*/
spring中的自動裝配
/**
* 自動裝配;
* Spring利用依賴注入(DI),完成對IOC容器中中各個元件的依賴關係賦值;
*
* 1)、@Autowired:自動注入:
* 1)、預設優先按照型別去容器中找對應的元件:applicationContext.getBean(BookDao.class);找到就賦值
* 2)、如果找到多個相同型別的元件,再將屬性的名稱作為元件的id去容器中查詢
* applicationContext.getBean("bookDao")
* 3)、@Qualifier("bookDao"):使用@Qualifier指定需要裝配的元件的id,而不是使用屬性名
* 4)、自動裝配預設一定要將屬性賦值好,沒有就會報錯;
* 可以使用@Autowired(required=false);
* 5)、@Primary:讓Spring進行自動裝配的時候,預設使用首選的bean;
* 也可以繼續使用@Qualifier指定需要裝配的bean的名字
* BookService{
* @Autowired
* BookDao bookDao;
* }
*
* 2)、Spring還支援使用@Resource(JSR250)和@Inject(JSR330)[java規範的註解]
* @Resource:
* 可以和@Autowired一樣實現自動裝配功能;預設是按照元件名稱進行裝配的;
* 沒有能支援@Primary功能沒有支援@Autowired(reqiured=false);
* @Inject:
* 需要匯入javax.inject的包,和Autowired的功能一樣。沒有required=false的功能;
* @Autowired:Spring定義的; @Resource、@Inject都是java規範
*
* AutowiredAnnotationBeanPostProcessor:解析完成自動裝配功能;
*
* 3)、 @Autowired:構造器,引數,方法,屬性;都是從容器中獲取引數元件的值
* 1)、[標註在方法位置]:@Bean+方法引數;引數從容器中獲取;預設不寫@Autowired效果是一樣的;都能自動裝配
* 2)、[標在構造器上]:如果元件只有一個有參構造器,這個有參構造器的@Autowired可以省略,引數位置的元件還是可以自動從容器中獲取
* 3)、放在引數位置:
*
* 4)、自定義元件想要使用Spring容器底層的一些元件(ApplicationContext,BeanFactory,xxx);
* 自定義元件實現xxxAware;在建立物件的時候,會呼叫介面規定的方法注入相關元件;Aware;
* 把Spring底層一些元件注入到自定義的Bean中;
* xxxAware:功能使用xxxProcessor;
* ApplicationContextAware==》ApplicationContextAwareProcessor;
*
*
*
*
*/

&n