亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

淺談spring 常用注解

2024-07-13 10:14:08
字體:
來源:轉載
供稿:網友

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

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

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

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

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

@Repositorypublic class BiliAPIDaoImpl implements BiliAPIDao {private final static Logger LOGGER = LoggerFactory.getLogger(BiliAPIDaoImpl.class); private BiliAPIHttpClient asoAPIHttpClient;public void execute(){  //some logic business }}

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

@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注解。不妨看代碼:

@Componentpublic 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的工廠(類似于一個新的容器)。最簡單的配合使用示例如下:

@Configurationpublic class AppConfig { @Bean public MyService myService() {  return new MyServiceImpl(); }}

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

<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注解:

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屬性后,只能按照名稱裝配)

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注解后,表明該類會作為與前端作交互的控制層組件

@Controllerpublic class CompanyController {/**this class will be the controller component of container**/...}

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

@Controller@RequestMapping("/company")public class CompanyController {  @Autowired private CompanyService companyService;...}

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

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

@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變量(可用于動態綁定),請看如下栗子:

@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注解,如下例:

@Servicepublic 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 讀未提交的數據(會出現臟讀?。?/td>
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 常用注解的全部內容,希望對大家有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美激情另类校园| 欧美日韩国产综合视频在线观看中文| 97精品一区二区视频在线观看| 91精品国产网站| 91色在线视频| 欧美激情一级精品国产| 欧美大片网站在线观看| 日韩久久免费视频| 97香蕉久久夜色精品国产| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久久久久久久电影| 国产一区二区欧美日韩| 久久精品亚洲94久久精品| 久久综合久久美利坚合众国| 国产视频精品一区二区三区| 国产亚洲精品美女久久久| 国产精品免费一区豆花| 日韩精品亚洲精品| 自拍偷拍亚洲区| 久久精品一区中文字幕| 欧美第一淫aaasss性| 国产精品18久久久久久首页狼| 成人夜晚看av| 亚洲美女性视频| 一本色道久久综合狠狠躁篇的优点| 亚洲综合日韩在线| 欧美日韩国产专区| 国产精品久久久久999| 久久国产精品首页| 久久在线观看视频| 国内精品久久久久| 国产亚洲aⅴaaaaaa毛片| 色综合导航网站| 成人日韩在线电影| 欧美一级淫片videoshd| 日韩精品视频中文在线观看| 国产精品成熟老女人| 国产999精品| 日韩成人免费视频| 91在线观看免费观看| 国产精品国产自产拍高清av水多| 成人免费黄色网| 88xx成人精品| 国语对白做受69| 欧美日韩中文字幕日韩欧美| 日韩美女视频免费看| 伊人久久综合97精品| 精品久久久久久久久中文字幕| 欧美野外猛男的大粗鳮| 国产亚洲精品久久| 国产精品久久一区主播| 91地址最新发布| 亚洲欧美日韩精品久久| 午夜精品久久久久久久久久久久久| 国产精品视频色| 亚洲电影在线观看| 午夜精品久久久久久久99热| 国产精品一区二区三区成人| 精品动漫一区二区| 亚洲第一国产精品| 国内精品久久久久久久久| 亚洲精品久久视频| 国产99久久精品一区二区永久免费| 成人黄色在线免费| 在线国产精品播放| 精品无人区乱码1区2区3区在线| 中国china体内裑精亚洲片| 疯狂做受xxxx欧美肥白少妇| 国产精品久久久久久亚洲影视| 亚洲成人aaa| 91深夜福利视频| 欧美成人手机在线| 日韩中文字幕国产精品| 久久精品这里热有精品| 亚洲成人激情小说| 最近2019中文免费高清视频观看www99| 亚洲国产天堂久久综合网| 午夜精品久久久久久99热软件| 精品国产31久久久久久| 国产精品人成电影| 97视频在线观看播放| 91日本在线观看| 国产成人精品在线播放| 亚洲福利视频免费观看| 久久精品久久久久| 国产一区二区日韩精品欧美精品| 久久69精品久久久久久国产越南| 亚洲欧美自拍一区| 久久久亚洲网站| 黄网动漫久久久| 久久久精品免费视频| 国产精品成人aaaaa网站| 亚洲人在线观看| 91精品在线影院| 97在线视频免费看| 欧美一级大片在线观看| 国产美女扒开尿口久久久| 亚洲加勒比久久88色综合| 国产欧美在线播放| 97超级碰碰人国产在线观看| 精品色蜜蜜精品视频在线观看| 欧美夫妻性生活xx| 欧美电影免费观看网站| 91精品国产高清久久久久久久久| 亚洲天堂视频在线观看| 国产精品老牛影院在线观看| 欧美大荫蒂xxx| 中文字幕成人精品久久不卡| 精品久久久久久亚洲精品| 日韩国产精品视频| 成人国产精品日本在线| 日本精品视频在线| 国产精品久久久久久久久免费| 国产一区玩具在线观看| 97成人在线视频| 91av在线免费观看| 色偷偷91综合久久噜噜| 欧美日韩国产91| 永久555www成人免费| 欧美性videos高清精品| 久久久久久伊人| 538国产精品视频一区二区| 国产成人拍精品视频午夜网站| 国产精品三级美女白浆呻吟| 午夜剧场成人观在线视频免费观看| 最近2019年好看中文字幕视频| 国内免费精品永久在线视频| 日本欧美中文字幕| 国产亚洲精品美女久久久| 国产亚洲精品久久| 欧美高清视频一区二区| 丰满岳妇乱一区二区三区| 精品久久中文字幕| 日韩精品福利在线| 91日本视频在线| 欧美激情videoshd| 91po在线观看91精品国产性色| 欧美尺度大的性做爰视频| 国产精品一区二区电影| 成人午夜在线影院| 中文字幕av一区| 欧美裸身视频免费观看| 中文字幕在线亚洲| 国产精品h在线观看| 91人成网站www| 最近2019中文字幕大全第二页| 91网站在线免费观看| 国产成人精品日本亚洲| 欧美天天综合色影久久精品| 91国产视频在线播放| 欧美激情高清视频| 国产精品ⅴa在线观看h| 在线视频亚洲欧美| 欧美韩国理论所午夜片917电影| 欧美电影免费观看高清| 国产成人精品视频在线观看| 国产精品一区二区av影院萌芽| 国产精品久久久久久中文字| 精品国产1区2区| 日韩精品视频免费专区在线播放| 亚洲欧美激情一区| 欧美亚洲免费电影| 91中文在线视频| 久久久久五月天|