1. 程式人生 > 實用技巧 >spring jpa ManyToMany原理及用法詳解

spring jpa ManyToMany原理及用法詳解

註解開發

1)註解驅動的意義

1.1)什麼是註解驅動

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

1.2)註解驅動的弊端

  • 為了達成註解驅動的目的,可能會將原先很簡單的書寫,變的更加複雜
  • XML中配置第三方開發的資源是很方便的,但使用註解驅動無法在第三方開發的資源中進行編輯,因此會增大開發工作量

啟動註解功能

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

<context:component-scan base-package="packageName"/>
  • 說明:
    • 在進行包所掃描時,會對配置的包及其子包中所有檔案進行掃描
    • 掃描過程是以資料夾遞迴迭代的形式進行的
    • 掃描過程僅讀取合法的java檔案
    • 掃描時僅讀取spring可識別的註解
    • 掃描結束後會將可識別的有效註解轉化為spring對應的資源加入IoC容器
  • 注意:
    • 無論是註解格式還是XML配置格式,最終都是將資源載入到IoC容器中,差別僅僅是資料讀取方式不同
    • 從載入效率上來說註解優於XML配置檔案

bean的定義

  • 名稱:@Component @Controller @Service @Repository
  • 型別:類註解
  • 位置:類定義上方
  • 作用:設定該類為spring管理的bean
  • 範例:
@Component
public class ClassName{}
  • 說明:
    • @Controller、@Service 、@Repository是@Component的衍生註解,功能同@Component
  • 相關屬性
    • value(預設):定義bean的訪問id

bean的作用域註解

  • 名稱:@Scope
  • 型別:類註解
  • 位置:類定義上方
  • 作用:設定該類作為bean對應的scope屬性
  • 範例:
@Scope
public class ClassName{}
  • 相關屬性
    • value(預設):定義bean的作用域,預設為singleton

bean的生命週期註解

  • 名稱:@PostConstruct、@PreDestroy
  • 型別:方法註解
  • 位置:方法定義上方
  • 作用:設定該類作為bean對應的生命週期方法
  • 範例:
@PostConstruct
public void init() { System.out.println("init..."); }

載入第三方資源

  • 名稱:@Bean

  • 型別:方法註解

  • 位置:方法定義上方

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

  • 範例:

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

    • 因為第三方bean無法在其原始碼上進行修改,使用@Bean解決第三方bean的引入問題
    • 該註解用於替代XML配置中的靜態工廠與例項工廠建立bean,不區分方法是否為靜態或非靜態
    • @Bean所在的類必須被spring掃描載入,否則該註解無法生效
  • 相關屬性

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

bean的非引用型別屬性注入

  • 名稱:@Value

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

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

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

  • 範例:

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

    • value值僅支援非引用型別資料,賦值時對方法的所有引數全部賦值
    • value值支援讀取properties檔案中的屬性值,通過類屬性將properties中資料傳入類中
    • value值支援SpEL
    • @value註解如果新增在屬性上方,可以省略set方法(set方法的目的是為屬性賦值)
  • 相關屬性

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

bean的引用型別屬性注入

  • 名稱:@Autowired、@Qualifier

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

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

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

  • 範例:

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

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

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

優先裝配

  • 名稱:@Primary

  • 型別:類註解

  • 位置:類定義上方

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

  • 範例:

    @Primary
    public class ClassName{}
    
  • 說明:

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

bean的引用型別屬性注入

  • 名稱:@Inject、@Named、@Resource
  • 說明:
    • @Inject與@Named是JSR330規範中的註解,功能與@Autowired和@Qualifier完全相同,適用於不同架構場景
    • @Resource是JSR250規範中的註解,可以簡化書寫格式
  • @Resource相關屬性
    • name:設定注入的bean的id
    • type:設定注入的bean的型別,接收的引數為Class型別

載入properties檔案

  • 名稱:@PropertySource

  • 型別:類註解

  • 位置:類定義上方

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

  • 範例:

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

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

    • value(預設):設定載入的properties檔名
    • ignoreResourceNotFound:如果資源未找到,是否忽略,預設為false

純註解格式

  • 名稱:@Configuration、@ComponentScan

  • 型別:類註解

  • 位置:類定義上方

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

  • 範例:

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

    • 核心配合類用於替換spring核心配置檔案,此類可以設定空的,不設定變數與屬性
    • bean掃描工作使用註解@ComponentScan替代

AnnotationConfigApplicationContext

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

    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
    

第三方bean配置與管理

  • 名稱:@Import

  • 型別:類註解

  • 位置:類定義上方

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

  • 範例:

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

    • @Import註解在同一個類上,僅允許新增一次,如果需要匯入多個,使用陣列的形式進行設定
    • 在被匯入的類中可以繼續使用@Import匯入其他資源(瞭解)
    • @Bean所在的類可以使用匯入的形式進入spring容器,無需宣告為bean

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

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