類解耦
-
通過反射來創建對象,避免通過new關鍵字
-
讀取配置文件來獲取要創建的對象的全限定類名(唯一標誌)
結構
-
持久層
-
持久層接口
-
持久層實現
-
-
業務層
-
業務層接口
-
業務層實現
-
持久層調用jdbc,業務層調用持久層,表現層調用業務層,會存在類相互依賴的情況,需要解耦
編譯期依賴:沒有某個類,不能正常編譯
實際開發應做到,編譯期不依賴,運行時依賴
spring的IOC容器是Map結構,一個id對應一個object
spring boot
註解
註解只有一個屬性,且屬性名是value,則value可以不寫
springboot
-
@SpringBootApplication
:Spring Boot Application的入口點是包含@SpringBootApplication
註釋的類。@SpringBootApplication
批註添加到類中,則無需添加@EnableAutoConfiguration
,@ComponentScan
和@SpringBootConfiguration
spring
@Autowired
作用:自動按照類型注入,只要容器中有唯一的bean對象類型和要注入的變量類型匹配,就可以注入成功,在ioc容器中不考慮id,直接查找object的類名
出現位置:可以在變量上,也可以在方法上,
匹配過程:先尋找類名一致的,在類名一致的前提下,查看bean的id是否有和要注入變量的名字一樣的,若有,則注入,否則報錯。
@Bean
作用:用於把當前方法的返回值作爲bean對象存入spring的ioc容器中,默認是單例的,
屬性:
-
name:用於指定bean的id,默認值當前方法的名稱
@Bean
@Scope('prototype')
private xxxx xxxx() {}
@Component
在持久層、業務層和控制層中,分別採用@Repository(持久層)、@Service(業務層)和@Controller(表現層)對分層中的類進行命名,而用@Component對那些比較中立的類進行命名。
作用:將當前類存放到spring容器中
屬性:
-
value: 用於指定bean的id,默認類名(首字母變小寫)
// 以下3中情況都相同
@Component(value='xxx')
@Component('xxx')
@Component
public class Xxx {}
@ComponentScan
作用:用於通過註解指定spring在創建容器時要掃描的包
屬性:
-
value:等同於basePackages
-
basePackages:等同於value
@Component(value="xxx.xxx")
@Component("xxx.xxx")
@Configuration
作用:指定當前類是一個配置類
@Import
作用:允許從另一個配置類中加載 @Bean 定義
@Configuration
@Import(ConfigA.class)
@PostConstruct
作用:初始化執行方法,用於@Component之類的方法上
@PreDestroy
作用:銷燬方法,多例spring不負責銷燬方法,只有單例負責,用於@Component之類的方法上
@PropertySource
作用:用於指定properties文件的位置
@PropertySource("classpath:jdbc.properties")
屬性:
-
value:指定文件的名稱和路徑
@Qualifier
作用:按照類型注入的基礎上再按照名稱注入,給類成員注入時不能單獨使用,但是在給方法參數注入時可以。
屬性:
-
value:用於指定bean的id
@Scope
作用:用於指定bean的作用範圍
屬性:
-
value:常用取值:singleton(單例) | prototype(多例) (默認單例)
@Value
作用:用於注入基本類型和String類型的數據
屬性:
-
value:用於指定數據的值,也可以使用spring的el表達式
spring mvc
@RequestMapping
value
method
consumes
produces
params
headers
@RequestMapping("/test") // test 即爲value值
@RequestMapping(value="/test/{id}", method=RequestMethon.GTET) // 處理動態URI
String getDynamicUriValue(@PathVariable String id) { // id值可以在這個得到
System.out.println("ID is " + id);
return "Dynamic URI parameter fetched";
}
@RequestMapping(method = RequestMethod.POST) // 處理所有post請求
@RequestMapping() // 處理所有請求
String default() {}
@RestController
@RequestMapping("/home") //單個屬性可以省略value
public class IndexController {
@RequestMapping(value = "/prod", produces = {
"application/JSON"
}) // 返回消息是json類型
@ResponseBody
String getProduces() {
return "Produces attribute";
}
@RequestMapping(value = "/cons", consumes = {
"application/JSON",
"application/XML"
}) // 接受消息是json和xml類型,{} 指定多個消息頭
String getConsumes() {
return "Consumes attribute";
}
}
@RequestParam
作用: 處理?key=value1&key2=value2
@RequestMapping("/user")
public String getUserBlog(@RequestParam("id") int blogId) {
return "blogId = " + blogId;
}
@RequestParam Map<String,Object> params
// 這樣當我們訪問/user?id=123時,Spring MVC幫助我們將Request參數id的值綁定到了處理函數的參數blogId上。這樣就能夠輕鬆獲取用戶輸入,並根據它的值進行計算並返回了。
相信大家可能注意到了,@RequestParam
和@PathVariable
都能夠完成類似的功能——因爲本質上,它們都是用戶的輸入,只不過輸入的部分不同,一個在URL路徑部分,另一個在參數部分。要訪問一篇博客文章,這兩種URL設計都是可以的:
-
通過
@PathVariable
,例如/blogs/1
-
通過
@RequestParam
,例如blogs?blogId=1
那麼究竟應該選擇哪一種呢?建議:
-
當URL指向的是某一具體業務資源(或者資源列表),例如博客,用戶時,使用
@PathVariable
-
當URL需要對資源或者資源列表進行過濾,篩選時,用
@RequestParam
例如我們會這樣設計URL:
-
/blogs/{blogId}
-
/blogs?state=publish
而不是/blogs/state/publish
來表示處於發佈狀態的博客文章
更多用法
一旦我們在方法中定義了@RequestParam
變量,如果訪問的URL中不帶有相應的參數,就會拋出異常——這是顯然的,Spring嘗試幫我們進行綁定,然而沒有成功。但有的時候,參數確實不一定永遠都存在,這是我們可以通過定義required
屬性:
@RequestParam(name="id",required=false) // 默認是true,也就是必須傳這個參數
// 當然,在參數不存在的情況下,可能希望變量有一個默認值:
@RequestParam(name="id",required=false,defaultValue="0")
@RequestBody
如果把 json 作爲參數傳遞,我們可以使用 @requestbody 接收參數,將數據轉換 Map:
@PathVariable
是用來獲得請求url中的動態參數的
@RequestHeader
@CookieValue
@ModelAttribute
@SessionAttribute
綁定
get
前臺傳的參數要和後臺@RequestMapping綁定方法的參數名一致, 也可以將所有參數封裝到一個對象account中,如果有嵌套user,前臺的name要使用user.xxx