﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-calmJava-文章分类-Spring</title><link>http://www.blogjava.net/calmJava/category/47505.html</link><description>StillWaterRunsDeep</description><language>zh-cn</language><lastBuildDate>Sat, 08 Jan 2011 20:08:29 GMT</lastBuildDate><pubDate>Sat, 08 Jan 2011 20:08:29 GMT</pubDate><ttl>60</ttl><item><title>spring_8</title><link>http://www.blogjava.net/calmJava/articles/342377.html</link><dc:creator>calmJava</dc:creator><author>calmJava</author><pubDate>Wed, 05 Jan 2011 13:02:00 GMT</pubDate><guid>http://www.blogjava.net/calmJava/articles/342377.html</guid><wfw:comment>http://www.blogjava.net/calmJava/comments/342377.html</wfw:comment><comments>http://www.blogjava.net/calmJava/articles/342377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calmJava/comments/commentRss/342377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calmJava/services/trackbacks/342377.html</trackback:ping><description><![CDATA[<p>1:<br />
spring 的声明式事务:<br />
(1):配置数据源<br />
&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br />
&nbsp;&lt;property name="driverClassName" value="org.git.mm.mysql.Driver"/&gt;<br />
&nbsp;&lt;property name="url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;amp;characterEncoding=UTF-8"&gt;&lt;/property&gt;<br />
&nbsp;&lt;property name="username" value="root"&gt;&lt;/property&gt;<br />
&nbsp;&lt;property name="password" value="root"&gt;&lt;/property&gt;<br />
&nbsp;&lt;!-- 连接池启动时的初始值 --&gt;<br />
&nbsp;&lt;property name="initialSize" value="1"/&gt;<br />
&nbsp;&lt;!-- 连接池的最大值 --&gt;<br />
&nbsp;&lt;property name="maxActive" value="500"/&gt;<br />
&nbsp;&lt;!-- 最大空闲值.当经过一个高峰期时间后,连接池可以慢慢将已经用不到的连接释放一部分,一致减少到maxIdle为止 --&gt;<br />
&nbsp;&lt;property name="maxIdle" value="2"/&gt;<br />
&nbsp;&lt;!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请一些连接,以免洪峰到来时来不及申请 --&gt;<br />
&nbsp;&lt;property name="minIdle" value="1"/&gt;<br />
&lt;/bean&gt;<br />
(2):配置事务:<br />
配置事务管理器:<br />
&lt;bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />
&nbsp;&lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&lt;/bean&gt;<br />
(3):<br />
在Spring配置文件加入事务命名空间<br />
xmlns:tx="http://www.springframework.org/schema/tx"</p>
<p>http://www.springframework.org/schema/tx <br />
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd<br />
(4):采用注解方式配置事务所需的注解处理器<br />
&lt;tx:annotation-driven transaction-manager="txManager"/&gt;</p>
<p>(5):为业务bean注入数据源</p>
<p>(6)<br />
@Transactional 被声明的类的每个方法将会在同一个事务中执行.<br />
在需要事务执行环境的业务逻辑层需要使用 @Transactional 注解</p>
<p><br />
2:<br />
使用属性文件保存数据库连接信息<br />
需要在Spring配置文件中配置的元素为:<br />
&lt;context:property-placeholder location="classpath:jdbc.properties"/&gt;<br />
加入classpath 的目的为高速Spring容器文件在类路径下<br />
然后将在Spring配置文件中的元素以${名称}代替属性文件的相应的键即可</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/calmJava/aggbug/342377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calmJava/" target="_blank">calmJava</a> 2011-01-05 21:02 <a href="http://www.blogjava.net/calmJava/articles/342377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring_9</title><link>http://www.blogjava.net/calmJava/articles/342375.html</link><dc:creator>calmJava</dc:creator><author>calmJava</author><pubDate>Wed, 05 Jan 2011 13:01:00 GMT</pubDate><guid>http://www.blogjava.net/calmJava/articles/342375.html</guid><wfw:comment>http://www.blogjava.net/calmJava/comments/342375.html</wfw:comment><comments>http://www.blogjava.net/calmJava/articles/342375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calmJava/comments/commentRss/342375.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calmJava/services/trackbacks/342375.html</trackback:ping><description><![CDATA[<p>1:<br />
异常类型: checked 异常(例外) 和 unchecked异常(例外)<br />
checked 异常: 除运行期异常外的其他异常方法 声明为throw Exception 的异常,则Spring默认不会回滚 <br />
unchecked 异常: 即运行期异常 RuntimeException Spring 默认会回滚 </p>
<p>2:<br />
改变Spring的默认事务行为:<br />
(1):使Spring回滚checked例外(默认不会滚):<br />
在方法的声明上标注<br />
@Transactional(rollbackFor=异常的名称.class)<br />
其中异常的名称为方法抛出的异常(例外)的类名称<br />
则Spring在遇到此checked异常时,就会回滚事务 </p>
<p>(2):使Spring不回滚unchecked 例外(默认回滚)<br />
在方法的声明上标注<br />
@Transactional(noRollbackFor=RuntimeException.class)<br />
则在方法遇到unchecked例外(运行期异常)时,则会提交事务<br />
或者使用 noRollbackForClassName="异常的名称" 和 rollbackForClassName="异常的名称" 来指定</p>
<p>3:<br />
以下的事务可以在 @Transactional(propagation=Propagation.xxx) 中的xxx即为以下事务的类型.<br />
Spring事务的分类:<br />
REQUIRED,NOT_SUPPORTED,REQUIRESNEW,MANDATORY,SUPPORTS,NERVER,NESTED<br />
REQUIRED:<br />
业务方法需要在一个事务中运行.如果方法运行时,已经处在一个事务中,那么假如到该事务,否则为自己创建一个新的事务.<br />
NOT_SUPPORTED:<br />
声明方法不需要事务.如果方法没有关联到一个事务,容器不会为它开启事务.如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行.<br />
REQUIRESNEW:<br />
属性表明不管是否存在事务,业务方法总会为自己发起一个新的事务,容器不会为它开启事务.<br />
如果方法已经存在一个事务中,则原有事务被挂起,新的事务会被创建,直到方法执行结束,新的事务才算结束.原先事务才会恢复执行.<br />
MANDATORY:<br />
该属性指定业务方法只能在一个已近存在的事务中执行,业务方法不能发起自己的事务.如果业务方法没有在事务的环境下调用,容器就会抛出例外.<br />
SUPPORTS:<br />
这一事务表明属性,如果业务方法在某个事务范围内被调用,则方法称为该事务的一部分.如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行.<br />
NEVER:<br />
指定业务方法绝对不能再事务范围内执行.如果业务方法在某个事务中执行,容器会抛出异常,只有业务方法没有关联到任何事务,才能正常执行.<br />
NESTED:<br />
如果一个活动的事务存在,则运行一个嵌套的事务中.如果没有活动事务,则按REQUIRED属性执行.它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。但外部事务的回滚会造成内部事务的回滚. 它只对DataSourceTransactionManager事务管理器起效.</p>
<p>4:<br />
@Transactional(timeout=30)<br />
中指定事务的超时时间,一般情况下不用设置</p>
<p>5:<br />
@Transactional(readOnly="")<br />
在只读事务中使用,可以提高效率,但不可以执行增删改.</p>
<p>6:<br />
@Transactional(isolation=Isolation.DEFAULT);<br />
指定数据库的事务隔离级别:主要由底层数据库实现.<br />
包括种类:<br />
Read Uncommited : 读未提交数据(会出现脏数据,不可重复读和幻读)<br />
Read Commited : 读已提交数据(会出现不可重复读和幻读) (SQLServer 默认级别)<br />
Repeatable Read : 可重复读(会出现幻读) (MySQL 默认级别)(一般情况下是这种级别)<br />
Serializable : 串行化<br />
这几种级别是由数据库的不同的锁来实现:如 共享锁,更新锁,排他锁</p>
<p>脏读: 一个事务读取到另一个事务未提交的更新数据.</p>
<p>不可重复读: 在同一个事务中,多次读取同一数据返回的结果有所不同.即:后续读取可以读取另一事物已提交的更新数据.<br />
相反,"可重复读"在同一事务多次读取数据时,能够保证所读取数据一样,也就是说,后续数据不能读到另一事物已提交的更新数据.<br />
可重复读在数据库采取的技术为"快造"技术</p>
<p>幻读:一个事物读取都另一事物已提交的insert数据.<br />
<br />
<br />
7:<br />
使用XML方式配置Spring事务:<br />
&lt;aop:config&gt;<br />
&nbsp;&lt;aop:pointcut id="transactionPointcut" expression="execution(* cn.itcast.service..*.*(..))"/&gt;<br />
&nbsp;&lt;aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/&gt;<br />
&lt;/aop:config&gt;<br />
&lt;tx:advice id="txAdvice" transaction-manager="txManager"&gt;<br />
&nbsp;&lt;tx:attributes&gt;<br />
&nbsp;&nbsp;&lt;tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/&gt; &lt;!-- 对读取方法采用只读 事务 --&gt;<br />
&nbsp;&nbsp;&lt;tx:method name="*"/&gt; &lt;!-- 其他按照默认设置 如事务隔离级别 事务类型 --&gt;<br />
&nbsp;&lt;/tx:attributes&gt;<br />
&lt;/tx:advice&gt;<br />
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/calmJava/aggbug/342375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calmJava/" target="_blank">calmJava</a> 2011-01-05 21:01 <a href="http://www.blogjava.net/calmJava/articles/342375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring_7</title><link>http://www.blogjava.net/calmJava/articles/342374.html</link><dc:creator>calmJava</dc:creator><author>calmJava</author><pubDate>Wed, 05 Jan 2011 13:00:00 GMT</pubDate><guid>http://www.blogjava.net/calmJava/articles/342374.html</guid><wfw:comment>http://www.blogjava.net/calmJava/comments/342374.html</wfw:comment><comments>http://www.blogjava.net/calmJava/articles/342374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calmJava/comments/commentRss/342374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calmJava/services/trackbacks/342374.html</trackback:ping><description><![CDATA[<p>1:<br />
使用XML方式来配置Spring AOP</p>
<p>2:<br />
Spring aop 应用方面:<br />
例如:权限系统、运行期监控</p>
<p>3:<br />
&lt;bean id="aspectbean" class="cn.rui.aop.XmlInterceptor"/&gt;<br />
&lt;aop:config&gt;<br />
&nbsp;&lt;aop:aspect id="asp" ref="aspectbean"&gt;<br />
&nbsp;&nbsp;&lt;aop:pointcut id="mycut" expression="execution(* com.rui..*.*(..))"/&gt;<br />
&nbsp;&nbsp;&lt;aop:before pointcut-ref="mycut" method="doAccessCheck"/&gt;<br />
&nbsp;&nbsp;&lt;aop:after-returning pointcut-ref="mycut" method="doAfterReturning"/&gt;<br />
&nbsp;&nbsp;&lt;aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"/&gt;<br />
&nbsp;&nbsp;&lt;aop:after point-ref="mycut" method="doAfter"/&gt;<br />
&nbsp;&nbsp;&lt;aop:around point-ref="mycut" method="doBasicProfiling"/&gt;<br />
&nbsp;&lt;/aop:aspect&gt;<br />
&lt;/aop:config&gt;</p>
<p>4:<br />
对于执行的表达式 execution(* com.rui..*.*(..)) execution(1 2..3.4(5))</p>
<p>中对于1 为方法的返回值 可以指定任意类型 * 代表所有类型, 其他类型用包名 + 类名如java.lang.String,空为void, 若取非某种类型则为 ! 加上 类型即可 如: !java.lang.String 或 !void</p>
<p>对于2 为包名 对于包名后的两个点意为包含所有的子包,也可直接为包名+ 类名</p>
<p>对于3为类名 可以写 * 代表所有的类,也可指定特定的类 直接类名即可</p>
<p>对于4为方法名 * 代表所有方法 ,也可指定特定的方法</p>
<p>对于 5 为方法的参数 可以指定 .. 代表所有的方法,对于方法的比如方法的第一个参数必须为java.lang.Integer 的则表达式为 (java.lang.Integer,..)<br />
对于最后一个参数必须为java.lang.String则为(..,java.lang.String) 前面的两个点代表String类型前可能有也可能没有</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/calmJava/aggbug/342374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calmJava/" target="_blank">calmJava</a> 2011-01-05 21:00 <a href="http://www.blogjava.net/calmJava/articles/342374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring_6</title><link>http://www.blogjava.net/calmJava/articles/342372.html</link><dc:creator>calmJava</dc:creator><author>calmJava</author><pubDate>Wed, 05 Jan 2011 12:59:00 GMT</pubDate><guid>http://www.blogjava.net/calmJava/articles/342372.html</guid><wfw:comment>http://www.blogjava.net/calmJava/comments/342372.html</wfw:comment><comments>http://www.blogjava.net/calmJava/articles/342372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calmJava/comments/commentRss/342372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calmJava/services/trackbacks/342372.html</trackback:ping><description><![CDATA[<p>1：<br />
AOP中的概念：<br />
Aspect(切面)<br />
：指横切性关注点的抽象即为切面，它与类类似，只是两者关注点不一样，类是对物体特征的抽象，而切面是横切性关注点的抽象。<br />
joinpoint(连接点)<br />
:所谓连接点是指那些被拦截到的点。在spring中，这些点指的是方法，因为spring只支持方法类型的连接点，实际上joinpoint还可以是field或类构造器。<br />
Pointcut（切入点）<br />
：所谓切入点是指我们要对那些joinpoint进行拦截的定义。<br />
Advice（通知）<br />
所谓通知是指拦截到joinpoint之后所要做的事情就是通知。通知分为前置通知，后置通知，异常通知，最终通知，环绕通知。<br />
Target(目标对象)<br />
:代理的目标对象<br />
Weave(织入)<br />
:只讲aspects应用到target对象并导致proxy对象创建的过程成为织入。<br />
Introduction(引入)<br />
:在不修改类代码的前提下，Introduction可以再运行期为类动态的添加一些方法或Field</p>
<p>2:<br />
加入Spring AOP的支持<br />
(1):加入jar包，在配置文件中导入aop命名空间，加入&lt;aop:aspectj-autoproxy/&gt;元素<br />
(2):定义切面类 <br />
(3):在切面类中加入注解: </p>
<p>: 在类前的注解<br />
@Aspect</p>
<p>: 声明一个切入点<br />
@Pointcut("execution(* cn.itcast.service..*.*(..))")<br />
private void anyMethod() {} // 定义切入点的名称是通过方法的定义来定义的.</p>
<p>:定义前置通知<br />
@Before("anyMethod() &amp;&amp; args(userName)") 其中 userName 为限制方法的参数必须为String 类型的<br />
public void doAccessCheck(String userName) {}</p>
<p>:定义后置通知<br />
@AfterReturning(pointcut="anyMethod()",returning="revalue")<br />
public void doReturnCheck(String revalue) {}</p>
<p>:定义例外通知<br />
@AfterThrowing(pointcut="anyMethod()",throwing="ex")<br />
public void doExceptionAction(Exception ex){}</p>
<p>:定义最终通知<br />
@After("anyMethod()")<br />
public void doReleaseAction() {}</p>
<p>:环绕通知<br />
@Around("anyMethod()")<br />
public doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {<br />
&nbsp;return pjp.proceed();<br />
}</p>
<p>以上 anyMethod() 为切入点的名称, 为要应用的切入点<br />
args 、returning、throwing 为可不定义的可选参数,但被标注方法也要跟着参数的有无而改变方法的参数.<br />
环绕通知的方法的签名是死格式</p>
<p>3:<br />
把类加入Spring管理:<br />
在Spring配置文件中加入或用 @Component 组件注解进行标注即可.</p>
<p>4:<br />
通知流程图:<br />
// 环绕通知<br />
// 前置通知<br />
try{<br />
&nbsp;// 方法执行<br />
&nbsp;// 后置通知<br />
}catch(Exception e){<br />
&nbsp;// 例外通知<br />
}finally{<br />
&nbsp;// 最终通知<br />
}</p>
<p>5: <br />
第 19 集<br />
</p>
<img src ="http://www.blogjava.net/calmJava/aggbug/342372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calmJava/" target="_blank">calmJava</a> 2011-01-05 20:59 <a href="http://www.blogjava.net/calmJava/articles/342372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring_5</title><link>http://www.blogjava.net/calmJava/articles/342373.html</link><dc:creator>calmJava</dc:creator><author>calmJava</author><pubDate>Wed, 05 Jan 2011 12:59:00 GMT</pubDate><guid>http://www.blogjava.net/calmJava/articles/342373.html</guid><wfw:comment>http://www.blogjava.net/calmJava/comments/342373.html</wfw:comment><comments>http://www.blogjava.net/calmJava/articles/342373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calmJava/comments/commentRss/342373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calmJava/services/trackbacks/342373.html</trackback:ping><description><![CDATA[<p>1:<br />
@Retention(RetentionPolicy.RUNTIME)<br />
@Target({ElementType.FIELD,ElementType.METHOD})<br />
public @interface ResourceAnnotation {<br />
&nbsp;String name() default "";<br />
}</p>
<p>2:<br />
返回属性的类型 是否是 指定参数的类型或者是指定参数的基类(即把参数强转成properdesc类型是否可以，可以则返回true，否则返回false)<br />
PropertyDescriptor properdesc = Introspector.getBeanInfo(Bean.class).getPropertyDescriptors();<br />
properdesc.getPropertyType().isAssignableFrom(other.class);</p>
<p>3:<br />
getDeclaredFields() 得到所有类中声明的字段（但不包括从父类继承过来的类型）</p>
<p>4:<br />
用注解来实现依赖注入的规则：<br />
（1）：在 字段 或 setter 方法上注明注解<br />
(2):读取XML文件<br />
（3）：得到所有的属性 遍历 赋值<br />
&nbsp;(4): 得到所有的字段 判断是否有注解 赋值</p>
<p><br />
5:<br />
@Autowired(required=false) 中 required 默认为true，指的是当找不到时会抛出异常，当为false时，会给其赋值为null</p>
<p>6:<br />
自动装配的几种方式：<br />
byType: 按类型装配，可以根据属性的类型，在容器中寻找跟该类型匹配的bean。<br />
如果发现多个，那么将会抛出异常。如果没有找到，即属性值为null<br />
byName: 按名称装配，可以根据属性的名称，在容器中寻找跟该属性名相同的bean，<br />
如果没有找到，即属性为null<br />
constructor与byType的方式类似，不同之处在于它应用于构造函数。如果在容器中没有找到与构造器参数类型一致的bean，那么将会抛出异常。<br />
autodetect: 通过bean类的自省机制（introspection）来决定是使用constructor还是<br />
byType方式进行自动装配。如果没有发现默认的构造器，那么将使用byType方式。</p>
<p>7:<br />
@Service 用于标注业务层组件<br />
@Controller 用于标注控制层组件(如Struts的action)<br />
@Repository 用于标注数据访问组件 即DAO组件<br />
@Component 泛指组件，当组件不好归类的时候，我们可以使用这个注解进行标注。</p>
<p><br />
8:<br />
使用Spring classpath 自动扫描 方式 把组件纳入spring容器中管理 的步骤：<br />
一：加入context命名空间&nbsp; <br />
二：在XML文件中加入 元素 &lt;context:component-scan base-package="cn.itcast"/&gt; 注册Spring自动扫描处理器,这个元素默认注册了以前&lt;context:annotation-config /&gt;元素所注册的所有处理器<br />
三：在DAO类前加入 @Repository 注解,在Service类前加入 @Service 注解，在控制组件类前加入 @Control 注解 <br />
四：注解所注明的类默认为单例 即 @Scope("singleton") ,如果需要，可以用 @Scope("prototype") 来使用 原型模式（每一次请求，可以标注在 @Control 上）<br />
五：可以使用 @PostContruct 来标注初始化的方法 ，使用 @PreDestory 来标注销毁的方法 。其 @PostContruct 等同于 以前在XML文件中写的 init-method="" 注解，其 @PreDestory 注解等同于 在xml文件中配置的 destory-method="" 元素<br />
六：要使其执行 @PreDestory 所标注的方法则使用 单例singleton模式，而不是原型prototype模式</p>
<p>9:<br />
使用cglib 来创建没有实现接口的类的代理对象<br />
一：加入 cglib-nodep-2.1_3.jar 文件<br />
二：Enhancer enhancer = new Enhancer();<br />
enhancer.setSuperclass(要代理的类);<br />
enhancer.setCallback(实现MethodInterceptor接口的类);</p>
<p>四：写一个实现 MethodInterceptor 接口的类，并且实现其方法</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/calmJava/aggbug/342373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calmJava/" target="_blank">calmJava</a> 2011-01-05 20:59 <a href="http://www.blogjava.net/calmJava/articles/342373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring_4</title><link>http://www.blogjava.net/calmJava/articles/342370.html</link><dc:creator>calmJava</dc:creator><author>calmJava</author><pubDate>Wed, 05 Jan 2011 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/calmJava/articles/342370.html</guid><wfw:comment>http://www.blogjava.net/calmJava/comments/342370.html</wfw:comment><comments>http://www.blogjava.net/calmJava/articles/342370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calmJava/comments/commentRss/342370.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calmJava/services/trackbacks/342370.html</trackback:ping><description><![CDATA[<p>1：<br />
通过元素来创建查询路径<br />
Xpath xElementSub = element.createXPath("ns:property");<br />
element.setNamespaceURIs(nsMap);<br />
List&lt;Element&gt; subElements = xElementSub.selectNodes(element); // 注意是 element 不是document<br />
其中property 是相对于element 的相对路径</p>
<p>2:<br />
PropertyDescriptor[] propDesc = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();<br />
ConvertUtils.convert(value,propDesc[0].getPropertyType()); // 转换属性的类型</p>
<p>3:<br />
ProperyDescriptor<br />
Properties props = new Properties();<br />
props.load(this.getClass().getResourceAsStream("相对路径如：config.properties或者：绝对路径: /包名/config.properties")</p>
<p>4:<br />
对于集合的类型的注入：<br />
&lt;property name="sets"&gt;<br />
&nbsp;&lt;set&gt;<br />
&nbsp;&nbsp;&lt;value&gt;set1&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;value&gt;set2&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;value&gt;set3&lt;/value&gt;<br />
&nbsp;&lt;/set&gt;<br />
&lt;/property&gt;<br />
&lt;property name="lists"&gt;<br />
&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&lt;value&gt;list1&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;value&gt;list2&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;value&gt;list3&lt;/value&gt;<br />
&nbsp;&lt;/list&gt;<br />
&lt;/property&gt;<br />
&lt;property name="props"&gt;<br />
&nbsp;&lt;props&gt;<br />
&nbsp;&nbsp;&lt;prop key="key1"&gt;value1&lt;/prop&gt;<br />
&nbsp;&nbsp;&lt;prop key="key2"&gt;value2&lt;/prop&gt;<br />
&nbsp;&nbsp;&lt;prop key="key3"&gt;value3&lt;/prop&gt;<br />
&nbsp;&lt;/props&gt;<br />
&lt;/property&gt;<br />
&lt;property name="map"&gt;<br />
&nbsp;&lt;map&gt;<br />
&nbsp;&nbsp;&lt;entry key="key-1" value="value-1"&gt;<br />
&nbsp;&nbsp;&lt;entry key="key-2" value="value-3"&gt;<br />
&nbsp;&nbsp;&lt;entry key="key-2" value="value-3"&gt;<br />
&nbsp;&lt;/map&gt;<br />
&lt;/property&gt;</p>
<p>5:<br />
使用构造器进行bean的配置<br />
（1）：在实体bean中创建构造函数<br />
public PersonServiceBean(PersonDao personDao, String name) {<br />
&nbsp;this.personDao = personDao;<br />
&nbsp;this.name = name;<br />
}<br />
(2): 在配置文件中配置，根据构造函数的索引进行配置，索引从0开始<br />
&lt;constructor-arg index="0" ref="personDao"&gt;&lt;/constructor-arg&gt;<br />
&lt;constructor-arg index="1" value="zhangsan"&gt;&lt;/constructor-arg&gt;</p>
<p>6:<br />
使用字段Field注入：<br />
@Autowired 默认按类型装配，如果想使用名称装配，可以结合 @Qualifier注解一起使用<br />
eg:<br />
@Autowired @Qualifier("personDaoBean")<br />
private PersonDao personDao;<br />
@Resource 如果指定name属性则根据name，否则按照标注的属性名称进行寻找，<br />
当找不到与名称匹配的bean才会按类型装配,可以用在字段上，也可以用在setter方法上</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/calmJava/aggbug/342370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calmJava/" target="_blank">calmJava</a> 2011-01-05 20:55 <a href="http://www.blogjava.net/calmJava/articles/342370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring_2</title><link>http://www.blogjava.net/calmJava/articles/342368.html</link><dc:creator>calmJava</dc:creator><author>calmJava</author><pubDate>Wed, 05 Jan 2011 12:54:00 GMT</pubDate><guid>http://www.blogjava.net/calmJava/articles/342368.html</guid><wfw:comment>http://www.blogjava.net/calmJava/comments/342368.html</wfw:comment><comments>http://www.blogjava.net/calmJava/articles/342368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calmJava/comments/commentRss/342368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calmJava/services/trackbacks/342368.html</trackback:ping><description><![CDATA[<p>1: <br />
控制反转:<br />
控制反转就是 应用本身不负责以来对象的创建及维护,以来对象的创建及维护是由外部容器负责的.这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转.</p>
<p>2:<br />
依赖注入:<br />
使用构造函数 或 setter 方法</p>
<p>3:<br />
事务是局限在数据库连接之内的,所以使用两个连接的方法是不能使用同一个事务的.</p>
<p>解决办法:<br />
Connection conn = null;<br />
conn.setAutoCommit(false);<br />
Bean1.update(); // 更新金额<br />
Bean2.save(); // 记录操作日志<br />
// 提交事务</p>
<p>4:<br />
如果不论更新金额是否成功,都需要记录日志,则需要使两个方法分别使用不同的事务.</p>
<p>5:<br />
Spring 声名式事务</p>
<p>保证两个方法在同一个事务中执行,在方法的前面加上:<br />
@Transactional(propagation=Propagation.Required)</p>
<p>使方法在新的事务中执行:<br />
@Transactional(propagation=Propagation.RequiredNew)</p>
<p>6:<br />
Spring 给我们带来的好处:<br />
(1): 降低组件之间的耦合度,实现软件各层之间的解耦<br />
(2): 可以使用容器提供的众多服务,如:事务管理服务,消息服务等等.<br />
当我们使用容器管理事务时,开发人员就不需要手工控制事务,也不需要处理复杂的事务传播.<br />
(3): 容器提供单利模式支持,开发人员不在需要自己编写实现代码.<br />
(4): 容器提供众多的辅助类,使这些类能够加快应用的开发:如 JdbcTemplate,HibernateTemplate<br />
(5): Spring对于主流的应用框架提供了集成支持,如:集成Hibernate,JPA,Struts等,这样更便于应用的开发.</p>
<p>7:<br />
使用Spring 提供的服务很少,应用属于轻量级<br />
使用Spring 提供的服务很多,应用属于重量级<br />
EJB 容器默认为应用提供了EJB规范中的所有的功能,所以它属于重量级的<br />
EJB 的服务包括: 安全服务, jndi服务,</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/calmJava/aggbug/342368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calmJava/" target="_blank">calmJava</a> 2011-01-05 20:54 <a href="http://www.blogjava.net/calmJava/articles/342368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring_1</title><link>http://www.blogjava.net/calmJava/articles/342367.html</link><dc:creator>calmJava</dc:creator><author>calmJava</author><pubDate>Wed, 05 Jan 2011 12:50:00 GMT</pubDate><guid>http://www.blogjava.net/calmJava/articles/342367.html</guid><wfw:comment>http://www.blogjava.net/calmJava/comments/342367.html</wfw:comment><comments>http://www.blogjava.net/calmJava/articles/342367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calmJava/comments/commentRss/342367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calmJava/services/trackbacks/342367.html</trackback:ping><description><![CDATA[<p>1: <br />
控制反转:<br />
控制反转就是 应用本身不负责以来对象的创建及维护,以来对象的创建及维护是由外部容器负责的.这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转.</p>
<p>2:<br />
依赖注入:<br />
使用构造函数 或 setter 方法</p>
<p>3:<br />
事务是局限在数据库连接之内的,所以使用两个连接的方法是不能使用同一个事务的.</p>
<p>解决办法:<br />
Connection conn = null;<br />
conn.setAutoCommit(false);<br />
Bean1.update(); // 更新金额<br />
Bean2.save(); // 记录操作日志<br />
// 提交事务</p>
<p>4:<br />
如果不论更新金额是否成功,都需要记录日志,则需要使两个方法分别使用不同的事务.</p>
<p>5:<br />
Spring 声名式事务</p>
<p>保证两个方法在同一个事务中执行,在方法的前面加上:<br />
@Transactional(propagation=Propagation.Required)</p>
<p>使方法在新的事务中执行:<br />
@Transactional(propagation=Propagation.RequiredNew)</p>
<p>6:<br />
Spring 给我们带来的好处:<br />
(1): 降低组件之间的耦合度,实现软件各层之间的解耦<br />
(2): 可以使用容器提供的众多服务,如:事务管理服务,消息服务等等.<br />
当我们使用容器管理事务时,开发人员就不需要手工控制事务,也不需要处理复杂的事务传播.<br />
(3): 容器提供单利模式支持,开发人员不在需要自己编写实现代码.<br />
(4): 容器提供众多的辅助类,使这些类能够加快应用的开发:如 JdbcTemplate,HibernateTemplate<br />
(5): Spring对于主流的应用框架提供了集成支持,如:集成Hibernate,JPA,Struts等,这样更便于应用的开发.</p>
<p>7:<br />
使用Spring 提供的服务很少,应用属于轻量级<br />
使用Spring 提供的服务很多,应用属于重量级<br />
EJB 容器默认为应用提供了EJB规范中的所有的功能,所以它属于重量级的<br />
EJB 的服务包括: 安全服务, jndi服务,</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
 <img src ="http://www.blogjava.net/calmJava/aggbug/342367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calmJava/" target="_blank">calmJava</a> 2011-01-05 20:50 <a href="http://www.blogjava.net/calmJava/articles/342367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>