一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - 淺談spring 常用注解

淺談spring 常用注解

2021-02-03 11:52Justnow_ JAVA教程

這篇文章主要介紹了淺談spring 常用注解,具有一定參考價值,需要的朋友可以了解下。

我們不妨先將spring常用的注解按照功能進行分類

1 、將普通類加入容器形成Bean的注解

日常開發中主要使用到的定義Bean的注解包括(XML方式配置bean暫不討論):

@Component、@Repository、@Service、@Controller、@Bean

其中@Component、@Repository、@Service、@Controller實質上屬于同一類注解,用法相同,功能相同,區別在于標識組件的類型。當一個組件代表數據訪問層(Dao)時,你可以給它加上@Repository注解,如下例:

?
1
2
3
4
5
6
7
8
9
@Repository
public class BiliAPIDaoImpl implements BiliAPIDao {
private final static Logger LOGGER = LoggerFactory.getLogger(BiliAPIDaoImpl.class);
 
private BiliAPIHttpClient asoAPIHttpClient;
public void execute(){
  //some logic business
 }
}

當組件用于業務層時,使用@Service注解,如下例:

?
1
2
3
4
5
6
7
8
9
10
@Service(value="SecUserService")
public class SecUsersServiceImpl implements SecUsersService {
 @Autowired
 private SecUsersDao secUsersDao;
 @Autowired
 private SecRoleUserService secRoleUserService;
 public void doBusiness(){
  //do some business
 }
 }

注意,在此處的@Service注解中額外添加了value=”SecUserService”的屬性,為何對此一舉呢?value屬性可以指定生成后Bean的名稱,這個名稱便成為容器中bean 的唯一標識符。同樣的,在@Component、@Repository、@Controller也均可以指定其value值,當然,是如有必要時加

當組件屬于控制層時,則使用@Controller注解;當組件不能進行很好地歸類時,那我們可以使用@Component注解。因使用方式均相同,故此處不再繼續貼代碼

在這幾個注解中,額外需要留意的是@Bean注解。不妨看代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Component
public class FactoryMethodComponent {
 
 private static int i;
 
 @Bean @Qualifier("public")
 public TestBean publicInstance() {
  return new TestBean("publicInstance");
 }
 
 // use of a custom qualifier and autowiring of method parameters
 
 @Bean
 protected TestBean protectedInstance(@Qualifier("public") TestBean spouse,
          @Value("#{privateInstance.age}") String country) {
  TestBean tb = new TestBean("protectedInstance", 1);
  tb.setSpouse(tb);
  tb.setCountry(country);
  return tb;
 }
 
 @Bean @Scope(BeanDefinition.SCOPE_SINGLETON)
 private TestBean privateInstance() {
  return new TestBean("privateInstance", i++);
 }
 
 @Bean @Scope(value = WebApplicationContext.SCOPE_SESSION,
    proxyMode = ScopedProxyMode.TARGET_CLASS)
 public TestBean requestScopedInstance() {
  return new TestBean("requestScopedInstance", 3);
 }
}

Bean注解主要用于方法上,有點類似于工廠方法,當使用了@Bean注解,我們可以連續使用多種定義bean時用到的注解,譬如用@Qualifier注解定義工廠方法的名稱,用@Scope注解定義該bean的作用域范圍,譬如是singleton還是prototype等。

此處還得另外提一個注解: @Configuration.實際上,上面談到的@Bean注解更多時候是與@Configuration注解在一起使用的。如果將一個類標注為@Configuration注解,那么也就意味著這個class將會作為創建各種bean的工廠(類似于一個新的容器)。最簡單的配合使用示例如下:

?
1
2
3
4
5
6
7
@Configuration
public class AppConfig {
 @Bean
 public MyService myService() {
  return new MyServiceImpl();
 }
}

以上的代碼實際上等價于Xml中的配置:

?
1
2
3
<beans>
 <bean class="com.acme.services.MyServiceImpl" id="myService">
</bean></beans>

我們還需要注意的一點,在Spring的@Component注解中使用@Bean與在Spring中的@Configuration使用是一定的差別的。在使用@Component的類中不會強制使用CGLIB代理攔截方法和屬性。而在@Configuration類中,則會使用CGLIB代理去調用@Bean標注的方法并返回對象的引用。在@Configuration注解中使用@Bean也可以防止同一個@Bean方法被意外調用多次時而產生細微的難以排查的錯誤

2、從容器中取Bean(裝配bean)時常用的注解

開發中最常用到的用于裝配的注解是:@Autowired和@Resource

@Autowired注解:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MovieRecommender {
 
 @Autowired
 private MovieCatalog movieCatalog;
 
 private CustomerPreferenceDao customerPreferenceDao;
 
 @Autowired
 public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
  this.customerPreferenceDao = customerPreferenceDao;
 }
 
 // ...
}

