1、Spring Bean類(lèi)的注解
1.1 @Component
通用的注解,可標(biāo)注任意類(lèi)為 Spring 組件。如果一個(gè) Bean 不知道屬于哪個(gè)層,可以使用@Component 注解標(biāo)注。
1.2 @Repository
對(duì)應(yīng)持久層即 Dao 層,主要用于數(shù)據(jù)庫(kù)相關(guān)操作。
1.3 @Service
對(duì)應(yīng)服務(wù)層,主要涉及一些復(fù)雜的邏輯,需要用到 Dao 層。
1.4 @Controller
對(duì)應(yīng) Spring MVC 控制層,主要用戶(hù)接受用戶(hù)請(qǐng)求并調(diào)用 Service 層返回?cái)?shù)據(jù)給前端頁(yè)面。
1.5@RestController
@RestController = @Controller + @ResponseBody
寫(xiě)這一個(gè)注解就相當(dāng)于寫(xiě)了后面的兩個(gè)注解,在返回值是json串的非常方便,但同時(shí)也會(huì)有一個(gè)問(wèn)題,加了這個(gè)注解就不能返回jsp或者h(yuǎn)tml頁(yè)面,這時(shí)可以通過(guò)返回視圖數(shù)據(jù)的方式來(lái)返回頁(yè)面。
ModelAndView mv = new ModelAndView("index");
return mv;
1.6 @Configuration
一般用來(lái)聲明配置類(lèi)。
指示一個(gè)類(lèi)聲明一個(gè)或多個(gè)@Bean方法,并且可以由Spring容器處理,以便在運(yùn)行時(shí)為這些bean生成BeanDefinition和服務(wù)請(qǐng)求。
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
// instantiate, configure and return bean ...
}
}
注意:
1.@Configuration不可以是final類(lèi)型;
2.@Configuration不可以是匿名類(lèi);
3.嵌套的configuration必須是靜態(tài)類(lèi)。
2、注入數(shù)據(jù)注解
2.1 @Autowired
自動(dòng)按照類(lèi)型注入,只要容器中有唯一一個(gè) bean 對(duì)象類(lèi)型和要注入的變量類(lèi)型匹配,就可以注入成功。
如果有多個(gè)類(lèi)型匹配,先匹配類(lèi)型,然后根據(jù)變量名稱(chēng)去對(duì)應(yīng),如果變量名稱(chēng)和 bean 名稱(chēng)相同,就注入。
2.2 @Resource
byName就是變量名去匹配bean的id屬性,而byType則是變量類(lèi)型去匹配bean的class屬性。
<bean id="userService" class="com.test.UserServiceImpl">
</bean>
@Autowired和@Resource的區(qū)別:
- @Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的;
- @Autowird注解默認(rèn)通過(guò)byType方式注入,而@Resource注解默認(rèn)通過(guò)byName方式注入;
- @Autowired注解注入的對(duì)象需要在IOC容器中存在,否則需要加上屬性required=false,表示忽略當(dāng) 前要注入的bean,如果有直接注入,沒(méi)有跳過(guò),不會(huì)報(bào)錯(cuò)。
2.3 @Value
用于注入基本類(lèi)型和 String 類(lèi)型的數(shù)據(jù)。
3、請(qǐng)求常用注解
3.1 @RequestMapping
它用于映射客戶(hù)端的訪問(wèn)地址,可以被應(yīng)用于類(lèi)和方法上面。
可以指定請(qǐng)求的類(lèi)型get,post,put,delete
@Controller
@RequestMapping("/index")
public class HelloWorldController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return "/WEB-INF/views/success.jsp";
}
@RequestMapping(value = "/world", method = RequestMethod.POST)
public String world() {
return "/WEB-INF/views/success.jsp";
}
}
@RequestMapping 還可以將多個(gè)請(qǐng)求映射到一個(gè)方法上,只需要給 value 來(lái)指定一個(gè)包含多個(gè)路徑的列表。
@Controller
@RequestMapping("/index")
public class HelloWorldController {
@RequestMapping(value = {"/hello", "/world", "/helloworld"})
public String hello() {
return "/WEB-INF/views/success.jsp";
}
}
3.2 @GetMapping
等價(jià)于@RequestMapping(value="",method=RequestMethod.GET)
3.3 @PostMapping
等價(jià)于@RequestMapping(value="",method=RequestMethod.POST)
3.4 @PutMapping(value="/users/{userId}")
等價(jià)于@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)
3.5 @DeleteMapping("/users/{userId}")
等價(jià)于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)
4、前后端傳值
4.1 @PathVariable
用于獲取路徑參數(shù),通過(guò) @PathVariable 可以將 URL 中占位符參數(shù)綁定到控制器處理方法的入?yún)⒅小?/p>
RequestMapping("user/get/mac/{macAddress}")
public String getByMacAddress(@PathVariable String macAddress){
//can do something;
}
4.2 @RequestParam
用于controller層,是Spring的注解,用于獲取查詢(xún)參數(shù),解決前臺(tái)參數(shù)名稱(chēng)與后臺(tái)接收參數(shù)變量名稱(chēng)不一致的問(wèn)題。
public String login(@RequestParam(value = "username") final String username,
@RequestParam(value = "password",required = false) final String password,
@RequestParam(value = "valcode",required = false) final String valcode) {
}
- value:參數(shù)名字,即入?yún)⒌恼?qǐng)求參數(shù)名字,如username表示請(qǐng)求的參數(shù)區(qū)中的name為username的參數(shù)的值將傳入;
- required:是否必須,默認(rèn)是true,表示請(qǐng)求中一定要有相應(yīng)的參數(shù),否則將報(bào)404錯(cuò)誤碼;
- defaultValue:默認(rèn)值,表示如果請(qǐng)求中沒(méi)有同名參數(shù)時(shí)的默認(rèn)值,默認(rèn)值可以是SpEL表達(dá)式,如“#{systemProperties['java.vm.version']}”。
4.3 @Param
用于dao層,是mybatis中的注解。
使得mapper.xml中的參數(shù)與后臺(tái)的參數(shù)對(duì)應(yīng)上,也增強(qiáng)了可讀性。
如果兩者參數(shù)名一致得話(huà),spring會(huì)自動(dòng)進(jìn)行封裝,不一致的時(shí)候就需要手動(dòng)去使其對(duì)應(yīng)上。 即:用注解來(lái)簡(jiǎn)化xml配置的時(shí)候,@Param注解的作用是給參數(shù)命名,參數(shù)命名后就能根據(jù)名字得到參數(shù)值,正確的將參數(shù)傳入sql語(yǔ)句中 。
List<Employee> getAllEmployeeByPage(@Param("page") Integer page,
@Param("size") Integer size);
5、表相關(guān)注解
5.1 @Entity
聲明一個(gè)類(lèi)對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)實(shí)體。
@Entity說(shuō)明這個(gè)class是實(shí)體類(lèi),并且使用默認(rèn)的orm規(guī)則,即class名就是數(shù)據(jù)庫(kù)表中表明,class字段名即表中字段名。@Entity注解指明這是一個(gè)實(shí)體Bean。在項(xiàng)目啟動(dòng)時(shí)會(huì)根據(jù)該類(lèi)自動(dòng)生成一張表,表的名稱(chēng)即@Entity注解中name的值,如果不配置name,默認(rèn)表明為類(lèi)名所有的實(shí)體類(lèi)都要有主鍵,@Id注解表示該屬性是一個(gè)主鍵,@GeneratedValue注解表示注解自動(dòng)生成,strategy則表示主鍵的生成策略。
@Data
@Entity(name = "t_book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "book_name")
private String name;
@Column(name = "book_author")
private String author;
private Float price;
@Transient
private String description;
}
5.2 @Table
@Table注解默認(rèn)情況下只會(huì)完成表和實(shí)體之間的映射,聲明才對(duì)象映射到數(shù)據(jù)庫(kù)的數(shù)據(jù)表,通過(guò)它可以為實(shí)體指定表(table)。
常用屬性:name 指定表 @Table(name = "book")
@Data
@Table(name="book")
public class Book{
@Id
private Integer id;
@Column(name="book_name")
private String name;
...
}
5.3 @Id
聲明一個(gè)字段為主鍵。所有的實(shí)體類(lèi)都要有主鍵,@Id注解表示該屬性是一個(gè)主鍵。
5.4 @Column
聲明字段,可以設(shè)置字段的屬性,字段名、是否為空。
生成的表中字段的名稱(chēng)就是實(shí)體類(lèi)中屬性的名稱(chēng),通過(guò)@Column注解可以定制生成的字段屬性,name表示該屬性對(duì)應(yīng)的數(shù)據(jù)表中字段的名稱(chēng),nullable表示該字段非空。
5.5 @Transient
聲明不需要與數(shù)據(jù)庫(kù)映射的字段,在保存的時(shí)候不需要保存進(jìn)數(shù)據(jù)庫(kù)。
@Transient注解表示在生成數(shù)據(jù)庫(kù)中的表時(shí),該屬性被忽略,即不生成對(duì)應(yīng)的字段。
6、事務(wù)注解@Transactional
@Transactional(rollbackFor = Exception.class) //這里回滾進(jìn)行定義
public int update(Prdtv prdtv) throws RuntimeException{
//注意在這里處理業(yè)務(wù)時(shí),不要使用Try ...異常捕獲,否則不回滾
return prdtvMapper.update(prdtv);
}
@Transactional:事務(wù)注解,注解一般用在可以作用在類(lèi)或者方法上
1.類(lèi)上,表明類(lèi)中所有 public 方法都啟用事務(wù) 2.方法上,最常用的一種 3.接口上,不推薦使用
@Transactional注解只能在拋出RuntimeException或者Error時(shí)才會(huì)觸發(fā)事務(wù)的回滾,常見(jiàn)的非RuntimeException是不會(huì)觸發(fā)事務(wù)的回滾的。但是我們平時(shí)做業(yè)務(wù)處理時(shí),需要捕獲異常,所以可以手動(dòng)拋出RuntimeException異?;蛘咛砑觬ollbackFor = Exception.class(也可以指定相應(yīng)異常)
事務(wù)的隔離級(jí)別:是指若干個(gè)并發(fā)的事務(wù)之間的隔離程度
1. @Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交數(shù)據(jù)(會(huì)出現(xiàn)臟讀,
不可重復(fù)讀) 基本不使用
2. @Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交數(shù)據(jù)(會(huì)出現(xiàn)不可重復(fù)讀和幻讀)
3. @Transactional(isolation = Isolation.REPEATABLE_READ):可重復(fù)讀(會(huì)出現(xiàn)幻讀)
4. @Transactional(isolation = Isolation.SERIALIZABLE):串行化
7、AOP注解
7.1 @After 在方法執(zhí)行之后執(zhí)行(方法上)
@After("pt()")
public void after(){
}
7.2 @Before 在方法執(zhí)行之前執(zhí)行(方法上)
@Before("pt()")
public void before(){
}
7.3 @Around 在方法執(zhí)行之前與之后執(zhí)行(方法上)
@Around("pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object ret = pjp.proceed();
return ret;
}
7.4 @AfterReturning當(dāng)前方法作為返回后通知
@AfterReturning(value="pt()",returning = "ret")
public void afterReturning(Object ret) {
}
7.5 @AfterThrowing當(dāng)前方法作為異常后通知
@AfterThrowing(value="pt()",throwing = "t")
public void afterThrowing(Throwable t){
}
@Aspect:聲明一個(gè)切面
@PointCut:聲明切點(diǎn)
@EnableAspectJAutoProxy:開(kāi)啟Spring對(duì)AspectJ代理的支持
8、Lombok
8.1 @Setter
注解在屬性上。為屬性提供 setting 方法。
8.2 @Getter
注解在屬性上。為屬性[歡迎轉(zhuǎn)載聽(tīng)雨的人博客]提供 getting 方法。
8.3 @Data
注解在類(lèi)上。等同于添加如下注解: @Getter/@Setter生成get,set方法 @ToString 生成toString方法 @EqualsAndHashCode 生成equals和hashcode方法 @RequiredArgsConstructor 生成一個(gè)指定名稱(chēng)的靜態(tài)方法
public class Programmer{
@Getter
@Setter
private String name;
@Setter(AccessLevel.PROTECTED)
private int age;
@Getter(AccessLevel.PUBLIC)
private String language;
}
相當(dāng)于:
public class Programmer{
private String name;
private int age;
private String language;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
protected void setAge(int age){
this.age = age;
}
public String getLanguage(){
return language;
}
}
9、MyBatis中常用注解
9.1 @Insert(sql語(yǔ)句):實(shí)現(xiàn)新增
public interface UserDAO{
@Options(useGeneratedKeys = true,keyColumn = "uid", keyProperty = "id")
@Insert("insert into t_user(username,password,gender,birth) values(#{username},#{password},#{gender},#{birth})")
public void insertUser(User user);
}
- 設(shè)置@Options屬性u(píng)serGeneratedKeys的值為true,并指定實(shí)例對(duì)象中主鍵的屬性名keyProperty=“id”,以及在數(shù)據(jù)庫(kù)中的字段名keyColumn=“uid”。這樣在user插入數(shù)據(jù)后,userId屬性會(huì)被自動(dòng)賦值
9.2 @Update(sql語(yǔ)句):實(shí)現(xiàn)更新
public interface UserDAO{
@Update("update t_user set username=#{usernmae},password=#{password}")
public void updateUser(User user);
}
9.3 @Delete(sql語(yǔ)句):實(shí)現(xiàn)刪除
public interface UserDAO{
@Delete("delete from t_user where id = #{id}")
public void deleteUserById(@Param("id") int id);
}
9.4 @Select(sql語(yǔ)句):實(shí)現(xiàn)查詢(xún)
public interface UserDAO{
@Select("select * from t_user where id = #{id} and username = {#username}")
public User queryUserbyId(@Param("id") int id,@Param("username") String username);
}
其他MyBatis注解:
@Result(property="實(shí)體類(lèi)屬性的名稱(chēng)",jdbcType=數(shù)據(jù)庫(kù)字段類(lèi)型):實(shí)現(xiàn)結(jié)果集封裝
@Results(column="數(shù)據(jù)庫(kù)字段名",porperty="實(shí)體類(lèi)屬性名",jdbcType="數(shù)據(jù)庫(kù)字段數(shù)據(jù)類(lèi)型"):封裝多個(gè)結(jié)果集(當(dāng)數(shù)據(jù)庫(kù)字段名與實(shí)體類(lèi)對(duì)應(yīng)的屬性名不一致時(shí),可以使用@Results映射來(lái)將其對(duì)應(yīng)起來(lái))
@ResultMap(@Results的id值):實(shí)現(xiàn)引用@Results 定義的封裝
@One:實(shí)現(xiàn)一對(duì)一結(jié)果集封裝
@Many:實(shí)現(xiàn)一對(duì)多結(jié)果集封裝
@CacheNamespace:實(shí)現(xiàn)注解二級(jí)緩存的使用
10、其他
1.@Scope注解默認(rèn)的singleton單例模式。
@Scope注解是springIoc容器中的一個(gè)作用域,在 Spring IoC 容器中具有以下幾種作用域:基本作用域singleton(單例)、prototype(多例),Web 作用域(reqeust、session、globalsession),自定義作用域。
2.Enable注解說(shuō)明*
@EnableAsync: 開(kāi)啟異步方法的支持。
@EnableScheduling: 開(kāi)啟計(jì)劃任務(wù)的支持。
@EnableAspectAutoProxy:開(kāi)啟對(duì)AspectJ自動(dòng)代理的支持
@EnableAsync:開(kāi)啟異步方法的支持
@EnableScheduling:開(kāi)啟計(jì)劃任務(wù)的支持
@EnableWebMvc:開(kāi)啟web MVC的配置支持
@EnableConfigurationProperties:開(kāi)啟對(duì)@ConfigurationProperties注解配置Bean的支持
@EnableJpaRepositories:開(kāi)啟對(duì)SpringData JPA Repository的支持
@EnableTransactionManagement:開(kāi)啟注解式事務(wù)的支持文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-790949.html
@EnableCaching:開(kāi)啟注解式的緩存支持文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-790949.html
到了這里,關(guān)于Java的一些常用注解及其作用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!