Java?Spring框架的注解式開(kāi)發(fā)你了解嗎
更新時(shí)間:2022年03月10日 10:58:19 作者:嘿,魚(yú)骨頭^O^
這篇文章主要為大家詳細(xì)介紹了Spring框架的注解式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
1. Spring框架的注解式開(kāi)發(fā)
# Spring框架的注解式(Annotation)開(kāi)發(fā)
1. 注解式開(kāi)發(fā)
定義:通過(guò)Spring框架提供的一系列注解來(lái)完成項(xiàng)目中快速開(kāi)發(fā)
注解:Annotation是java中一種特殊的類 類似于interface 使用時(shí):@注解類名(屬性=參數(shù)) @Param(Mybatis中做參數(shù)綁定的注解)
注意:Spring框架提供的這些注解日后僅僅能在和Spring去做一系列項(xiàng)目的時(shí)候去用,這是Spring框架為我們提供的。
為什么Spring框架要提供這么一套注解去幫助我們呢,原因是現(xiàn)有的開(kāi)發(fā)方式中開(kāi)發(fā)效率很低下,隨著組件的增多,
比如UserService、UserAction...大家會(huì)發(fā)現(xiàn)在做現(xiàn)有的配置文件進(jìn)行開(kāi)發(fā)時(shí),每寫(xiě)一個(gè)業(yè)務(wù)層,就需要在spring.xml
文件中通過(guò)bean標(biāo)簽去注冊(cè),有的時(shí)候忘了在工廠中注冊(cè)的時(shí)候,用的時(shí)候還會(huì)產(chǎn)生空指針異常問(wèn)題。所以Spring框架為了讓大家
專注于業(yè)務(wù)邏輯處理,不想每次開(kāi)發(fā)一個(gè)組件時(shí)還要去寫(xiě)一個(gè)配置,每次開(kāi)發(fā)一個(gè)組件時(shí)還需要寫(xiě)一個(gè)配置這樣是不是影響了開(kāi)發(fā)
效率啊。所以Spring框架就想了,能不能為程序員提供一種便利呢,這種便利就是日后不需要它再做配置就完成工廠創(chuàng)建、注入
相關(guān)的一些操作,怎么去做呢。所以在Spring中它給我們提供了一系列的相關(guān)注解幫助我們?nèi)プ隹焖匍_(kāi)發(fā)。
2. spring中的注解
前置條件:必須在工廠配置文件中完成注解的掃描
<!--下面這個(gè)標(biāo)簽就是用來(lái)做注解掃描的 base-package:指定掃描哪些包的注解-->
<context:component-scan base-package="com.baizhi">
在用注解的時(shí)候能讓spring框架去看到這些注解或者說(shuō)去掃描到這些注解,
那spring框架怎么去讀呢,spring有一個(gè)spring.xml這樣的一個(gè)配置文
件,是不是得讓加載這個(gè)配置時(shí)要通過(guò)這個(gè)配置文件掃描到注解啊。
1). 創(chuàng)建對(duì)象相關(guān)注解
@Component注解 通用組件創(chuàng)建注解 父類注解
作用:用來(lái)負(fù)責(zé)對(duì)象的創(chuàng)建 ==========> 簡(jiǎn)化<bean class="" id="">
修飾范圍:只能用在類上
注意:默認(rèn)使用這個(gè)注解在工廠中創(chuàng)建的對(duì)象的唯一標(biāo)識(shí)為 類名首字母小寫(xiě) UserDAOImpl ===> userDAOImpl
value屬性的作用:用來(lái)指定創(chuàng)建的對(duì)象在工廠中的唯一標(biāo)識(shí) 推薦:存在接口則名字設(shè)置為接口首字母小寫(xiě) 不存在使用默認(rèn)
@Component("userDAO") 等價(jià)于 @Component(value = "userDAO")
子類注解:沿用了父類注解的一切特性,也就是說(shuō)下面三個(gè)注解也能用來(lái)創(chuàng)建對(duì)象
@Repository 作用:一般用來(lái)創(chuàng)建DAO中組件的注解
@Service 作用:一般用來(lái)創(chuàng)建Service中組件的注解
@Controller 作用:一般用來(lái)創(chuàng)建Action中組件的注解
2). 控制對(duì)象在工廠中創(chuàng)建次數(shù) 默認(rèn)工廠單例創(chuàng)建
a. 配置文件修改 <bean class="" id="" scope="singleton|prototype">
b. 注解如何控制
@Scope
作用: 用來(lái)指定對(duì)象的創(chuàng)建次數(shù)默認(rèn)單例
修飾范圍:只能加在類上
value屬性:singleton 單例 默認(rèn)|prototype 多例
@Scope("prototype") =====> 等價(jià)于 @Scope(value = "prototype")
@Scope("singleton") =====> 等價(jià)于 @Scope(value = "singleton")默認(rèn)是單例,如果想設(shè)置為單例,可以不寫(xiě)
注意:在管理structs的action時(shí)必須加入@Scope注解值必須為prototype
3). 屬性注入的相關(guān)注解
下面兩個(gè)都能用
a. spring框架提供的 @Autowired :注意 默認(rèn)根據(jù)類型進(jìn)行注入 推薦
b. javaEE本身就有的 @Resource :注意 默認(rèn)根據(jù)名字注入,名稱找不到時(shí)自動(dòng)根據(jù)類型進(jìn)行注入
修飾范圍:用在類中的成員變量或者是用在類中成員變量的SET方法上
作用 :用來(lái)完成成員變量的賦值|注入操作
注意:使用注解進(jìn)行注入時(shí),日后注入的成員變量可以不再提供SET方法
4). 控制事務(wù)的注解
@Transactional
作用:用來(lái)給類種方法加入事務(wù)控制 簡(jiǎn)化配置文件中 兩段配置 1. 事務(wù)通知及事務(wù)細(xì)粒度配置 2. 簡(jiǎn)化事務(wù)切面配置
修飾范圍:類 | 方法上 局部?jī)?yōu)先原則
1. 加載類上 代表類中所有方法加入事務(wù)控制
2. 加在方法上 代表當(dāng)前方法加入事務(wù)控制
3. 類和方法同時(shí)存在 方法優(yōu)先
使用要求:如果想要讓@Transactional這個(gè)注解生效必須在配置文件中加入如下注解:
<!--開(kāi)啟注解式事務(wù)生效-->
<!--必須是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) // 當(dāng)然這些都推薦大家使用默認(rèn),唯獨(dú)有一個(gè)方法有點(diǎn)特殊,就是查詢方法,不需要去明確 // 的把它加入事務(wù),所以建議在查詢方法上@Transactional(propagation = //Propagation.SUPPORTS)讓它去支持事務(wù)
注意:使用了@Transactional注解代理原有配置文件中的創(chuàng)建事務(wù)環(huán)繞通知細(xì)粒度控制和配置事務(wù)切面這兩段配置
<!--創(chuàng)建事務(wù)環(huán)繞通知并進(jìn)行事務(wù)細(xì)粒度控制-->
<!--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>
<!--配置事務(wù)切面-->
<aop:config>
<aop:pointcut id="pc" expression="execution(* com.baizhi.service.*ServiceImpl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config>
但是下面的這些配置該寫(xiě)還得寫(xiě)
<!--創(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)建事務(wù)管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
1.1 開(kāi)啟注解掃描配置
<!--開(kāi)啟注解掃描--> <context:component-scan base-package="com.baizhi"/>
1.2 實(shí)例化相關(guān)注解
# 1. @Component(value="userService") 修飾范圍: 用在類上 注解作用: 通用的創(chuàng)建實(shí)例的注解,用來(lái)創(chuàng)建當(dāng)前這個(gè)類的實(shí)例 value屬性: 用來(lái)指定創(chuàng)建的對(duì)象在工廠中的唯一標(biāo)識(shí) 如果不指定默認(rèn)創(chuàng)建對(duì)象在工廠中的標(biāo)識(shí)為類名首字母小寫(xiě) # 2. @Repository 修飾范圍: 用在類上 注解作用: @component的子類注解專用于DAO組件的創(chuàng)建,通常加在DAO組件上 value屬性: 用來(lái)指定創(chuàng)建的對(duì)象在工廠中的唯一標(biāo)識(shí) 如果不指定默認(rèn)創(chuàng)建對(duì)象在工廠中的標(biāo)識(shí)為類名首字母小寫(xiě) # 3. @Service 修飾范圍: 用在類上 注解作用: @component的子類注解專用于Service組件的創(chuàng)建,通常加在Service組件上 value屬性: 用來(lái)指定創(chuàng)建的對(duì)象在工廠中的唯一標(biāo)識(shí) 如果不指定默認(rèn)創(chuàng)建對(duì)象在工廠中的標(biāo)識(shí)為類名首字母小寫(xiě) # 4. @Controller 修飾范圍: 用在類上 注解作用: @component的子類注解專用于Action組件的創(chuàng)建,通常加在Action組件上 value屬性: 用來(lái)指定創(chuàng)建的對(duì)象在工廠中的唯一標(biāo)識(shí) 如果不指定默認(rèn)創(chuàng)建對(duì)象在工廠中的標(biāo)識(shí)為類名首字母小寫(xiě) 注:除了以上三種DAO、Service、Action三種組件分別創(chuàng)建時(shí)使用三種子類注解,其余的組件創(chuàng)建時(shí)使用 @Component注解
@Repository("userDAO")
public class UserDAOImpl implements UserDAO{
@Service("userService")public class UserServiceImpl implements UserService{1.3 控制對(duì)象的創(chuàng)建次數(shù)的注解
# 1. @Scope(value="singleton|prototype") 修飾范圍: 用在類上 注解作用: 用來(lái)控制這個(gè)實(shí)例在工廠中的創(chuàng)建次數(shù) value屬性: singleton為單例,prototype為多例 默認(rèn)單例
@Service("userService")
@Scope("prototype")
public class UserServiceImpl implements UserService{
1.4 注入相關(guān)的注解
# 1. @Autowired(Spring提供) 修飾范圍: 用在成員變量或成員變量的GET/SET方法上 注解作用: 用來(lái)給類中成員變量賦值 注入原則: 默認(rèn)根據(jù)類型自動(dòng)注入 # 2. @Resource(JAVAEE提供) 修飾范圍: 用在成員變量或成員變量的GET/SET方法上 注解作用: 用來(lái)給類中成員變量賦值 注入原則: 默認(rèn)根據(jù)名稱自動(dòng)注入名稱找不到根據(jù)類型自動(dòng)注入 注意:使用注解進(jìn)行注入時(shí),日后注入的成員變量可以不再提供SET方法
@Service("userService")
@Scope("prototype")
public class UserServiceImpl implements UserService{
@Autowired
private UserDAO userDAO;
1.5 控制事務(wù)的相關(guān)注解
# 1. @Transactional 修飾范圍: 用在類上主要用在業(yè)務(wù)層組件類上或者是方法上 注解作用: 用來(lái)給類中方法加入事務(wù),當(dāng)類上和方法上同時(shí)存在該注解時(shí)局部?jī)?yōu)先 注解屬性: propagation 用來(lái)控制傳播屬性 賦值時(shí)使用枚舉類 Isolation 用來(lái)控制隔離級(jí)別 賦值時(shí)使用枚舉類 一般使用默認(rèn) timeout 用來(lái)設(shè)置超時(shí)性 賦值代表超時(shí)時(shí)間 一般使用默認(rèn) rollback-for 用來(lái)設(shè)置什么異?;貪L 賦值時(shí)給class 一般使用默認(rèn) norollback-for 用來(lái)設(shè)置什么異常不會(huì)滾 賦值時(shí)給class 一般使用默認(rèn) readonly 用來(lái)設(shè)置事務(wù)讀寫(xiě)性 true/false 一般使用默認(rèn) 注意:如果要使用事務(wù)注解在配置文件中必須開(kāi)啟事務(wù)注解生效加入如下配置: <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven> 使用事務(wù)相關(guān)注解只可以簡(jiǎn)化配置文件中 兩段配置 1. 事務(wù)通知及事務(wù)細(xì)粒度配置 2. 簡(jiǎn)化事務(wù)切面配置 但是其他的比如創(chuàng)建數(shù)據(jù)源、創(chuàng)建sqlSessionFactoy、創(chuàng)建DAO、創(chuàng)建事務(wù)管理器還是要寫(xiě)的 因?yàn)閷?duì)于增、刪、改的事務(wù)屬性我們一般都使用默認(rèn),在進(jìn)行事務(wù)控制時(shí)只需要在類上加一個(gè)@Transactional即可,屬性不寫(xiě)即 代表使用默認(rèn),但是對(duì)于查詢方法我們要加入局部注解@Transactional(propagation = Propagation.SUPPORTS)使查詢 方法支持事務(wù)
// 事務(wù)的使用 一般在給類加控制事務(wù)的注解時(shí),不修改屬性,使用默認(rèn),下面只是為了演示注解的使用
@Service("userService")
@Scope("prototype")
@Transactional(propagation = Propagation.SUPPORTS,
isolation = Isolation.READ_COMMITTED,
rollbackFor = {java.lang.RuntimeException.class},
noRollbackFor = {},
readOnly = false,
timeout = -1) // 當(dāng)然這些都推薦大家使用默認(rèn),唯獨(dú)有一個(gè)方法有點(diǎn)特殊,就是查詢方法,不需要去明確的
// 把它加入事務(wù),所以建議在查詢方法上@Transactional(propagation = Propagation.SUPPORTS)
// 讓它去支持事務(wù)
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() {
}
}
注意:在使用控制事務(wù)的注解時(shí),需要給類加上不修改任何屬性的注解@Transactional,另外還需要給find查詢方法加上局部注解@Transactional(propagation = Propagation.SUPPORTS)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
您可能感興趣的文章:
- Java?Spring的使用注解開(kāi)發(fā)詳解
- Java Spring詳解如何配置數(shù)據(jù)源注解開(kāi)發(fā)以及整合Junit
- 通過(guò)spring注解開(kāi)發(fā),簡(jiǎn)單測(cè)試單例和多例區(qū)別
- Java之Spring注解開(kāi)發(fā)案例詳解
- 詳解spring如何使用注解開(kāi)發(fā)
- 詳解Spring注解驅(qū)動(dòng)開(kāi)發(fā)之屬性賦值
- Spring 開(kāi)發(fā)過(guò)程中Value 注解的使用場(chǎng)景
- Spring注解開(kāi)發(fā)生命周期原理解析
- Spring詳解使用注解開(kāi)發(fā)流程
相關(guān)文章
HttpClient實(shí)現(xiàn)調(diào)用外部項(xiàng)目接口工具類的示例
下面小編就為大家?guī)?lái)一篇HttpClient實(shí)現(xiàn)調(diào)用外部項(xiàng)目接口工具類的示例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
java計(jì)算兩個(gè)時(shí)間相差天數(shù)的方法匯總
這篇文章主要介紹了java計(jì)算兩個(gè)時(shí)間相差天數(shù)的方法,感興趣的小伙伴們可以參考一下2015-11-11
Spring Boot實(shí)現(xiàn)郵件注冊(cè)功能示例代碼
本篇文章主要介紹了Spring Boot實(shí)現(xiàn)郵件注冊(cè)功能示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05

