『壹』 怎樣把spring 的註解換成 配置
@Reource
ServiceDao service;
在類中要有那個setter方法
<bean id="beanid" class="類路徑">
<property name="service"/>
</bean>
最簡單的一種上面是註解,下面是配置的! 如果有郵箱的話,我發個例子給你。
『貳』 spring的事務使用有幾種方式註解式事務如何配置和使用
Spring提供的事務管理可以分為兩類:編程式的和聲明式的。
編程式的,比較靈活,但是代碼量大,存在重復的代碼比較多;聲明式的比編程式的更靈活方便。
1、傳統使用JDBC的事務管理
以往使用JDBC進行數據操作,使用DataSource,從數據源中得到Connection,我們知道數據源是線程安全的,而連接不是線程安全的,所以對每個請求都是從數據源中重新取出一個連接。一般的數據源由容器進行管理,包括連接池。例如TOMCAT,WEBSPHERE,WEBLOGIC等這些J2EE商業容器都提供了這個功能。
以往的我們使用JDBC在寫代碼時,事務管理可能會是這樣:
Connection conn = null;
try{
conn = DBConnectionFactory.getConnection;
conn.setAutoCommit(false);
//do something
conn.commit(); //commit transcation
}catch(Exception e){
conn.rollback();
}
finally{
try{
conn.close();
} catch(sqlException se){ //do sth.}
//close ResultSet,PreparedStatement,Connection
//notice:Maybe ocurr Exception when u close rs,pstmt,conn
}
按照以往的思路來寫代碼,代碼量比較長,而且容易疏忽,忘掉一些try/catch,引發一些異常無法catch,雖然有時候我們會寫DBTool類,來關閉這些資源,並且保證在關閉這些資源時,不向外拋異常,但是這樣做會導致額外的麻煩。
2、Spring提供的編程式的事務處理
Spring提供了幾個關於事務處理的類:TransactionDefinition //事務屬性定義
TranscationStatus //代表了當前的事務,可以提交,回滾。
PlatformTransactionManager這個是spring提供的用於管理事務的基礎介面,其下有一個實現的抽象類,我們使用的事務管理類例如DataSourceTransactionManager等都是這個類的子類。
我們使用編程式的事務管理流程可能如下:
(1) 聲明數據源。
(2) 聲明一個事務管理類,例如:DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等
(3) 在我們的代碼中加入事務處理代碼:
TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
try{
//do sth
transactionManager.commit(ts);
}catch(Exception e){transactionManager.rollback(ts);}
使用Spring提供的事務模板TransactionTemplate:
void add()
{
transactionTemplate.execute( new TransactionCallback(){
pulic Object doInTransaction(TransactionStatus ts)
{ //do sth}
}
}
TransactionTemplate也是為我們省去了部分事務提交、回滾代碼;定義事務模板時,需注入事務管理對象。
3、Spring聲明式事務處理
Spring聲明式事務處理也主要使用了IoC,AOP思想,提供了TransactionInterceptor攔截器和常用的代理類TransactionProxyFactoryBean,可以直接對組件進行事務代理。
使用TransactionInterceptor的步驟:
(1)定義數據源,事務管理類
(2)定義事務攔截器,例如:
<bean id = "transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="transactionAttributeSource">
<value>
com.test.UserManager.*r=PROPAGATION_REQUIRED
</value>
</property>
</bean>
(3)為組件聲明一個代理類:ProxyFactoryBean
<bean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"><value>com.test.UserManager</value></property>
<property name="interceptorNames">
<list>
<idref local="transactionInterceptor"/>
</list>
</property>
</bean>
使用TransactionProxyFactoryBean:
<bean id="userManager"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="target"><ref local="userManagerTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
TransactionProxyFactoryBean只是為組件的事務代理,如果我們要給組件添加一些業務方面的驗證等,可以使用TransactionTemplate加攔截器方式,為組件添加多個攔截器,spring AOP中提供了三類Advice,即前增強,後增強,拋出異常時的增強,可以靈活使用。
『叄』 spring中如何使用註解來配置bean有哪些相關的註解
答:首先需要在Spring配置文件中增加如下配置:
1 <context:component-scan base-package="org.example"/>
然後可以用@Component、@Controller、@Service、@Repository註解來標注需要由Spring IoC容器進行對象託管的類。這幾個註解沒有本質區別,只不過@Controller通常用於控制器,@Service通常用於業務邏輯類,@Repository通常用於倉儲類(例如我們的DAO實現類),普通的類用@Component來標注。
『肆』 spring整合mybatis怎樣配置註解
mybatis和spring的整合步驟:
1)使用mybatis,必須有個全局配置文件configuration.xml,來配置mybatis的緩存,延遲載入等等一系列屬性,該配置文件示例如下:
Java代碼
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<settings>
<!-- 全局映射器啟用緩存 -->
<setting name="cacheEnabled" value="true" />
<!-- 查詢時,關閉關聯對象即時載入以提高性能 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 設置關聯對象載入的形態,此處為按需載入欄位(載入欄位由SQL指 定),不會載入關聯表的所有欄位,以提高性能 -->
<setting name="aggressiveLazyLoading" value="false" />
<!-- 對於未知的SQL查詢,允許返回不同的結果集以達到通用的效果 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 允許使用列標簽代替列名 -->
<setting name="useColumnLabel" value="true" />
<!-- 允許使用自定義的主鍵值(比如由程序生成的UUID 32位編碼作為鍵值),數據表的PK生成策略將被覆蓋 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 給予被嵌套的resultMap以欄位-屬性的映射支持 -->
<setting name="autoMappingBehavior" value="FULL" />
<!-- 對於批量更新操作緩存SQL以提高性能 -->
<setting name="defaultExecutorType" value="BATCH" />
<!-- 資料庫超過25000秒仍未響應則超時 -->
<setting name="defaultStatementTimeout" value="25000" />
</settings>
<!-- 全局別名設置,在映射文件中只需寫別名,而不必寫出整個類路徑 -->
<typeAliases>
<typeAlias alias="TestBean"
type="com.wotao.taotao.persist.test.dataobject.TestBean" />
</typeAliases>
<!-- 非註解的sql映射文件配置,如果使用mybatis註解,該mapper無需配置,但是如果mybatis註解中包含@resultMap註解,則mapper必須配置,給resultMap註解使用 -->
<mappers>
<mapper resource="persist/test/orm/test.xml" />
</mappers>
</configuration>
2)該文件放在資源文件的任意classpath目錄下,假設這里就直接放在資源根目錄,等會spring需要引用該文件。
查看ibatis-3-config.dtd發現除了settings和typeAliases還有其他眾多元素,比如properties,objectFactory,environments等等,這些元素基本上都包含著一些環境配置,數據源定義,資料庫事務等等,在單獨使用mybatis的時候非常重要,比如通過以構造參數的形式去實例化一個sqlsessionFactory,就像這樣:
Java代碼
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, properties);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, properties);
而typeHandlers則用來自定義映射規則,如可以自定義將Character映射為varchar,plugins元素則放了一些攔截器介面。
2)在spring配置文件中指定c3p0數據源定義如下:
Java代碼
<!-- c3p0 connection pool configuration -->
<bean id="testDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<!-- 資料庫驅動 -->
<property name="driverClass" value="${db.driver.class}" />
<!-- 連接URL串 -->
<property name="jdbcUrl" value="${db.url}" />
<!-- 連接用戶名 -->
<property name="user" value="${db.username}" />
<!-- 連接密碼 -->
<property name="password" value="${db.password}" />
<!-- 初始化連接池時連接數量為5個 -->
<property name="initialPoolSize" value="5" />
<!-- 允許最小連接數量為5個 -->
<property name="minPoolSize" value="5" />
<!-- 允許最大連接數量為20個 -->
<property name="maxPoolSize" value="20" />
<!-- 允許連接池最大生成100個PreparedStatement對象 -->
<property name="maxStatements" value="100" />
<!-- 連接有效時間,連接超過3600秒未使用,則該連接丟棄 -->
<property name="maxIdleTime" value="3600" />
<!-- 連接用完時,一次產生的新連接步進值為2 -->
<property name="acquireIncrement" value="2" />
<!-- 獲取連接失敗後再嘗試10次,再失敗則返回DAOException異常 -->
<property name="acquireRetryAttempts" value="10" />
<!-- 獲取下一次連接時最短間隔600毫秒,有助於提高性能 -->
<property name="acquireRetryDelay" value="600" />
<!-- 檢查連接的有效性,此處小弟不是很懂什麼意思 -->
<property name="testConnectionOnCheckin" value="true" />
<!-- 每個1200秒檢查連接對象狀態 -->
<property name="idleConnectionTestPeriod" value="1200" />
<!-- 獲取新連接的超時時間為10000毫秒 -->
<property name="checkoutTimeout" value="10000" />
</bean>
配置中的${}都是佔位符,在指定資料庫驅動打war時會自動替換,替換的值在父pom中配置。
3)需要一個sessionFactory來生成session,sessionFactory配置如下:
Java代碼
<bean id="testSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:configuration.xml" />
<property name="dataSource" ref="testDataSource" />
</bean>
4)配置一個映射器介面來對應sqlSessionTemplate,該映射器介面定義了介面方法:
Java代碼
<!-- data OR mapping interface -->
<bean id="testMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="testSqlSessionFactory" />
<property name="mapperInterface" value="com.wotao.taotao.persist.test.mapper.TestMapper" />
</bean>
5)至此,一個完整的myabtis整合spring的配置文件看起來應該如下所示:
Java代碼
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<!-- c3p0 connection pool configuration -->
<bean id="testDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${db.driver.class}" />
<property name="jdbcUrl" value="${db.url}" />
<property name="user" value="${db.username}" />
<property name="password" value="${db.password}" />
<property name="initialPoolSize" value="5" />
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="20" />
<property name="maxStatements" value="100" />
<property name="maxIdleTime" value="3600" />
<property name="acquireIncrement" value="2" />
<property name="acquireRetryAttempts" value="10" />
<property name="acquireRetryDelay" value="600" />
<property name="testConnectionOnCheckin" value="true" />
<property name="idleConnectionTestPeriod" value="1200" />
<property name="checkoutTimeout" value="10000" />
</bean>
<bean id="testSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:configuration.xml" />
<property name="dataSource" ref="testDataSource" />
</bean>
<!-- data OR mapping interface -->
<bean id="testMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="testSqlSessionFactory" />
<property name="mapperInterface" value="com.wotao.taotao.persist.test.mapper.TestMapper" />
</bean>
<!-- add your own Mapper here -->
<!-- comment here, using annotation -->
<!-- <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> -->
<!-- <constructor-arg index="0" ref="sqlSessionFactory" /> -->
<!-- </bean> -->
<!-- base DAO class, for mole business, extend this class in DAO -->
<!-- <bean id="testBaseDAO" class="com.test..TestBaseDAO"> -->
<!-- <property name="sqlSessionTemplate" ref="sqlSessionTemplate" /> -->
<!-- </bean> -->
<!-- <bean id="testDAO" class="com.test..impl.TestDAOImpl" /> -->
<!-- you can DI Bean if you don't like use annotation -->
</beans>
『伍』 spring怎麼配置註解
@Repository註解:
1 package imooc_spring.test.anotation.myrepository;
2
3 import org.springframework.stereotype.Repository;
4
5 /**
6 * 指定id,默認為dAO,即類名首字母小寫,如果指定了名稱那麼只能ctx.getBean(指定名稱)來獲取bean
7 * 這個例子里就只能通過ctx.getBean("wyl)來獲取DAO 的實例了;
8 *
9 * @author Wei
10 */
11 @Repository("wyl")
12 public class DAO {
13 /**
14 * 返回x和y的乘積
15 *
16 * @param x
17 * @param y
18 * @return x*y
19 */
20 public int multi(int x, int y) {
21 return x * y;
22 }
23 }
復制代碼
@Component 註解:
復制代碼
1 package imooc_spring.test.anotation;
2
3 import org.springframework.stereotype.Component;
4 /**
5 * Component 註解
6 * @author Wei
7 *
8 */
9 @Component
10 public class TestObj {
11 public void SayHi(){
12 System.out.println(" Hi this is TestObj.SayHi()...");
13 }
14 }
復制代碼
@Controller註解:
復制代碼
1 package imooc_spring.test.anotation;
2
3 import org.springframework.stereotype.Controller;
4
5 @Controller
6 public class UserController {
7 public void execute(){
8 System.out.println(" UserController.execute()...");
9 }
10 }
復制代碼
@Repository註解:
復制代碼
1 package imooc_spring.test.anotation;
2
3 import org.springframework.stereotype.Repository;
4
5 //@Repository
6 @Repository("wyl_repo")
7 public class UserRepositoryImpl implements IUserRepository {
8 //模擬持久化層
9 @Override
10 public void save() {
11 // TODO Auto-generated method stub
12 System.out.println(" UserRepositoryImpl.save()...");
13 }
14
15 }
復制代碼
@Service註解:
復制代碼
1 package imooc_spring.test.anotation;
2
3 import org.springframework.stereotype.Service;
4
5 @Service
6 public class UserService {
7 public void add(){
8 System.out.println(" UserService.add()...");
9 }
10 }
『陸』 怎麼用註解配置springmvc
只需要在applicationContext.xml里設置<mvc:annotation-driven />就可以使用springmvc的註解功能了。
『柒』 spring是如何實現用註解配置的
<property name="packagesToScan">
<list>
<value>org.test.function.**.*</value>
</list>
</property>
配置文件中有這個配置。 這就是查找到你類中使用註解的依賴注入了。
『捌』 spring使用事務註解時怎麼配置
我的測試代碼跟樓主你的類似。
我貼一下錯誤,當我給類加上註解的時候會報這個錯:
xception in thread "main" org.springframework..: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
去掉呢。就沒事了。我的定義里把save等設置為非read-only,跟你的一樣。
故證明:註解比XML配置優先順序要高。
『玖』 spring註解怎麼實現的
【Spring如何使用註解機制完成自動裝配】
Java實例構造時會調用默認父類無參構造方法,Spring正是利用了這一點,讓"操作元素的代碼"得以執行。
【兩種處理策略】
(1)類級別的註解:如@Component、@Repository、@Controller、@Service以及JavaEE6的@ManagedBean和@Named註解,都是添加在類上面的類級別註解。
Spring容器根據註解的過濾規則掃描讀取註解Bean定義類,並將其注冊到Spring IoC容器中。
(2)類內部的註解:如@Autowire、@Value、@Resource以及EJB和WebService相關的註解等,都是添加在類內部的欄位或者方法上的類內部註解。
SpringIoC容器通過Bean後置註解處理器解析Bean內部的註解。
Spring實現@Autowire解析和注入的核心的類是通過來實現的。
我們可以通過其方法列表看出,其中對欄位的注入,對屬性的注入,還有選擇相應的構造方法來注入。
1,從構造方法的緩存中查詢其構造方法
2,若緩存中不存在,則根據反射獲取所有構造方法
3,遍歷所有構造方法,查詢器是否含有@Autowired屬性
4,判斷Autowired註解中指定了required屬性 (required屬性就是判斷是否強依依賴)若存在required就使用默認構造方法。
5,返回指定的構造方法
注入的時候則是通過inject方法來實現。
================================================================================================================================
Spring對註解的支持主要都是通過反射來獲取相應的註解,來做相應的處理,我們的工程中大部分都是使用@Service 和@Autowired來使用,其實我們還可以使用到其他的註解來加快我們的開發,滿足我們的多樣性需求。
annotation是挺簡單的東西.其實就是個聲明。然後通過反射去取那些聲明了值。
autowire其實也是這個意思。通過反射去看你autowire的方式,通過定義的方式,去給你聲明的變數賦值。
通過java的反射機制相關的API來訪問Annotation信息。
相關類(框架或工具中的類)根據這些信息來決定如何使用該程序元素或改變它們的行為。
Java語言解釋器在工作時會忽略這些Annotation,因此在JVM中這些Annotation是「不起作用」的,只能通過配套的工具才能對這些Annotation類型的信息進行訪問和處理。
註解本身不做任何事情,只是像xml文件一樣起到配置作用。
註解代表的是某種業務意義,註解背後處理器的工作原理如上源碼實現:
——首先解析所有屬性,判斷屬性上是否存在指定註解。
——如果存在則根據搜索規則取得bean,然後利用反射原理注入。
——如果標注在欄位上面,也可以通過欄位的反射技術取得註解,根據搜索規則取得bean,然後利用反射技術注入。
================================================================================================================================
Spring 3.0 新增了另外兩個實現類: 和 。從名字便可以看出,它們是為註解而生,直接依賴於註解作為容器配置信息來源的 IoC 容器初始化類。由於 是 的 web 版本,其用法與後者相比幾乎沒有什麼差別,因此本文將以 為例進行講解。
我們需要在用於指定配置信息的類上加上 @Configuration 註解,以明確指出該類是 Bean 配置的信息源。並且 Spring 對標注 Configuration 的類有如下要求:
配置類不能是 final 的;
配置類不能是本地化的,亦即不能將配置類定義在其他類的方法內部;
配置類必須有一個無參構造函數。
將配置類中標注了 @Bean 的方法的返回值識別為 Spring Bean,並注冊到容器中,受 IoC 容器管理。@Bean 的作用等價於 XML 配置中的 <bean/> 標簽。
在一般的項目中,為了結構清晰,通常會根據軟體的模塊或者結構定義多個 XML 配置文件,然後再定義一個入口的配置文件,該文件使用 <import/> 將其他的配置文件組織起來。最後只需將該文件傳給 的構造函數即可。
針對基於註解的配置,Spring 也提供了類似的功能,只需定義一個入口配置類,並在該類上使用 @Import 註解引入其他的配置類即可,最後只需要將該入口類傳遞給 。
@Configuration
@Import({BookStoreServiceConfig.class,BookStoreDaoConfig.class})
public class BookStoreConfig{ … }
================================================================================================================================
http://zxf-noimp.iteye.com/blog/1071765
【定義註解】
// 在運行時執行
@Retention(RetentionPolicy.RUNTIME)
// 註解適用地方(欄位和方法)
@Target({ ElementType.FIELD, ElementType.METHOD })
public @interface ZxfResource {
//註解的name屬性
public String name() default "";
}
【註解處理器】
public (String fileName) {
//讀取配置文件中管理的bean
this.readXML(fileName);
//實例化bean
this.instancesBean();
//註解處理器
this.annotationInject();
}