<?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(只要方法命名注意),解决对某些方法 ->解决****
-->