原文鏈接:http://www.cnblogs.com/tinyj/p/9786013.html
https://blog.csdn.net/yitian_66/article/details/80866571
首先在配置文件里面,這些信息是這樣子滴
connection.username=admin connection.password=kyjufskifas2jsfs connection.remoteAddress=192.168.1.1
這時候我們可以定義一個實體類在裝載配置文件信息
@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {
private String username;
private String remoteAddress;
private String password ;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getRemoteAddress() {
return remoteAddress;
}
public void setRemoteAddress(String remoteAddress) {
this.remoteAddress = remoteAddress;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
我們還可以把@ConfigurationProperties還可以直接定義在@bean的注解上,這是bean實體類就不用@Component和@ConfigurationProperties了
@SpringBootApplication
public class DemoApplication{
//...
@Bean
@ConfigurationProperties(prefix = "connection")
public ConnectionSettings connectionSettings(){
return new ConnectionSettings();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Import
通過導入的方式實現把實例加入springIOC容器中
/** * 定義一個圓形 * * @author zhangqh * @date 2018年5月1日 */ public class Circular { } /** * 定義一個正方形 * * @author zhangqh * @date 2018年5月1日 */ public class Square { }
MainConfig注解配置中增加@Import注解如下:
@Import({Square.class,Circular.class})
@Configuration
public class MainConfig{
}
AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class); String[] beanNames = applicationContext2.getBeanDefinitionNames(); for(int i=0;i<beanNames.length;i++){ System.out.println("bean名稱為==="+beanNames[i]); }
運行結果:
bean名稱為===mainConfig bean名稱為===com.zhang.bean.Square bean名稱為===com.zhang.bean.Circular
@RequestMapping
這個注解可以用於類和方法上,用於類上,表示父路徑,如類上是demo,方法上是/demo1,那么訪問路徑就是demo/demo1
該注解有六個屬性:
params:指定request中必須包含某些參數值是,才讓該方法處理。
headers:指定request中必須包含某些指定的header值,才能讓該方法處理請求。
value:指定請求的實際地址,指定的地址可以是URI Template 模式
method:指定請求的method類型, GET、POST、PUT、DELETE等,這個不寫的話,自適應:get或者post
consumes:指定處理請求的提交內容類型(Content-Type),如application/json,text/html;
produces:指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回
當然也可以使用@GetMapping@PostMapping@PutMapping@DeleteMapping
@PathVariable
對應路徑上的變量,用在參數前,路徑上的變量名需和參數名稱一致
RequestMapping("demo/demo1/{name}")
public String say(@PathVariable String name){
}
@ApiOperation(value = "更新用戶", notes = "更新用戶")
@PutMapping("/user/updateUser")
public void updateUser(@RequestHeader("Authorization") String authorization);
@RequestParam
URL是這樣的:http://host:port/path?參數名=參數值,和以下代碼的作用相同
String name =request.getParameter("name ")。當請求參數username不存在時會有異常發生,可以通過設置屬性required=false解決
@RequestBody
是指方法參數被綁定到HTTP請求Body上,前端就不能用表單的方式提交了,需要用json的方式提交。
@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body,@RequestBody User user){
//可以綁定自定義的對象類型
}
@ResponseBody
表示輸出的是json格式的數據。表示該方法的返回的結果直接寫入 HTTP 響應正文(ResponseBody)中,一般在異步獲取數據時使用,通常是在使用 @RequestMapping 后,返回值通常解析為跳轉路徑,加上@Responsebody 后返回結果不會被解析為跳轉路徑,而是直接寫入HTTP 響應正文中。
@ModelAttribute
1.運用在參數上,會將客戶端傳遞過來的參數按名稱注入到指定對象中,並且會將這個對象自動加入ModelMap中,便於View層使用;
2.運用在方法上,會在每一個@RequestMapping標注的方法前執行,如果有返回值,則自動將該返回值加入到ModelMap中;
@Bean
相當於XML中的<bean></bean>,放在方法的上面,而不是類,意思是產生一個bean,並交給spring管理。
@Qualifier
當有多個同一類型的Bean時,可以用@Qualifier("name")來指定。與@Autowired配合使用,自動注入的策略就從 byType 轉變byName 了
@Autowired
屬於Spring 的org.springframework.beans.factory.annotation包下,可用於為類的屬性、構造器、方法進行注值 ,
按類型注入.默認屬性required= true;當不能確定 Spring 容器中一定擁有某個類的Bean 時, 可以在需要自動注入該類 Bean 的地方可以使用 @Autowired(required = false), 這等於告訴Spring:在找不到匹配Bean時也不拋出BeanCreationException 異常。
@Resource
不屬於spring的注解,而是來自於JSR-250位於java.annotation包下,使用該annotation為目標bean指定協作者Bean。 按名稱裝配
@Resource的作用相當於@Autowired,均可標注在字段或屬性的setter方法上。
注意:
@Autowired注解默認按照類型裝配,如果容器中包含多個同一類型的Bean,那么啟動容器時會報找不到指定類型bean的異常,解決辦法是結合@Qualified注解進行限定,指定注入的bean名稱。
@Resource如果沒有指定name屬性,並且按照默認的名稱仍然找不到依賴對象時, @Resource注解會回退到按類型裝配。但一旦指定了name屬性,就只能按名稱裝配了。
@Autowired注解進行裝配容易拋出異常,特別是裝配的bean類型有多個的時候,而解決的辦法是需要在增加@Qualitied進行限定。
組件類注解
@Component :標准一個普通的spring Bean類。 value不寫默認就是類名首字母小寫
@Repository:標注一個DAO組件類。
@Service:標注一個業務邏輯組件類。
@Controller:標注一個控制器組件類。
@Component可以代替@Repository、@Service、@Controller,因為這三個注解是被@Component標注的。被注解的java類當做Bean實例,Bean實例的名稱默認是Bean類的首字母小寫,其他部分不變。@Service也可以自定義Bean名稱,但是必須是唯一的!
@SpringBootApplication
包含@Configuration、@EnableAutoConfiguration、@ComponentScan
通常用在啟動類上。
@ComponentScan
組件掃描。如果掃描到有@Component @Controller @Service等這些注解的類,則把這些類注冊為bean。
@Configuration
指出該類是 Bean 配置的信息源,相當於XML中的<beans></beans>,一般加在主類上。
@EnableAutoConfiguration
讓 Spring Boot 根據應用所聲明的依賴來對 Spring 框架進行自動配置,一般加在主類上。
啟用 Spring 應用程序上下文的自動配置,試圖猜測和配置您可能需要的bean。自動配置類通常采用基於你的classpath 和已經定義的 beans 對象進行應用。被 @EnableAutoConfiguration 注解的類所在的包有特定的意義,並且作為默認配置使用。通常推薦將 @EnableAutoConfiguration 配置在 root 包下,這樣所有的子包、類都可以被查找到。
@Scope:注解在類上,描述spring容器如何創建Bean實例。
(1)singleton: 表示在spring容器中的單例,通過spring容器獲得該bean時總是返回唯一的實例
(2)prototype:表示每次獲得bean都會生成一個新的對象
(3)request:表示在一次http請求內有效(只適用於web應用)
(4)session:表示在一個用戶會話內有效(只適用於web應用)
(5)globalSession:表示在全局會話內有效(只適用於web應用)
在多數情況,我們只會使用singleton和prototype兩種scope,如果未指定scope屬性,默認為singleton
@RestController 是一個結合了 @ResponseBody 和 @Controller 的注解
@suppresswarnings 抑制警告
@Modifying 如果是增,改,刪加上此注解
1:方法的返回值應該是int,表示更新語句所影響的行數。
2:在調用的地方必須加事務,沒有事務不能正常執行
@Transactional 事務注解
@Query 自定義查詢語句 JPQL
@Entity
@Table(name=“”):注解在類上表明這是一個實體類。一般用於jpa這兩個注解一般一塊使用,但是如果表名和實體類名相同的話,@Table可以省略
@Column:通過@Column注解設置,包含的設置如下
name:數據庫表字段名
unique:是否唯一
nullable:是否可以為空
Length:長度
inserttable:是否可以插入
updateable:是否可以更新
columnDefinition: 定義建表時創建此列的DDL
secondaryTable: 從表名。如果此列不建在主表上(默認建在主表),該屬性定義該列所在從表的名字。
@Column(name = "user_code", nullable = false, length=32)//設置屬性userCode對應的字段為user_code,長度為32,非空 private String userCode; @Column(name = "user_wages", nullable = true, precision=12,scale=2)//設置屬性wages對應的字段為user_wages,12位數字可保留兩位小數,可以為空 private double wages;
@Id:表示該屬性為主鍵。
@Temporal(TemporalType.DATE)//設置為時間類型
private Date joinDate;
@Transient:表示該屬性並非一個到數據庫表的字段的映射,ORM框架將忽略該屬性。如果一個屬性並非數據庫表的字段映射,就務必將其標示為@Transient,否則,ORM框架默認其注解為@Basic。@Basic(fetch=FetchType.LAZY):標記可以指定實體屬性的加載方式
@JsonIgnore:作用是json序列化時將Java bean中的一些屬性忽略掉,序列化和反序列化都受影響。
@JoinColumn(name=”loginId”):一對一:本表中指向另一個表的外鍵。一對多:另一個表指向本表的外鍵。
@OneToOne、@OneToMany、@ManyToOne:對應hibernate配置文件中的一對一,一對多,多對一。
@GeneratedValue 用於標注主鍵的生成策略,通過 strategy 屬性指定。默認情況下,JPA 自動選擇一個最適合底層數據庫的主鍵生成策略:SqlServer 對應 identity,MySQL 對應 auto increment。 在 javax.persistence.GenerationType 中定義了以下幾種可供選擇的策略:
IDENTITY:采用數據庫 ID自增長的方式來自增主鍵字段,Oracle 不支持這種方式;
AUTO: JPA自動選擇合適的策略,是默認選項;
SEQUENCE:通過序列產生主鍵,通過 @SequenceGenerator 注解指定序列名,MySql 不支持這種方式
TABLE:通過表產生主鍵,框架借由表模擬序列產生主鍵,使用該策略可以使應用更易於數據庫移植。
@Profile
Spring Profile提供了一種隔離應用程序配置的方式,並讓這些配置只能在特定的環境下生效。
任何@Component或@Configuration都能被@Profile標記,從而限制加載它的時機。
@Configuration
@Profile("prod")
public class ProductionConfiguration {
// ...
}