@Autowired注解可用于為類的屬性、構造器、方法進行注值。默認情況下,其依賴的對象必須存在(bean可用),如果需要改變這種默認方式,可以設置其required屬性為false。另外一個比較重要的點就是,@Autowired注解默認按照類型裝配,如果容器中包含多個同一類型的Bean,那么啟動容器時會報找不到指定類型bean的異常,解決辦法是結合@Qualified注解進行限定,指定注入的bean名稱

@Resource注解
對于@Resource注解,它并不屬于spring的注解,而是來自于JSR-250。其默認情況下按照bean的名稱進行注入,當找不到匹配項時會按照類型裝配。當按照名稱進行裝配時,可以指定其name屬性,倘若沒有指定,注解標注在哪個字段上,其默認名稱就是那個字段的名稱。當然,@Resource注解也支持按指定類型進行裝配,給它的type屬性賦特定類型的值即可(注意,當指定了name屬性后,只能按照名稱裝配)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class SpringAnotationDemo {
 
 @Bean
 @Qualifier("httpApiClient")
 public HttpApiClient createHttpClient() {
  return new HttpApiClient();
 }
 
 @Resource(name = "httpApiClient")
 private HttpApiClient httpApiClient;
 @Resource(type = XQSmsHttpClient.class)
 private SmsHttpClient smsHttpClient;
}

依我個人理解,其實@Resource要比@Autowired好用得多,@Resource注解的使用性更為靈活,可指定名稱,也可以指定類型 ,而用@Autowired注解進行裝配容易拋出異常,特別是裝配的bean類型有多個的時候,而解決的辦法是需要在增加@Qualitied進行限定

vc模塊注解">3、spring MVC模塊注解
web模塊常用到的注解包括:

@Controller、@RequestMapping、@RequestParam、@PathVariable

@Controller
將一個類加上@Controller注解后,表明該類會作為與前端作交互的控制層組件

?
1
2
3
4
5
@Controller
public class CompanyController {
/**this class will be the controller component of container**/
...
}

@RequestMapping
這個注解用于將url映射到整個處理類或者特定的處理請求的方法

?
1
2
3
4
5
6
7
8
@Controller
@RequestMapping("/company")
public class CompanyController {
 
 @Autowired
 private CompanyService companyService;
...
}

如上例,當標注在class上時,表明此類會接收url為”/company”請求

@RequestParam
用于綁定request請求參數到指定的方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Controller
@RequestMapping("/company")
public class CompanyController {
 
 @Autowired
 private CompanyService companyService;
 
 @RequestMapping("/companyList")
 public String listCompanies(Map<string, object=""> map,
    @RequestParam(value = "data", required = false) String data,
    @RequestParam(value = "phone_num", required = true) String phoneNum) {
 map.put("data", data);
 map.put("phoneNum", phoneNum);
 return "companyList";
 }
...
}

譬如上例中,@RequestParam請求參數指定了傳入參數的具體字段名(value指定的),以及是否必須傳的字段(默認情況下,required=true)。data,phoneNum為形參,即請求參數的使用名,可以更改

@PathVariable
該注解用于方法修飾方法參數,會將修飾的方法參數變為可供使用的uri變量(可用于動態綁定),請看如下栗子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Controller
@RequestMapping("/company")
public class CompanyController {
 
 @Autowired
 private CompanyService companyService;
 
 @RequestMapping("{companyName}")
 public String getCompany(Map<string, object=""> map,
   @PathVariable String companyName) {
 Company company = companyService.findByName(companyName);
 map.put("company", company);
 return "company";
 }
...
}

當我們請求 “/compony/account”時,componyName會動態地綁定為”account”

4、事務模塊注解@Transactional

在處理dao層或service層的事務操作時,譬如刪除失敗時的回滾操作,可用到@Transactional注解,如下例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@Service
public class CompanyServiceImpl implements CompanyService {
 @Autowired
 private CompanyDAO companyDAO;
 
 @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
 public int deleteByName(String name) {
 
 int result = companyDAO.deleteByName(name);
 return company;
 }
 ...
}

上例表明,執行deleteByName方法時,啟用了事務處理,事務的各屬性含義如下:

propagation
事務的傳播行為,spring在TransactionDefinition接口中規定了7種類型的事務傳播行為,它們規定了事務方法和事務方法發生嵌套調用時如何進行傳播:

 

事務傳播行為類型 描述
PROPAGATION_REQUIRED 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
PROPAGATION_SUPPORTS 支持當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY 使用當前的事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW 新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER 以非事務方式執行,如果當前存在事務,則拋出異常
PROPAGATION_NESTED 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類 似的操作

 

注:第一種是最常用的,默認的

readOnly
事務的讀寫屬性,取true或者false,true為只讀、默認為false rollbackFor
回滾策略,當遇到指定異常時回滾。譬如上例遇到異常就回滾 timeout (補充的)
設置超時時間,單位為秒 isolation
設置事務隔離級別,枚舉類型,一共五種

 

類型 描述
DEFAULT 采用數據庫默認隔離級別
READ_UNCOMMITTED 讀未提交的數據(會出現臟讀取)
READ_COMMITTED 讀已提交的數據(會出現幻讀,即前后兩次讀的不一樣)
REPEATABLE_READ 可重復讀,會出現幻讀
SERIALIZABLE 串行化(對資源消耗較大,一般不使用)

 

