1. 程式人生 > 實用技巧 >spring常用註解

spring常用註解

註解開發

1)註解驅動的意義

1.1)什麼是註解驅動

註解啟動時使用註解的形式替代xml配置,將繁雜的spring配置檔案從工程中徹底消除掉,簡化書寫

1.2)註解驅動的弊端

  • 為了達成註解驅動的目的,可能會將原先很簡單的書寫,變的更加複雜

  • XML中配置第三方開發的資源是很方便的,但使用註解驅動無法在第三方開發的資源中進行編輯,因此會增大開發工作量

2)常用註解

2.1)啟動註解功能

啟動註解掃描,載入類中配置的註解項

<context:component-scan base-package="packageName"/>

  • 說明:

    • 在進行包所掃描時,會對配置的包及其子包中所有檔案進行掃描

    • 掃描過程是以資料夾遞迴迭代的形式進行的

    • 掃描過程僅讀取合法的java檔案

    • 掃描時僅讀取spring可識別的註解

    • 掃描結束後會將可識別的有效註解轉化為spring對應的資源加入IoC容器

  • 注意:

    • 無論是註解格式還是XML配置格式,最終都是將資源載入到IoC容器中,差別僅僅是資料讀取方式不同

    • 從載入效率上來說註解優於XML配置檔案

2.2)bean的定義

  • 名稱:@Component @Controller @Service @Repository

  • 型別:類註解

  • 位置:類定義上方

  • 作用:設定該類為spring管理的bean

  • 範例:

@Component
public class ClassName{}
  • 說明:

    • @Controller、@Service 、@Repository是@Component的衍生註解,功能同@Component

  • 相關屬性

    • value(預設):定義bean的訪問id

2.3)bean的作用域

  • 名稱:@Scope

  • 型別:類註解

  • 位置:類定義上方

  • 作用:設定該類作為bean對應的scope屬性

  • 範例:

@Scope
public class ClassName{}
  • 相關屬性

    • value(預設):定義bean的作用域,預設為singleton

2.4)bean的生命週期

  • 名稱:@PostConstruct、@PreDestroy

  • 型別:方法註解

  • 位置:方法定義上方

  • 作用:設定該類作為bean對應的生命週期方法

  • 範例:

@PostConstruct
public void init() { System.out.println("init..."); }

2.5)載入第三方資源

  • 名稱:@Bean

  • 型別:方法註解

  • 位置:方法定義上方

  • 作用:設定該方法的返回值作為spring管理的bean

  • 範例:

    @Bean("dataSource")
    public DruidDataSource createDataSource() {    return ……;    }
  • 說明:

    • 因為第三方bean無法在其原始碼上進行修改,使用@Bean解決第三方bean的引入問題

    • 該註解用於替代XML配置中的靜態工廠與例項工廠建立bean,不區分方法是否為靜態或非靜態

    • @Bean所在的類必須被spring掃描載入,否則該註解無法生效

  • 相關屬性

    • value(預設):定義bean的訪問id

2.6)bean的非引用型別屬性注入

  • 名稱:@Value

  • 型別:屬性註解、方法註解

  • 位置:屬性定義上方,方法定義上方

  • 作用:設定對應屬性的值或對方法進行傳參

  • 範例:

    @Value("${jdbc.username}")
    private String username;
  • 說明:

    • value值僅支援非引用型別資料,賦值時對方法的所有引數全部賦值

    • value值支援讀取properties檔案中的屬性值,通過類屬性將properties中資料傳入類中

    • value值支援SpEL

    • @value註解如果新增在屬性上方,可以省略set方法(set方法的目的是為屬性賦值)

  • 相關屬性

    • value(預設):定義對應的屬性值或引數值

2.7)bean的引用型別屬性注入

  • 名稱:@Autowired、@Qualifier

  • 型別:屬性註解、方法註解

  • 位置:屬性定義上方,方法定義上方

  • 作用:設定對應屬性的物件或對方法進行引用型別傳參

  • 範例:

    @Autowired(required = false)
    @Qualifier("userDao")
    private UserDao userDao;
  • 說明:

    • @Autowired預設按型別裝配,指定@Qualifier後可以指定自動裝配的bean的id

  • 相關屬性

    • required:定義該屬性是否允許為null

