一、controller相關注解
1、@Controller
控制器,處理http請求。
2、@RespController
Spring4之后新加的注解,原來返回json需要@ResponseBody和@Controller配合。
3、@RequestMapping
配置url映射,用於方法和controller類上。
4、@GetMapping
注解簡寫:@RequestMapping(value = "/say",method = RequestMethod.GET)等價於:@GetMapping(value = "/say")
二、取值
1、@PathVariable:獲取url中的數據
方式1:
@Controller @RequestMapping("/User") public class HelloWorldController { @RequestMapping("/getUser/{uid}") public String getUser(@PathVariable("uid")Integer id, Model model) { System.out.println("id:"+id); model.addAttribute("userName","小明"); model.addAttribute("phone","123456"); return "user"; } }
訪問url:
http://192.168.1.100:8082/User/getUser/1111
方式2:
@Controller @RequestMapping("/User") public class HelloWorldController { @RequestMapping("{uid}/getUser") public String getUser(@PathVariable("uid")Integer id, Model model) { System.out.println("id:"+id); model.addAttribute("userName","小明"); model.addAttribute("phone","123456"); return "user"; } }
訪問url:
http://192.168.1.100:8082/springboot-demo/User/1111/getUser
2、@RequestParam:獲取請求參數的值
@Controller @RequestMapping("/User") public class HelloWorldController {
@RequestMapping("/getUser") public String getUser(@RequestParam("uid")Integer id, Model model) { System.out.println("id:"+id); model.addAttribute("userName","小明"); model.addAttribute("phone","123456"); return "user"; } }
url:
http://192.168.1.100:8082/springboot-demo/User/getUser?uid=112
三、啟動注解
1、@SpringBootApplication
源碼:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication { .... }
發現@SpringBootApplication是一個復合注解,包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。
2、@SpringBootConfiguration
繼承自@Configuration,二者功能也一致,標注當前類是配置類,並會將當前類內聲明的一個或多個以@Bean注解標記的方法的實例納入到srping容器中,並且實例名就是方法名。
3、@EnableAutoConfiguration
@EnableAutoConfiguration的作用啟動自動的配置,@EnableAutoConfiguration注解的意思就是Springboot根據你添加的jar包來配置你項目的默認配置,比如根據spring-boot-starter-web ,來判斷你的項目是否需要添加了webmvc和tomcat,就會自動的幫你配置web項目中所需要的默認配置。
4、@ComponentScan
掃描當前包及其子包下被@Component,@Controller,@Service,@Repository等注解標記的類並納入到spring容器中進行管理。是以前的<context:component-scan>(以前使用在xml中使用的標簽,用來掃描包配置的平行支持)。所以本demo中的User為何會被spring容器管理。
5、@ConfigurationProperties和@PropertySourceproperties配置文件映射到實體bean
Spring Boot可使用注解的方式將自定義的properties文件映射到實體bean中,比如smsConfig.properties文件
sms.code=17788990
sms.content=消息不存在
SmsConfig.java
@Configuration @ConfigurationProperties(prefix = "sms") @PropertySource("classpath:/config/smsConfig.properties") public class SmsConfig { private String code; private String msg; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
只需要該類被掃描到即可。使用@Autowired注入。
@Autowired private SmsConfig smsConfig;
6、@EnableConfigurationProperties
如果是其他非掃描路徑,在Spring Boot的啟動類上面加注解
@EnableConfigurationProperties({SmsConfig.class}) 即可,用法一樣。
7、@ConditionalOnClass
當spring中已經加載某個類時該配置生效,用法:
@ConditionalOnClass({SmsConfig.class})
8、@ConditionalOnProperty
這個注解能夠控制某個configuration是否生效。具體操作是通過其兩個屬性name以及havingValue來實現的,其中name用來從application.properties中讀取某個屬性值,如果該值為空,則返回false;如果值不為空,則將該值與havingValue指定的值進行比較,如果一樣則返回true;否則返回false。如果返回值為false,則該configuration不生效;為true則生效。
@Configuration //如果synchronize在配置文件中並且值為true @ConditionalOnProperty(name = "synchronize", havingValue = "true") public class SecondDatasourceConfig { @Bean(name = "SecondDataSource") @Qualifier("SecondDataSource") @ConfigurationProperties(prefix = "spring.second.datasource") public DataSource jwcDataSource() { return DataSourceBuilder.create().build(); } }
9、同類型注解
- @ConditionalOnClass : classpath中存在該類時起效
- @ConditionalOnMissingClass : classpath中不存在該類時起效
- @ConditionalOnBean : DI容器中存在該類型Bean時起效
- @ConditionalOnMissingBean : DI容器中不存在該類型Bean時起效
- @ConditionalOnSingleCandidate : DI容器中該類型Bean只有一個或@Primary的只有一個時起效
- @ConditionalOnExpression : SpEL表達式結果為true時
- @ConditionalOnProperty : 參數設置或者值一致時起效
- @ConditionalOnResource : 指定的文件存在時起效
- @ConditionalOnJndi : 指定的JNDI存在時起效
- @ConditionalOnJava : 指定的Java版本存在時起效
- @ConditionalOnWebApplication : Web應用環境下起效
- @ConditionalOnNotWebApplication : 非Web應用環境下起效
四、bean注入相關
1、@Repository
DAO層注解,DAO層中接口繼承JpaRepository<T,ID extends Serializable>,需要在build.gradle中引入相關jpa的一個jar自動加載。
2、@Service
- @Service是@Component注解的一個特例,作用在類上
- @Service注解作用域默認為singleton
- 使用注解配置和類路徑掃描時,被@Service注解標注的類會被Spring掃描並注冊為Bean
- @Service用於標注業務層組件,表示定義一個bean
- @Service使用時沒有傳參數,Bean名稱默認為當前類的類名,首字母小寫
- @Service(“serviceBeanId”)或@Service(value=”serviceBeanId”)使用時傳參數,使用value作為Bean名字
- @Service注解使用時不傳參Bean名默認為當前類名,首字母小寫
- @Service注解使用時傳參Bean名為參數value的值
3、@Scope注解
- @Scope作用在類上和方法上
- @Scope用來配置 spring bean 的作用域,它標識 bean 的作用域
- singleton單例模式:Spring 容器中有且只有一個Bean實例,只要Spring容器不銷毀或退出,該Bean實例就會一直存活
- prototype原型模式:每次獲取Bean的時候會有一個新的實例,Spring容器不能對返回Bean實例的整個生命周期負責
- request模式:request只適用於Web程序,每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效,當請求結束后,該 對象的生命周期即告結束
- session模式:session只適用於Web程序,session作用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session 內有效
- application模式:application只適用於Web程序,全局作用域
使用示例:@Service和@Scope注解一起使用
// 單例 @Service @Scope("singleton") public class SingletonScope { public SingletonScope() { } } //原型 @Service @Scope("prototype") public class PrototypeScope { public PrototypeScope() { } }
4、@Entity
- SpringMVC中model層相當於SpringBoot中的entity層,@Entity注解在實體類(domain層)上面。
- @Table(name ="數據庫表名"),這個注解也注釋在實體類上,對應數據庫中相應的表。
- @Id、@Column注解用於標注實體類中的字段,pk字段標注為@Id,其余@Column。
5、@Autowired、@Qualifier和@Resource
1、@Autowired與@Resource都可以用來裝配bean. 都可以寫在字段上,或寫在setter方法上。
2、@Autowired默認按類型裝配(這個注解是屬業spring的),默認情況下必須要求依賴對象必須存在,如果要允許null 值,可以設置它的required屬性為false,如:@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier注解進行使用,如下:
@Autowired() @Qualifier("baseDao") private BaseDao baseDao;
3、@Resource(這個注解屬於J2EE的),默認安照名稱進行裝配,名稱可以通過name屬性進行指定, 如果沒有指定name屬性,當注解寫在字段上時,默認取字段名進行按照名稱查找,如果注解寫在setter方法上默認取屬性名進行裝配。 當找不到與名稱匹配的bean時才按照類型進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。 Java代碼
@Resource(name="baseDao") private BaseDao baseDao;
推薦使用:@Resource注解在字段上,且這個注解是屬於J2EE的,減少了與spring的耦合。最重要的這樣代碼看起就比較優雅。
6、@Component
- @Component作用在類上
- @Component注解作用域默認為singleton
- 使用注解配置和類路徑掃描時,被@Component注解標注的類會被Spring掃描並注冊為Bean
- @Component使用在不確定哪一個層的時候使用,可以作用在任何層次,把普通pojo實例化到spring容器
- 不推薦使用@Component注解,而應該使用它的擴展,如@Service、@Repository
7、@Bean產生一個bean的方法
@Bean明確地指示了一種方法,產生一個bean的方法,並且交給Spring容器管理。支持別名@Bean("xx-name")
8、@Order加載bean的順序
加載bean的順序,按優先級加載,數字越小優先級越高。
五、導入配置文件
1、@ImportResource導入xml配置文件
在Java配置文件中引入xml配置文件,可用@ImportResource
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="compactDisc" class="soundsystem.BlankDisc" c:_0="Sgt. Pepper's Lonely Hearts Club Band" c:_1="The Beatles"> <constructor-arg> <list> <value>Sgt. Pepper's Lonely Hearts Club Band</value> <value>With a Little Help from My Friends</value> <value>Lucy in the Sky with Diamonds</value> <value>Getting Better</value> <value>Fixing a Hole</value> <!-- ...other tracks omitted for brevity... --> </list> </constructor-arg> </bean> </beans>
使用:
package soundsystem; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.ImportResource; @Configuration @ImportResource("classpath:cd-config.xml") public class SoundSystemConfig { }
支持通配符:@ImportResource("classpath:*.xml")
@ImportResource({"classpath*:spring/*Context*.xml"})
2、@Import導入配置類
簡介:功能類似XML配置的,用來導入配置類,可以導入帶有@Configuration注解的配置類或實現了ImportSelector/ImportBeanDefinitionRegistrar,或者導入普通的POJO(Spring會將其注冊成Spring Bean,導入POJO需要使用Spring 4.2以上)。多個逗號隔開。
@SpringBootApplication @Import({SmsConfig.class}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
六、事物
1、事務說明
在Spring中,事務有兩種實現方式,分別是編程式事務管理和聲明式事務管理兩種方式。
- 編程式事務管理: 編程式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於編程式事務管理,spring推薦使用TransactionTemplate。
- 聲明式事務管理: 建立在AOP之上的。其本質是對方法前后進行攔截,然后在目標方法開始之前創建或者加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務。
聲明式事務管理不需要入侵代碼,通過@Transactional就可以進行事務操作,更快捷而且簡單。推薦使用
2、使用示例
@Autowired OrderServiceorderService; //order操作的Service層 @ApiOperation(value = "增加OrderCustomer") @RequestMapping(value = "", method = RequestMethod.POST) @ResponseBody @Transactional public JsonBean<Order> insertOrder(@RequestParam(value = "order") String order) { try { //創建訂單 Order order = orderService.insert(user.getId(),is_company,fk_want_company_id); return new JsonBean(SUCCESS, orderCustomer); } catch (ErrorCodeException e) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return new JsonBean(e.getErrorCode()); } }
3、常用配置
參 數 名 稱 功 能 描 述
- readOnly:該屬性用於設置當前事務是否為只讀事務,設置為true表示只讀,false則表示可讀寫,默認值為false。例如:@Transactional(readOnly=true)
- rollbackFor :該屬性用於設置需要進行回滾的異常類數組,當方法中拋出指定異常數組中的異常時,則進行事務回滾。例如:指定單一異常類:@Transactional(rollbackFor=RuntimeException.class)指定多個異常類:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
- rollbackForClassName :該屬性用於設置需要進行回滾的異常類名稱數組,當方法中拋出指定異常名稱數組中的異常時,則進行事務回滾。例如:指定單一異常類名稱@Transactional(rollbackForClassName=”RuntimeException”)指定多個異常類名稱:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})
- noRollbackFor :該屬性用於設置不需要進行回滾的異常類數組,當方法中拋出指定異常數組中的異常時,不進行事務回滾。例如:指定單一異常類:@Transactional(noRollbackFor=RuntimeException.class)指定多個異常類:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
- noRollbackForClassName :該屬性用於設置不需要進行回滾的異常類名稱數組,當方法中拋出指定異常名稱數組中的異常時,不進行事務回滾。例如:指定單一異常類名稱:@Transactional(noRollbackForClassName=”RuntimeException”)指定多個異常類名稱:@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})
- propagation :該屬性用於設置事務的傳播行為。例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
- isolation :該屬性用於設置底層數據庫的事務隔離級別,事務隔離級別用於處理多事務並發的情況,通常使用數據庫的默認隔離級別即可,基本不需要進行設置
- timeout :該屬性用於設置事務的超時秒數,默認值為-1表示永不超時
4、事務屬性
4.1、事務隔離級別
隔離級別是指若干個並發的事務之間的隔離程度。TransactionDefinition 接口中定義了五個表示隔離級別的常量:
- TransactionDefinition.ISOLATION_DEFAULT:這是默認值,表示使用底層數據庫的默認隔離級別。對大部分數據庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
- TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務可以讀取另一個事務修改但還沒有提交的數據。該級別不能防止臟讀,不可重復讀和幻讀,因此很少使用該隔離級別。比如PostgreSQL實際上並沒有此級別。
- TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務只能讀取另一個事務已經提交的數據。該級別可以防止臟讀,這也是大多數情況下的推薦值。
- TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務在整個過程中可以多次重復執行某個查詢,並且每次返回的記錄都相同。該級別可以防止臟讀和不可重復讀。
- TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。
4.2、事務傳播行為
所謂事務的傳播行為是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。在TransactionDefinition定義中包括了如下幾個表示傳播行為的常量:
- TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。這是默認值。
- TransactionDefinition.PROPAGATION_REQUIRES_NEW:創建一個新的事務,如果當前存在事務,則把當前事務掛起。
- TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。
- TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。
- TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
- TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價於TransactionDefinition.PROPAGATION_REQUIRED。
4.3、事務超時
所謂事務超時,就是指一個事務所允許執行的最長時間,如果超過該時間限制但事務還沒有完成,則自動回滾事務。在 TransactionDefinition 中以 int 的值來表示超時時間,其單位是秒。
默認設置為底層事務系統的超時值,如果底層數據庫事務系統沒有設置超時值,那么就是none,沒有超時限制。
4.4、事務只讀屬性
只讀事務用於客戶代碼只讀但不修改數據的情形,只讀事務用於特定情景下的優化,比如使用Hibernate的時候。
默認為讀寫事務。
七、mybatis相關
1、@Mapper
作用:在接口類上添加了@Mapper,在編譯之后會生成相應的接口實現類
添加位置:接口類上面
@Mapper public interface UserDAO { //代碼 }
如果想要每個接口都要變成實現類,那么需要在每個接口類上加上@Mapper注解,比較麻煩,解決這個問題用@MapperScan
2、@MapperScan
作用:指定要變成實現類的接口所在的包,然后包下面的所有接口在編譯之后都會生成相應的實現類
添加位置:是在Springboot啟動類上面添加
@SpringBootApplication @MapperScan("com.winter.dao") public class SpringbootMybatisDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringbootMybatisDemoApplication.class, args); } }
添加@MapperScan(“com.winter.dao”)注解以后,com.winter.dao包下面的接口類,在編譯之后都會生成相應的實現類。
2.1、使用@MapperScan注解多個包
(實際用的時候根據自己的包路徑進行修改)
@SpringBootApplication @MapperScan({"com.kfit.demo","com.kfit.user"}) public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
2.2、使用@MapperScan通配符掃描多個包
(沒驗證過,不確定能否使用,或許需要根據自己定義的包名進行修改路徑)
@SpringBootApplication @MapperScan({"com.kfit.*.mapper","org.kfit.*.mapper"}) public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