5、 Spring AOP模塊注解
spring aop模塊的注解主要有@Aspect、@Pointcut、@Before、@Around、@After、
@AfterReturning、@AfterThrowing

@Aspect
標明該類為切面類,并啟用AspectJ注解,注:在使用時要同@Component一起使用,否則不會被掃描到加入容器

@Pointcut
定義切入點,關于切入點表達式書寫方式,請移步官方文檔:spring AOP文檔

@Around
定義環繞通知,在目標方法執行前后嵌入相關業務邏輯

@Before
定義前置通知,在目標方法執行前執行

@After
定義后置通知,在目標方法執行后執行,不論是目標方法執行正常后退出,還是拋出異常后退出,均會被執行

@AfterReturning
目標方法執行正常退出后執行 @AfterThrowing
目標方法執行拋出異常后執行

總結

以上就是本文關于淺談spring 常用注解的全部內容,希望對大家有所幫助。有什么問題可以隨時留言,小編會及時回復大家的。感謝朋友們對本站的支持!

原文鏈接:https://www.2cto.com/kf/201609/546408.html

延伸 · 閱讀

精彩推薦
  • JAVA教程Java 8 lambda表達式引入詳解及實例

    Java 8 lambda表達式引入詳解及實例

    這篇文章主要介紹了Java 8 lambda表達式引入詳解及實例的相關資料,需要的朋友可以參考下 ...

    蹭飯熊5062020-11-01
  • JAVA教程快速排序的原理及java代碼實現

    快速排序的原理及java代碼實現

    網上關于快速排序的算法原理和算法實現都比較多,不過java是實現并不多,而且部分實現很難理解,和思路有點不搭調。所以整理了這篇文章。如果有不妥...

    hebedich1622020-03-26
  • JAVA教程spring配置掃描多個包問題解析

    spring配置掃描多個包問題解析

    這篇文章主要介紹了spring配置掃描多個包問題解析,具有一定參考價值,需要的朋友可以了解下。...

    微wx笑6662021-01-28
  • JAVA教程Java之遞歸求和的兩種簡單方法(推薦)

    Java之遞歸求和的兩種簡單方法(推薦)

    下面小編就為大家帶來一篇Java之遞歸求和的兩種簡單方法(推薦)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    yigese4322020-06-16
  • JAVA教程淺談Java后臺對JSON格式的處理操作

    淺談Java后臺對JSON格式的處理操作

    下面小編就為大家帶來一篇淺談Java后臺對JSON格式的處理操作。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 ...

    jingxian3852020-05-09
  • JAVA教程java實現五子棋小游戲

    java實現五子棋小游戲

    這篇文章主要介紹了java實現五子棋小游戲的相關資料,十分簡單實用,推薦給大家,需要的朋友可以參考下 ...

    hebedich1582019-12-14
  • JAVA教程jar包雙擊執行程序的方法

    jar包雙擊執行程序的方法

    這篇文章主要介紹了jar包雙擊執行程序的方法,可實現雙擊jar包直接執行Java程序的功能,具有一定的參考借鑒價值,需要的朋友可以參考下 ...

    shichen20146562019-12-07
  • JAVA教程java小數位的例子

    java小數位的例子

    在java中要保留數字小數位我們有常用的四種方法,分別為:四舍五入,DecimalFormat,format,String .format與struts標簽操作實現,下面給出例子 ...

    java教程網4082019-10-20
主站蜘蛛池模板: 国产精品天天看特色大片不卡 | 2023最新伦理片 | 精品无人区一区二区三区 | 国产成人综合亚洲一区 | 国产一区二区免费视频 | 风间由美在线 | 日韩欧美国产免费看清风阁 | 免费一级欧美大片在线观看 | 国产欧美一区二区成人影院 | 97操| 大奶喷水 | 久久综久久美利坚合众国 | 国产亚洲精品九九久在线观看 | 好男人资源免费观看 | 久久九九有精品国产23百花影院 | 风间由美在线播放 | 6个老师的尿奴 | 亚洲欧美日韩另类在线 | 日本理论片中文在线观看2828 | 91精品乱码一区二区三区 | 国产精品久久久精品日日 | 扒开放荡老师裙子猛烈的进入 | 2020最新版的ab片 | 桃色导航 | 成人免费淫片95视频观看网站 | 欧美人禽杂交狂配无删完整 | 国产午夜精品理论片 | 成人欧美一区二区三区白人 | 麻豆网站视频国产在线观看 | 91亚洲精品国产自在现线 | 亚洲精品国产一区二区三区在 | 国产真实乱子伦xxxxchina | 皇上撞着太子妃的秘密小说 | 日本破处 | 乌克兰一级毛片 | 香蕉久久综合 | 九九精品国产 | 美女逼逼软件 | 国产精品视频免费观看 | 色综合久久六月婷婷中文字幕 | 阿v天堂2020 α片免费 |