Java?Spring框架的注解式開發(fā)你了解嗎
1. Spring框架的注解式開發(fā)
# Spring框架的注解式(Annotation)開發(fā) 1. 注解式開發(fā) 定義:通過Spring框架提供的一系列注解來完成項目中快速開發(fā) 注解:Annotation是java中一種特殊的類 類似于interface 使用時:@注解類名(屬性=參數(shù)) @Param(Mybatis中做參數(shù)綁定的注解) 注意:Spring框架提供的這些注解日后僅僅能在和Spring去做一系列項目的時候去用,這是Spring框架為我們提供的。 為什么Spring框架要提供這么一套注解去幫助我們呢,原因是現(xiàn)有的開發(fā)方式中開發(fā)效率很低下,隨著組件的增多, 比如UserService、UserAction...大家會發(fā)現(xiàn)在做現(xiàn)有的配置文件進行開發(fā)時,每寫一個業(yè)務層,就需要在spring.xml 文件中通過bean標簽去注冊,有的時候忘了在工廠中注冊的時候,用的時候還會產(chǎn)生空指針異常問題。所以Spring框架為了讓大家 專注于業(yè)務邏輯處理,不想每次開發(fā)一個組件時還要去寫一個配置,每次開發(fā)一個組件時還需要寫一個配置這樣是不是影響了開發(fā) 效率啊。所以Spring框架就想了,能不能為程序員提供一種便利呢,這種便利就是日后不需要它再做配置就完成工廠創(chuàng)建、注入 相關的一些操作,怎么去做呢。所以在Spring中它給我們提供了一系列的相關注解幫助我們?nèi)プ隹焖匍_發(fā)。 2. spring中的注解 前置條件:必須在工廠配置文件中完成注解的掃描 <!--下面這個標簽就是用來做注解掃描的 base-package:指定掃描哪些包的注解--> <context:component-scan base-package="com.baizhi"> 在用注解的時候能讓spring框架去看到這些注解或者說去掃描到這些注解, 那spring框架怎么去讀呢,spring有一個spring.xml這樣的一個配置文 件,是不是得讓加載這個配置時要通過這個配置文件掃描到注解啊。 1). 創(chuàng)建對象相關注解 @Component注解 通用組件創(chuàng)建注解 父類注解 作用:用來負責對象的創(chuàng)建 ==========> 簡化<bean class="" id=""> 修飾范圍:只能用在類上 注意:默認使用這個注解在工廠中創(chuàng)建的對象的唯一標識為 類名首字母小寫 UserDAOImpl ===> userDAOImpl value屬性的作用:用來指定創(chuàng)建的對象在工廠中的唯一標識 推薦:存在接口則名字設置為接口首字母小寫 不存在使用默認 @Component("userDAO") 等價于 @Component(value = "userDAO") 子類注解:沿用了父類注解的一切特性,也就是說下面三個注解也能用來創(chuàng)建對象 @Repository 作用:一般用來創(chuàng)建DAO中組件的注解 @Service 作用:一般用來創(chuàng)建Service中組件的注解 @Controller 作用:一般用來創(chuàng)建Action中組件的注解 2). 控制對象在工廠中創(chuàng)建次數(shù) 默認工廠單例創(chuàng)建 a. 配置文件修改 <bean class="" id="" scope="singleton|prototype"> b. 注解如何控制 @Scope 作用: 用來指定對象的創(chuàng)建次數(shù)默認單例 修飾范圍:只能加在類上 value屬性:singleton 單例 默認|prototype 多例 @Scope("prototype") =====> 等價于 @Scope(value = "prototype") @Scope("singleton") =====> 等價于 @Scope(value = "singleton")默認是單例,如果想設置為單例,可以不寫 注意:在管理structs的action時必須加入@Scope注解值必須為prototype 3). 屬性注入的相關注解 下面兩個都能用 a. spring框架提供的 @Autowired :注意 默認根據(jù)類型進行注入 推薦 b. javaEE本身就有的 @Resource :注意 默認根據(jù)名字注入,名稱找不到時自動根據(jù)類型進行注入 修飾范圍:用在類中的成員變量或者是用在類中成員變量的SET方法上 作用 :用來完成成員變量的賦值|注入操作 注意:使用注解進行注入時,日后注入的成員變量可以不再提供SET方法 4). 控制事務的注解 @Transactional 作用:用來給類種方法加入事務控制 簡化配置文件中 兩段配置 1. 事務通知及事務細粒度配置 2. 簡化事務切面配置 修飾范圍:類 | 方法上 局部優(yōu)先原則 1. 加載類上 代表類中所有方法加入事務控制 2. 加在方法上 代表當前方法加入事務控制 3. 類和方法同時存在 方法優(yōu)先 使用要求:如果想要讓@Transactional這個注解生效必須在配置文件中加入如下注解: <!--開啟注解式事務生效--> <!--必須是tx結(jié)尾的包下的--> <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven> 注解屬性: @Transactional(propagation = Propagation.SUPPORTS, isolation = Isolation.READ_COMMITTED, rollbackFor = {java.lang.RuntimeException.class}, noRollbackFor = {}, readOnly = false, timeout = -1) // 當然這些都推薦大家使用默認,唯獨有一個方法有點特殊,就是查詢方法,不需要去明確 // 的把它加入事務,所以建議在查詢方法上@Transactional(propagation = //Propagation.SUPPORTS)讓它去支持事務 注意:使用了@Transactional注解代理原有配置文件中的創(chuàng)建事務環(huán)繞通知細粒度控制和配置事務切面這兩段配置 <!--創(chuàng)建事務環(huán)繞通知并進行事務細粒度控制--> <!--transaction-manager找ref --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*"/> <tx:method name="update*"/> <tx:method name="delete*"/> <tx:method name="find*" propagation="SUPPORTS"/> </tx:attributes> </tx:advice> <!--配置事務切面--> <aop:config> <aop:pointcut id="pc" expression="execution(* com.baizhi.service.*ServiceImpl.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/> </aop:config> 但是下面的這些配置該寫還得寫 <!--創(chuàng)建數(shù)據(jù)源--> <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/lb?characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> <!--創(chuàng)建sqlSessionFactoy--> <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory"> <!--注入datasource mapperLocations typeAliasesPackage--> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath:com/baizhi/mapper/*.xml"/> <property name="typeAliasesPackage" value="com.baizhi.eneity"/> </bean> <!--創(chuàng)建DAO--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--注入sqlSessionFactory dao接口所在包--> <!--value要的是sqlSessionFactory在工廠中的名字--> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <property name="basePackage" value="com.baizhi.dao"/> </bean> <!--創(chuàng)建事務管理器--> <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
1.1 開啟注解掃描配置
<!--開啟注解掃描--> <context:component-scan base-package="com.baizhi"/>
1.2 實例化相關注解
# 1. @Component(value="userService") 修飾范圍: 用在類上 注解作用: 通用的創(chuàng)建實例的注解,用來創(chuàng)建當前這個類的實例 value屬性: 用來指定創(chuàng)建的對象在工廠中的唯一標識 如果不指定默認創(chuàng)建對象在工廠中的標識為類名首字母小寫 # 2. @Repository 修飾范圍: 用在類上 注解作用: @component的子類注解專用于DAO組件的創(chuàng)建,通常加在DAO組件上 value屬性: 用來指定創(chuàng)建的對象在工廠中的唯一標識 如果不指定默認創(chuàng)建對象在工廠中的標識為類名首字母小寫 # 3. @Service 修飾范圍: 用在類上 注解作用: @component的子類注解專用于Service組件的創(chuàng)建,通常加在Service組件上 value屬性: 用來指定創(chuàng)建的對象在工廠中的唯一標識 如果不指定默認創(chuàng)建對象在工廠中的標識為類名首字母小寫 # 4. @Controller 修飾范圍: 用在類上 注解作用: @component的子類注解專用于Action組件的創(chuàng)建,通常加在Action組件上 value屬性: 用來指定創(chuàng)建的對象在工廠中的唯一標識 如果不指定默認創(chuàng)建對象在工廠中的標識為類名首字母小寫 注:除了以上三種DAO、Service、Action三種組件分別創(chuàng)建時使用三種子類注解,其余的組件創(chuàng)建時使用 @Component注解
@Repository("userDAO") public class UserDAOImpl implements UserDAO{
@Service("userService")public class UserServiceImpl implements UserService{
1.3 控制對象的創(chuàng)建次數(shù)的注解
# 1. @Scope(value="singleton|prototype") 修飾范圍: 用在類上 注解作用: 用來控制這個實例在工廠中的創(chuàng)建次數(shù) value屬性: singleton為單例,prototype為多例 默認單例
@Service("userService") @Scope("prototype") public class UserServiceImpl implements UserService{
1.4 注入相關的注解
# 1. @Autowired(Spring提供) 修飾范圍: 用在成員變量或成員變量的GET/SET方法上 注解作用: 用來給類中成員變量賦值 注入原則: 默認根據(jù)類型自動注入 # 2. @Resource(JAVAEE提供) 修飾范圍: 用在成員變量或成員變量的GET/SET方法上 注解作用: 用來給類中成員變量賦值 注入原則: 默認根據(jù)名稱自動注入名稱找不到根據(jù)類型自動注入 注意:使用注解進行注入時,日后注入的成員變量可以不再提供SET方法
@Service("userService") @Scope("prototype") public class UserServiceImpl implements UserService{ @Autowired private UserDAO userDAO;
1.5 控制事務的相關注解
# 1. @Transactional 修飾范圍: 用在類上主要用在業(yè)務層組件類上或者是方法上 注解作用: 用來給類中方法加入事務,當類上和方法上同時存在該注解時局部優(yōu)先 注解屬性: propagation 用來控制傳播屬性 賦值時使用枚舉類 Isolation 用來控制隔離級別 賦值時使用枚舉類 一般使用默認 timeout 用來設置超時性 賦值代表超時時間 一般使用默認 rollback-for 用來設置什么異常回滾 賦值時給class 一般使用默認 norollback-for 用來設置什么異常不會滾 賦值時給class 一般使用默認 readonly 用來設置事務讀寫性 true/false 一般使用默認 注意:如果要使用事務注解在配置文件中必須開啟事務注解生效加入如下配置: <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven> 使用事務相關注解只可以簡化配置文件中 兩段配置 1. 事務通知及事務細粒度配置 2. 簡化事務切面配置 但是其他的比如創(chuàng)建數(shù)據(jù)源、創(chuàng)建sqlSessionFactoy、創(chuàng)建DAO、創(chuàng)建事務管理器還是要寫的 因為對于增、刪、改的事務屬性我們一般都使用默認,在進行事務控制時只需要在類上加一個@Transactional即可,屬性不寫即 代表使用默認,但是對于查詢方法我們要加入局部注解@Transactional(propagation = Propagation.SUPPORTS)使查詢 方法支持事務
// 事務的使用 一般在給類加控制事務的注解時,不修改屬性,使用默認,下面只是為了演示注解的使用 @Service("userService") @Scope("prototype") @Transactional(propagation = Propagation.SUPPORTS, isolation = Isolation.READ_COMMITTED, rollbackFor = {java.lang.RuntimeException.class}, noRollbackFor = {}, readOnly = false, timeout = -1) // 當然這些都推薦大家使用默認,唯獨有一個方法有點特殊,就是查詢方法,不需要去明確的 // 把它加入事務,所以建議在查詢方法上@Transactional(propagation = Propagation.SUPPORTS) // 讓它去支持事務 public class UserServiceImpl implements UserService{
// 平常使用 @Service("userService") @Scope("prototype") public class UserServiceImpl implements UserService{ @Autowired private UserDAO userDAO; public void save(String name) { userDAO.save(name); System.out.println("Service:" + name); } @Transactional(propagation = Propagation.SUPPORTS) public void find() { } }
注意:在使用控制事務的注解時,需要給類加上不修改任何屬性的注解@Transactional,另外還需要給find查詢方法加上局部注解@Transactional(propagation = Propagation.SUPPORTS)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
Selenium+Tesseract-OCR智能識別驗證碼爬取網(wǎng)頁數(shù)據(jù)的實例
本文主要介紹了Selenium+Tesseract-OCR智能識別驗證碼爬取網(wǎng)頁數(shù)據(jù),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09Mybatis?大數(shù)據(jù)量批量寫優(yōu)化的案例詳解
這篇文章主要介紹了Mybatis?大數(shù)據(jù)量批量寫優(yōu)化的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05Spring @value和@PropertySource注解使用方法解析
這篇文章主要介紹了Spring @value和@PropertySource注解使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11關于@GetMapping和@GetMapping(value=““)的區(qū)別
這篇文章主要介紹了關于@GetMapping和@GetMapping(value=““)的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05SpringMVC中的SimpleUrlHandlerMapping用法詳解
這篇文章主要介紹了SpringMVC中的SimpleUrlHandlerMapping用法詳解,SimpleUrlHandlerMapping是Spring MVC中適用性最強的Handler Mapping類,允許明確指定URL模式和Handler的映射關系,有兩種方式聲明SimpleUrlHandlerMapping,需要的朋友可以參考下2023-10-10