`
jie2workjava
  • 浏览: 149041 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

spring的配置文件等advice+advisor+beannameproxy...总结

阅读更多

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd ">
<beans>
 <!-- dataSource -->
 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName">
   <value>com.mysql.jdbc.Driver</value>
  </property>
  <property name="url">
   <value>
    jdbc:mysql://127.0.0.1:3306/hejie
   </value>
  </property>
  <property name="username">
   <value>root</value>
  </property>
  <property name="password">
   <value>hejie</value>
  </property>
 </bean>
 <!-- sessionFactory -->
 <!--bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"-->
 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
 <!-- hibernate注释时用的类 AnnotationSessionFactoryBean -->
  <property name="dataSource">
   <ref bean="dataSource"/>
  </property>
  <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">
     org.hibernate.dialect.MySQLDialect
    </prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.format_sql">true</prop>
   </props>
  </property>
  <!--property name="mappingResources"-->
  <property name="annotatedClasses"> <!-- hibernate注释时用 -->
   <list>
    <!--<value>com/yeepay/entity/person_xml.xml</value>-->
    <value>com.yeepay.entity.Person</value>
    <value>com.yeepay.entity.Book</value>
   </list>
  </property>
 </bean>
 <!-- template -->
 <bean id="template" class="org.springframework.orm.hibernate3.HibernateTemplate">
  <property name="sessionFactory">
   <ref bean="sessionFactory"/>
  </property>
 </bean>
 <!-- dao -->
 <bean id="personDao" class="com.yeepay.dao.impl.PersonDaoImpl">
  <property name="template" ref="template"></property>
 </bean>
 <!-- biz -->
 
 
 
 
 <!-- 事物 -->
 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>
 <!-- 拦截器 -->  
 <bean id="interceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
  <property name="transactionManager" ref="transactionManager"></property>
  <property name="transactionAttributes">
   <props>
    <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
   </props>
  </property>
 </bean>
 <!-- 自动代理 -->  <!-- 缺陷:不能细化到某些对某些-->
 <bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  <property name="beanNames">
   <list>
    <value>*Dao</value>
   </list>
  </property>
  <property name="interceptorNames">
   <list>
    <value>interceptor</value>
   </list>
  </property>
 </bean>
 
</beans>
<!--
  遇到的问题:
 1.核心jar包:hibernate(hbm)+spring(DriverManagerDataSource)
   ---spring.jar
   ---log4j-1.2.11.jar
   ---dom4j-1.6.1.jar
   ---commons-logging-1.0.4.jar
   ---hibernate3.jar
   ---commons-collections-2.1.1.jar
   ---cglib-2.1.3.jar
   ---asm.jar
   ---antlr-2.7.6.jar
   ---数据库驱动
 2.org.springframework.jdbc.datasource.DriverManagerDataSource与org.apache.commons.dbcp.BasicDataSource 的区别
     ---区别:
        DriverManagerDataSource:在每个连接请求时都新建一个连接。与DBCP的BasicDataSource不同,DriverManagerDataSource提供的连接没有进行池管理。
         SingleConnectionDataSource:在每个连接请求时都返回同一个连接。虽然它不同严格意义上的池管理数据源,但我们可以把它看作只有一个连接的池
     org.apache.commons.dbcp.BasicDataSource:有连接池的功能,无论是效率还是在资源利用率上都优于DriverManagerDataSource
        (commons-dbcp.jar,commons-pool.jar,c3p0-0.9.0.4.jar)
     ---实例:
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        改为:<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        注意:用BasicDataSource时,在value标签内值不要有空格或者换行。
        包:commons-dbcp.jar, commons-pool.jar
     ---hibernate的注释与hbm
       注释:产生sessionFactory类:org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean
           映射属性:<property name="annotatedClasses">  hibernate注释时用
              <list>
               <value>com.yeepay.entity.Person</value>//指到类
               <value>com.yeepay.entity.Book</value>
              </list>
              </property>
     hbm:产生sessionFactory类:org.springframework.orm.hibernate3.LocalSessionFactoryBean
          映射属性:<property name="annotatedClasses">  
             <list>
              <value>com/yeepay/entity/person_xml.xml</value>
             </list>
            </property>
  3.关于Spring中autowire="byName" /"byType"
   如果userDAO设置了autowire="byName" ,假设ServiceImpl有一个属性名为userDAO,Spring就会在配置文件里查找有没有名字为userDAO的bean, 自动为ServiceImpl注入。
     如果bean有两个属性,一个想默认注入,一个想自定义,只要设定了autowire,然后显式的声明那个想自定义的,就可以达到要求。这就应了需求,在需要特别配置的时候就提供配置,否则给我一个默认注入。
    还可以在根部的<beans>节点写一句default-autovwrie="byName",可以让文件里的所有bean 都默认autowrie。不过有人认为开发期可以这样,但Production Server上不应该使用Autowire。但有人认为那些自定义一次的地方比如TranscationManager应该详细定义,而Dao,Service这种大量重复定义的bean就可以这样做。--------注:bean的id 或者 name都行!
   
   4.对比了5中事务处理方法还是觉得BeanNameAutoProxyCreator最为方便且好理解。不能对某一个类的某些方法做代理。
   5.用MethodInterceptor自己写了一个advice切入到其他类中,模仿事务处理。
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE beans PUBLIC    "-//SPRING//DTD BEAN//EN"    "http://www.springframework.org/dtd/spring-beans.dtd ">
      <beans default-autowire="byName">
     <!-- test class ->
     <bean id="mytarget" name="log" class="com.service.LogService"></bean>
     <bean id="golog" class="com.service.GoLog" >
      //在一个方法中调用mytarget的一个有事务的方法。
     </bean>
     <!-- 通知 ->
     <bean id="myAdvice" class="com.spring.MyAdvice"></bean>//配置这个通知,可以直接配到代理中
     <!-- pointCut ->       //配成一个切入点,可以和通知一样配到代理中
     <bean id="runAdvisor"
      class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
      <property name="advice">
       <bean class="com.spring.MyHandler" />
      </property>
      <property name="patterns">
       <list>
        <value>.*yestransaction</value>
       </list>
      </property>
     </bean>
     <!-- 代理 ->    //代理都是其中target拥有所有interceptorNames的的advice。在调用时getBean(“代理id”);
     <!--bean id="r" name="proxy"
      class="org.springframework.aop.framework.ProxyFactoryBean">
      <property name="proxyInterfaces">
       <list>
        <value>com.service.Log</value>
        <value>com.service.Go</value>
       </list>
      </property>
      <property name="target" ref="mytarget"></property>
      <property name="interceptorNames">
       <list>
        <value>runAdvisor</value>
       </list>
      </property>
     </bean->
      <!--自动代理->  
      //多对多,要是想对某些方法得要写advisor。调用用自己的id。
     <bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
      <property name="beanNames">
       <list>
        <value>mytarget</value>
        <value>golog</value>解决**** 在golog中定义方法.*yestransaction
       </list>
      </property>
      <property name="interceptorNames">
       <list>
        <value>runAdvisor</value>
       </list>
      </property>
     </bean>
     </beans>
    
     <!-- 设想:有一个target是targets(只要方法命名注意),解决对某些方法 ->解决****


-->

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics