flask使用現有的資料表、在網頁中顯示資料
註解開發
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
- 多個種類的配置出現後,優先載入系統級的,然後載入業務級的,避免細粒度的載入控制