spring注解

来源:互联网 发布:宇宙外面是什么 知乎 编辑:程序博客网 时间:2024/06/11 18:32
声明事务  与 注解事务 用@Transaction 注解事务, 与aop 的expression 正则配置方法的事务是冲突的; @Transaction 在类中配置了全局事务 @Transaction(propagation=Propagation.SUPPORT) 注释配置相对于xml 配置与很多的优势,它可以充分利用java的反射机制获取类结构信息,这些信息可以有效减少配置工作; @Autowired注释 @Autowired  注释,它可以对类成员变量,方法及构造函数进行标注,完成自动装配的工作; @Autowired(required = false) 告诉spring,在找不到Bean时候也不报错; @Qualifier("bean")  当@Autowired和@Qualifier 结合使用的时候.自动注入的策略就从byType 转变成了 byName @Resource 与 @Autowired + @Qualifier 使用@Component@Repository 的基础上增加了功能类似的额外三个注解:@Component  @Service  @Constroller 它们分别用于软件系统的不同层次:?@Component 是一个泛化的概念,仅仅表示一个组件 (Bean),可以作用在任何层次?@Service 通常作用在业务层,但是目前该功能与 @Component 相同?@Constroller 通常作用在控制层,但是目前该功能与 @Component 相同.@scopeSpring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository @Service 和@Controller.在目前的 Spring 版本中,这 3 个注释和@Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层,业务层和控制层(Web 层)相对应,虽然目前这3 个注释和@Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能.所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用@Repository  @Service 和 @Controller 对分层中的类进行注释,而用@Component 对那些比较中立的类进行注释注释配置和xml 配置的适用场合:有了IOC 注释,也不可以完全摒除原来XML 配置的方式1) 注释配置不一定在先天上优秀于xml配置,如果bean的依赖关系是固定的,如:service适用了哪几个dao类    这种配置信息不会在部署时候发生调整,那么注释配置优秀于xml 配置,反之如果这种依赖关系会在部署    时发生调整,XML 配置显然又优于注释配置,因为注释是对 Java 源代码的调整,您需要重新改写源代    码并重新编译才可以实施调整2) ?如果 Bean 不是自己编写的类(如 JdbcTemplate,SessionFactoryBean 等)注释配置将无法实施,此时 XML     配置是唯一可用的方式3) ?注释配置往往是类级别的,而 XML 配置则可以表现得更加灵活,比如相比于 @Transaction 事务注释,使用     aop/tx 命名空间的事务配置更加灵活和简单所以在实现应用中,我们往往需要同时使用注释配置和 XML 配置,对于类级别且不会发生变动的配置可以优先考虑注释配置,而对于那些第三方类以及容易发生调整的配置则应优先考虑使用 XML 配置,Spring 会在具体实施 Bean 创建和 Bean 注入之前将这两种配置方式的元信息融合在一起Spring 数据源配置:spring 在第三方依赖包中包含了两个数据源的实现包,其一是Apache的DBCP,其二是C3P0,可以在spring 配置文件中利用这两者中任何一个配置数据源::DBCP 类包位于:>/lib/jakarta-commons/commons-dbcp.jar,DBCP 是一个依赖于Jakarta commons-pool对象池机制的数据库连接池,所以在类下还必须包括>/lib/jakarta- commons/commons-pool.jar例子: 使用DBCP配置mysql 数据源::<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destory-method="close">   <property name="driverClassName" value="com.mysql.jdbc.Driver" />   <property name="url" value="jdbc:mysql://localhost:3360/sampledb"/>   <property name="username" value="root" />   <property name="password" value="1234" /></bean>BasicDataSource 提供了close()方法关闭数据源, 所以必须设定destory-method="close" 属性,以便spring容器关闭时候,数据源能够正常关闭,除了以上必须的数据源属性以外,还有一些常用的属性::defaultAutoCommit: 设置从数据源中返回的连接是否采用自动提交机制,默认为true::defaultReadOnly : 设置数据源是否仅能执行只读操作, 默认值为false::maxIdle: 最大等待连接中的数量,设置为0 时候,表示没有限制::maxWait : 最大等待秒数,单位为毫秒,超过时间会报错误信息::validationQuery:用于验证连接是否成功的查询sql语句,sql语句必须至少返回一行数据,如你可以简单的设置为select count(*) from user;C3P0是一个开放源代码的JDBC 数据源实现项目,它在lib目录中与Hibernate 一起发布,实现了JDBC3和JDBC2 扩展规范说明的Connect 和statement 池,c3p0位于: >/lib/c3p0/c3p0-0.9.0.4.jar<bean id="dataSource" class="com.mchage.v2.c3p0.ComboPooledDataSource"  destory-method="close">   <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />   <property name="jdbcUrl"  value="jdbc:oracle:thin:@localhost:1521:ora9i"/>   <property name="user" value="admin" />   <property name="password"  value="1234" /></bean>ComboPooledDataSource和BasicDataSource一样提供了一个用于关闭数据源的close()方法,这样我们就可以保证Spring容器关闭时数据源能够成功释放C3P0拥有比DBCP更丰富的配置属性,通过这些属性,可以对数据源进行各种有效的控制: acquireIncrement:当连接池中的连接用完时,C3P0一次性创建新连接的数目acquireRetryAttempts:定义在从数据库获取新连接失败后重复尝试获取的次数,默认为30 acquireRetryDelay:两次连接中间隔时间,单位毫秒,默认为1000 autoCommitOnClose:连接关闭时默认将所有未提交的操作回滚,默认为false其它的属性找文档来看::读配置文件的方式引用属性: <bean id="propertyConfigurer"  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">   <property name="location" value="/WEB-INF/jdbc.properties" /></bean><bean>   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >        <property name="driverClassName"  value="${jdbc.driverClassName}" />        <property name="url"  vlaue="${jdbc.username}" /><property name="password" value="${dbc.password}" /></bean>    在jdbc.properties属性文件中定义属性值:     jdbc.driverClassName= com.mysql.jdbc.Driver     jdbc.url= jdbc:mysql://localhost:3309/sampledb     jdbc.username=root     jdbc.password=1234 提示经常有开发者在${xxx}的前后不小心键入一些空格,这些空格字符将和变量合并后作为属性的值,如<property name="username" value=" ${jdbc.username} "></property> 的属性配置项,在前后都有空格,被解析后,username的值为" 1234 "这将造成最终的错误,因此需要特别小心获取JNDI数据源  如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上,我们可能更希望使用应用服务器本身 提供的数据源,应用服务器的数据源 使用JNDI开放调用者使用,Spring为此专门提供引用JNDI资源的 JndiObjectFactoryBean类,下面是一个简单的配置: <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">      <propery name="jndiName" value="java:comp/env/jdbc/bbt" /> </bean>03.</bean>  通过jndiName指定引用的JNDI数据源名称。 Spring 2.0为获取J2EE资源提供了一个jee命名空间,通过jee命名空间,可以有效地简化J2EE资源的引用下面是使用jee命名空间引用JNDI数据源的配置:01.<beans xmlns=http://www.springframework.org/schema/beans    02.xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance    03.xmlns:jee=http://www.springframework.org/schema/jee    04.xsi:schemaLocation="http://www.springframework.org/schema/beans     05.http://www.springframework.org/schema/beans/spring-beans-2.0.xsd     06.http://www.springframework.org/schema/jee    07.http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">      08.<jee:jndi-lookup id="dataSource" jndi-name=" java:comp/env/jdbc/bbt"/>      09.</beans> 09.</beans>  Spring的数据源实现类 Spring本身也提供了一个简单的数据源实现类DriverManagerDataSource ,它位于org.springframework.jdbc.datasource包中 这个类实现了javax.sql.DataSource接口,但它并没有提供池化连接的机制,每次调用getConnection()获取新连接时,只是 简单地创建一个新的连接,因此,这个数据源类比较适合在单元测试 或简单的独立应用中使用,因为它不需要额外的依赖类。  看一下DriverManagerDataSource的简单使用:当然,也可以通过配置的方式直接使用DriverManagerDataSource。01.DriverManagerDataSource ds = new DriverManagerDataSource ();      02.ds.setDriverClassName("com.mysql.jdbc.Driver");      03.ds.setUrl("jdbc:mysql://localhost:3309/sampledb");      04.ds.setUsername("root");      05.ds.setPassword("1234");      06.Connection actualCon = ds.getConnection(); java 代码小结 不管采用何种持久化技术,都需要定义数据源,Spring附带了两个数据源的实现类包,你可以自行选择进行定义,在实际部署时,可能会直接采用应用服务器本身提供的数据源,这时,则可以通过JndiObjectFactoryBean或jee命名空间引用JNDI中的数据源DBCP与C3PO配置的区别:C3PO :DBCP:xml 代码01.<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  02.    <property name="driverClass">  03.        <value>oracle.jdbc.driver.OracleDriver</value>  04.    </property>  05.    <property name="jdbcUrl">             06.        <value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseName</value>  07.     </property>  08.    <property name="user">  09.        <value>testAdmin</value>  10.    </property>  11.    <property name="password">  12.        <value>123456</value>  13.    </property>  14.</bean>   xml 代码01.<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  02.    <property name="driverClassName">  03.        <value>oracle.jdbc.driver.OracleDriver</value>  04.    </property>  05.    <property name="url">             06.        <value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseName</value>  07.     </property>  08.    <property name="username">  09.        <value>testAdmin</value>  10.    </property>  11.    <property name="password">  12.        <value>123456</value>  13.    </property>  14.</bean>  *************************************************************************************如果使用注解事务, 利用使用JDBC事务的时候,要提供事务管理: 针对哪个数据源使用事务管理:      <!-- 数据库连接池 -->      <bean id="dataSourceNew" class="com.mchange.v2.c3p0.ComboPooledDataSource"         p:driverClass="oracle.jdbc.OracleDriver"             p:jdbcUrl="jdbc:oracle:thin:@localhost:1521:ORACLE"        p:user="movers" p:password="xzsp12" />    <!-- JDBC的事务管理器 -->        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"     p:dataSource-ref="dataSourceNew" />     <!-- 使用声明式事务管理 -->    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>**************************************************************************************我在交管局做的数据同步项目是的,配置文件:<!-- 扫描包结构找到使用了annotation的类 -->    <context:component-scan base-package="com.whclx" />        <!-- 使用声明式事务管理 -->    <!--<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>  -->    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>        <!-- 数据库连接池 -->    <bean id="dataSourceOld" class="com.mchange.v2.c3p0.ComboPooledDataSource"         p:driverClass="oracle.jdbc.OracleDriver"             p:jdbcUrl="jdbc:oracle:thin:@localhost:1521:ORACLE"        p:user="xzsp" p:password="xzsp12" />      <!-- 数据库连接池 -->    <bean id="dataSourceNew" class="com.mchange.v2.c3p0.ComboPooledDataSource"         p:driverClass="oracle.jdbc.OracleDriver"             p:jdbcUrl="jdbc:oracle:thin:@localhost:1521:ORACLE"        p:user="movers" p:password="xzsp12" />             <!-- 数据库连接池 -->           <bean id="dataSourceParam" class="com.mchange.v2.c3p0.ComboPooledDataSource"         p:driverClass="oracle.jdbc.OracleDriver"             p:jdbcUrl="jdbc:oracle:thin:@localhost:1521:ORACLE"        p:user="sxmc" p:password="sxmc12" />    <!-- JDBC的事务管理器 -->        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"     p:dataSource-ref="dataSourceNew" /><bean id="uploadService" class="com.whclx.service.UploadService"><property name="dataSource" ref="dataSourceOld" /></bean><bean id="filterService" class="com.whclx.service.FilterService">   <property name="dataSource" ref="dataSourceNew"/></bean><bean id="deptidService" class="com.whclx.service.GetDeptService">   <property name="dataSource" ref="dataSourceParam"/>   </bean>     <bean id="phoneService" class="com.whclx.service.PhoneService">       <property name="dataSource" ref="dataSourceOld"/>  </bean><bean id="commitService" class="com.whclx.service.CommitService">   <property name="dataSource" ref="dataSourceNew"/></bean><bean id="parameterService" class="com.whclx.service.ParameterService"/><!--  quartz 配置 --><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  <property name="triggers">     <list>        <ref bean="myTrigger"/>     </list>  </property>  <property name="autoStartup" value="true"/></bean><!-- trigger 配置 --><bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">   <property name="jobDetail" ref="myJobDetail"/>  <property name="cronExpression" value="0 0 12 * * ?"/></bean><!-- JobDetail 配置 --><bean id="myJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">    <property name="targetObject" ref="taskJob"/>          <property name="targetMethod" value="execute"/>          <property name="concurrent" value="false"/></bean><!-- 业务类的配置 --><bean id="taskJob" class="com.whclx.utils.TaskExe"/></beans>*************************************************************************************web.xml ::  <!-- 加载 spring 核心 配置文件-->   <context-param>      <param-name>contextConfigLocation</param-name>      <param-value>classpath:application-context.xml</param-value>  </context-param>  <listener>      <listener-class>          org.springframework.web.context.ContextLoaderListener      </listener-class>  </listener>

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 二手房过户了房贷下不来怎么办 没有房证的房子买卖怎么办 老公失踪房产证要他签字怎么办 税务机关对长期欠税怎么办 离婚有贷款的房子怎么办 买房没过户房主反悔怎么办 房子过户卖方爱人去世怎么办 黄浦区学生社会实践护照掉了怎么办 北京医保卡坏了怎么办 去了越南的签证怎么办 护照签证到期还在国外怎么办 办护照预约满了怎么办 未满16岁怎么办护照 办理护照采集指纹录不上怎么办 办理护照时指纹没有怎么办 未满16岁的怎么办护照 身份证照得太丑怎么办 武汉江夏怎么办健康证 小孩偏胖肚子大怎么办 手机安全中心密码忘记了怎么办 进京证一年12次怎么办 青霉素和头孢都过敏怎么办 手汗孢疹肿胀怎么办能吃消炎药吗 手机上办进京证怎么办 杭州公共自行车还车点满了怎么办 法院判决书下来对方不给钱怎么办 抓进看守所的人怎么办 在拘留所里病重抢救怎么办 昆明公租房户型确认后怎么办 18年工作好难找怎么办 我没工作了怎么办2018 婚姻质量差不幸福该怎么办 吸毒犯戒毒所不收怎么办 信用卡到期人进拘留所怎么办? 人在拘留所信用卡逾期怎么办 探视权不让接走怎么办 医保过了缴费期怎么办 充电宝充手机慢怎么办 执行局执行不到钱怎么办 小孩挖耳朵疼了怎么办 挖耳朵挖破了怎么办