2.8)bean的引用型別屬性注入

  • 名稱:@Primary

  • 型別:類註解

  • 位置:類定義上方

  • 作用:設定類對應的bean按型別裝配時優先裝配

  • 範例:

    @Primary
    public class ClassName{}
  • 說明:

    • @Autowired預設按型別裝配,當出現相同型別的bean,使用@Primary提高按型別自動裝配的優先順序,多個@Primary會導致優先順序設定無效

2.9)bean的引用型別屬性注入

  • 名稱:@Inject、@Named、@Resource

  • 說明:

    • @Inject與@Named是JSR330規範中的註解,功能與@Autowired和@Qualifier完全相同,適用於不同架構場景

    • @Resource是JSR250規範中的註解,可以簡化書寫格式

  • @Resource相關屬性

    • name:設定注入的bean的id

    • type:設定注入的bean的型別,接收的引數為Class型別

2.10)載入properties檔案

  • 名稱:@PropertySource

  • 型別:類註解

  • 位置:類定義上方

  • 作用:載入properties檔案中的屬性值

  • 範例:

    @PropertySource(value = "classpath:filename.properties")
    public class ClassName {
        @Value("${propertiesAttributeName}")
        private String attributeName;
    }
  • 說明:

    • 不支援*通配格式,一旦載入,所有spring控制的bean中均可使用對應屬性值

  • 相關屬性

    • value(預設):設定載入的properties檔名

    • ignoreResourceNotFound:如果資源未找到,是否忽略,預設為false

2.11)純註解格式

  • 名稱:@Configuration、@ComponentScan

  • 型別:類註解

  • 位置:類定義上方

  • 作用:設定當前類為spring核心配置載入類

  • 範例:

    @Configuration
    @ComponentScan("scanPackageName")
    public class SpringConfigClassName{
    }
  • 說明:

    • 核心配合類用於替換spring核心配置檔案,此類可以設定空的,不設定變數與屬性

    • bean掃描工作使用註解@ComponentScan替代

AnnotationConfigApplicationContext

  • 載入純註解格式上下文物件,需要使用AnnotationConfigApplicationContext

    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

2.12)第三方bean配置與管理

  • 名稱:@Import

  • 型別:類註解

  • 位置:類定義上方

  • 作用:匯入第三方bean作為spring控制的資源

  • 範例:

    @Configuration
    @Import(OtherClassName.class)
    public class ClassName {
    }
  • 說明:

    • @Import註解在同一個類上,僅允許新增一次,如果需要匯入多個,使用陣列的形式進行設定

    • 在被匯入的類中可以繼續使用@Import匯入其他資源(瞭解)

    • @Bean所在的類可以使用匯入的形式進入spring容器,無需宣告為bean

3)bean載入控制

3.1)依賴載入

(1)@DependsOn

  • 名稱:@DependsOn

  • 型別:類註解、方法註解

  • 位置:bean定義的位置(類上或方法上)

  • 作用:控制bean的載入順序,使其在指定bean載入完畢後再載入

  • 範例:

    @DependsOn("beanId")
    public class ClassName {
    }
  • 說明:

    • 配置在方法上,使@DependsOn指定的bean優先於@Bean配置的bean進行載入

    • 配置在類上,使@DependsOn指定的bean優先於當前類中所有@Bean配置的bean進行載入

    • 配置在類上,使@DependsOn指定的bean優先於@Component等配置的bean進行載入

  • 相關屬性

    • value(預設):設定當前bean所依賴的bean的id

(2)@Order

  • 名稱:@Order

  • 型別:配置類註解

  • 位置:配置類定義的位置(類上)

  • 作用:控制配置類的載入順序

  • 範例:

    @Order(1)
    public class SpringConfigClassName {
    }

(3)@Lazy

  • 名稱:@Lazy

  • 型別:類註解、方法註解

  • 位置:bean定義的位置(類上或方法上)

  • 作用:控制bean的載入時機,使其延遲載入

  • 範例:

    @Lazy
    public class ClassName {
    }

3.2)依賴載入應用場景

@DependsOn

  • 微信訂閱號,釋出訊息和訂閱訊息的bean的載入順序控制

  • 雙11活動期間,零點前是結算策略A,零點後是結算策略B,策略B操作的資料為促銷資料。策略B載入順序與促銷資料的載入順序

@Lazy

  • 程式災難出現後對應的應急預案處理是啟動容器時載入時機

@Order

  • 多個種類的配置出現後,優先載入系統級的,然後載入業務級的,避免細粒度的載入控制