相信spring现在已经成为j2ee开发的首选框架,也深受广大java开发者的喜爱,它的ioc、aop以及各种扩展应用都使开发者受益。它不仅是一个开发框架,同时还把很多优秀的设计理念潜移默化的传递给了使用者...好了,具体spring有多优秀不是这篇文章的重点,以下就谈一下笔者在项目中使用spring的实际经验吧。
1 项目的哪些地方需要用到spring
这应该是一个相当大的话题,不过还是有必要阐述一下。就当前典型的j2ee应用或web应用上流行的mvc(如ssh)框架而言,spring应用在以下几个方面
核心开发框架:spring作为核心容器,通过主要组件BeanFactory并使用ioc实现对所有bean的管理。在实际应用中,首先要秉承接口模式的编程思路,定义应用类之前先定义接口,然后再定义实现类,而调用的时候则调用接口而不是实现类。同时需要配置一个或多个spring的xml配置文件,把调用接口映射到实现类。
dao端的框架支持:在三层框架模式下(web,service,dao),通过HibernateTemplate和JdbcTemplate等支持类,在dao层对jdbc以及Hibernate等主流的ORM数据库调用模式进行支持。一般都有专门的jdbc以及hibernate的配置文件对DAO层使用的bean进行设置。
service端的框架支持:在serivce层通过ioc进行bean的管理配置,同时进行事务控制的定义。
aop:利用拦截器配置管理特性
jndi:利用spring的context组件对jndi进行定义,通常用于数据库连接池的配置和查找
其他:spring1.2版本的mvc组件是针对web端的应用框架,尽管理念非常oop,不过实际使用的时候确实不如struts2好使,spring 2.0以后的mvc据说有很大改进,以后有机会再用吧。另外spring的定时任务(job)也经常用到,后边会有提及。
2 spring的orm组件的使用经验
ssh框架的一个典型应用,通过HibernateTemplate实现spring与hibernate的集成。一般都是通过在配置文件向继承HibernateDaoSupport的dao实现类注入sessionFactory,这个sessionFactory实现类一般被定义为LocalSessionFactoryBean,而LocalSessionFactoryBean这个类也属于spring的hibernate支持包,它的一个重要属性是dataSource,对应的是jdbc的DataSource接口,而这个dataSource又可以通过ioc的方式注入实际的实现类,这个类既可以是各种java连接池的DataSource实现类,也可以是JndiObjectFactoryBean--spring用于进行数据源查找的jndi实现类。综上所述,正式由于这一连串的联系,实现了hibernate模式下的数据库接入。而jdbc模式也是如此联系,不同的是spring使用JdbcTemplate类进行支持。在使用中一些细节需要注意,比如
如何实现批量更新:HibernateTemplate的bulkUpdate方法可以用hql语句直接进行批量更新
对结果列表进行加工:不论通过jdbc还是hibernate方式,如果需要对find方法取得的列表中的对象进行加工,显然使用回调模式进行效率更高。实际上如果使用HibernateTemplate并且希望查询出的结果不是对象列表而是数组列表,那么也可以使用回调,如下:
String hql = "select t.id,t.name from test t";
List list = (List) this.getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws SQLException, HibernateException {
SQLQuery query = session.createSQLQuery(sql);
List children = query.list();
return children;
}
});
Iterator it = list.iterator();
while(it.hasNext()){
Object[] obj = (Object[])it.next();
System.out.println("id:" + obj[0]);
//do some business here
}
如上述代码所示,某些时候我们希望直接使用字段来进行逻辑处理,那么HibernateTemplate的find方法显然是不合适的,而回调模式返回的list中的内容是对象数组
调用存储过程:HibernateTemplate可以通过回调调用存储过程
hibernateTemplate.execute(new HibernateCallback(){
public Object doInHibernate(Session session) throws SQLException{
CallableStatement cs = session.connection().prepareCall("{call usr.someProc}");
cs.executeUpdate();
return null;
}
}
);
3 spring的事务控制
在项目中,一般使用spring的声明式方法控制数据库事务,定义数据库事务只需要通过配置文件中配置即可,这种模式的技术基础是基于AOP的。
事务配置定义:在三层构架中,通常都在service层进行业务逻辑处理,以及事务控制。因此spring在service层可以单独定义一个配置文件,映射service层中使用的bean,并且在定义这个bean的配置同时进行事务声明,有多种方式。最直接的方式是定义这个bean的实现类为TransactionProxyFactoryBean--spring的事务控制代理,这种事务配置可以参见下面的代码例子:
<bean id="someBusinessBean"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="target"><ref bean="someBusinessBeanImpl"/></property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED,-MyCheckedException</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
在上面的代码中定义了someBusinessBean这个bean,其中target属性中定义实际的业务接口实现类。并且在transactionAttributes属性中针对method进行事务声明,最常用的声明是PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。另外可以定义只读事务readOnly,用于只读的数据库操作。同时我们还注意到事务定义中包含了异常情况的配置:如果出现MyCheckedException这个自定义异常,则数据库进行回滚。
还有一种方式是继承式事务定义,例子如下:
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED,-MyCheckedException</prop>
<prop key="update*">PROPAGATION_REQUIRED,-MyCheckedException</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="someBusinessBean" parent="txProxyTemplate">
<property name="target">
<bean class="com.myBusi.someBusinessBeanImpl">
<property name="dao" ref="dao"/>
</bean>
</property>
</bean>
可以看出,这种方式先使用一个父类作为事务控制的统一定义,然后具体的业务bean通过继承来实现事务的配置。其实这2中配置方式并没有本质的区别,只是第二种定义起来会省事一点。
另外在实际项目中有一个发现,在websphere6.0的容器下部署的web应用,使用websphere自带的数据库连接池,当spring事务配置为readOnly,在数据量比较大,并且有一定并发量时会导致websphere连接池抛出异常,并导致性能严重下降。去掉readOnly选项就恢复正常了,这种情况不容易在测试环境重现,因此只能去掉readOnly选项,发现去掉以后性能也没有太多的下降。
另外如果一些特殊的场景直接在代码中进行事务提交(比如大批量插入数据),则需要用到spring的编程事务,PlatformTransactionManager这个类是spring针对编程式事务的支持类。
4 spring与数据库连接池
在spring中可以很方便的配置数据库连接池,一种是直接配置连接池,以proxool连接池为例,配置代码如下:
<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="alias"><value>mydb</value></property>
<property name="user"><value>test</value></property>
<property name="password"><value>test</value></property>
<property name="driver"><value>com.mysql.jdbc.Driver</value></property>
<property name="driverUrl"><value>jdbcUrl</value></property>
<property name="minimumConnectionCount"><value>10</value></property>
<property name="maximumConnectionCount"><value>20</value></property>
<property name="prototypeCount"><value>1</value></property>
<property name="houseKeepingSleepTime"><value>90000</value></property>
</bean>
如上,在配置文件中定义了dataSource这个bean,映射到ProxoolDataSource这个proxool的数据库数据源的实现类,在属性里的配置就是连接池的一些基本参数
我想更常用的还是使用jndi作为数据源,配置代码如下:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>jdbc/mydblink</value></property>
</bean>
在上面的代码中使用JndiObjectFactoryBean作为数据源,而这个数据源实际负责实现jndi的查找,在容器中查找到jndiName属性定义的名称所对应的实际的数据源,来提供给应用进行调用。实际的数据源则是在tomcat、weblogic、websphere等中间件容器中定义的。
5 其他的spring心得
直接获得bean:有很多时候,我们不希望频繁的修改配置文件以及增加set方法来得到spring容器定义的bean,那么可以使用ApplicationContext的getBean方法来直接获取bean的实例。
job定义:spring支持定时计划任务,一种是一次性触发,更有用的一种的定时轮询,写法例子如下:
"0 0/5 14-18 * * ?" 在每天下午2点下午6点期间的每5分钟触发
OpenSessionInView:spring为了支持在页面中延迟加载事务的一个filter,建议谨慎使用,容易对数据库连接性能造成瓶颈
总结:以上列举了一些项目中使用spring的地方,相信还有更多的没有列举出来,在以后的文章里再补充吧
广告时间: 轻松阅读,尽在
阅读地带
分享到:
相关推荐
Java,作为世界上最流行的编程语言之一,拥有广泛的应用领域,从企业级应用到移动开发,无处不在。这个CHM文档很可能是对Java基础知识、进阶概念、实战技巧的全面讲解。以下是一些可能涵盖的知识点: 1. **Java基础...
"java程序员的那些事儿"这个主题涵盖了许多方面,包括学习路径、技术栈、开发实践、职业发展等。让我们深入探讨一下Java程序员在日常工作中的关键知识点。 首先,学习Java编程语言是基础。Java以其“一次编写,到处...
### Java编程那些事儿 #### 知识点概览 本文基于一篇关于Java编程的文章进行提炼与总结,原文章由一位经验丰富的程序员撰写,主要围绕Java编程的基础知识、学习方法及技巧展开讨论。以下是对该文章内容的核心知识...
本文将深入探讨"Spring 3.0 + Hibernate 3.5整合那些事儿",结合给出的标签"源码"和"工具",我们将讨论如何将这两个强大的框架结合在一起,以及在整合过程中可能遇到的问题和解决方案。 首先,Spring是一个全面的...
其次,"西西软件.txt"和"西西软件下载.url"这两个文件可能提供了关于Java开发环境的安装和配置信息,例如如何下载和安装Java Development Kit (JDK),配置环境变量PATH和JAVA_HOME,以及如何设置IDE(集成开发环境)...
Java程序员在日常工作中所涉及的知识点广泛而深入,涵盖了编程语言基础、开发环境搭建、软件工程实践、项目管理以及各种框架和技术应用。以下是对这些关键领域的详细解释: 1. **Java编程语言基础**:Java是一种...
- 探讨了Java Web开发的核心技术和最佳实践,包括Servlet、JSP、Spring MVC等框架的应用。 - 适合已经掌握基本Java技能,并希望向Web开发方向发展的开发者。 2. **深入体验JAVA Web开发内幕-高级特性**: - ...
4. **Java基础**:包括语法、类、对象、异常处理、集合框架等,这是所有Java开发的基础。 5. **单元测试**:JUnit或其他测试框架的使用,编写和理解测试用例对于保证代码质量至关重要。 6. **Maven或Gradle**:...
Spring框架是Java开发中非常重要的一个部分,它提供了依赖注入、AOP(面向切面编程)、数据访问和Web服务等功能。对于数据库操作,可能还会涉及SQL语言和ORM(对象关系映射)技术,如Hibernate。 除了技术知识,...
- **了解行业现状**:求职者应该了解当前IT行业的趋势和发展方向,尤其是Java开发领域的需求变化。 - **评估个人技能**:求职者需要客观评估自己的技能水平,包括编程能力、项目经验等方面。 - **了解目标岗位**:...
在项目开发过程中,Java程序员通常会使用IDE(集成开发环境),如Eclipse或IntelliJ IDEA,这些工具提供了代码提示、调试、版本控制等强大功能,极大提高了开发效率。同时,他们需要熟练运用Git进行版本管理,确保...
通过以上内容的梳理,我们可以看出,《Java程序员+上班那点事儿》这本书旨在帮助即将步入职场或已从事Java开发工作的人员更好地理解和适应软件行业,从求职准备到职业规划提供了全方位的指导和支持。无论是技术层面...
《Java程序员+上班那点事儿》这本书主要面向的是正在或者准备进入Java开发领域的读者,它以生动的故事和实例,深入浅出地讲述了Java程序员在工作中可能遇到的各种问题和解决之道。书中涵盖了技术学习、项目实战、...
首先,"Java程序员上班那点事儿"这本书可能涵盖了Java开发人员在日常工作中的常见问题和挑战,包括代码质量、性能优化、异常处理、多线程编程等主题。这本书可能会深入讨论如何在实际项目中应用Java,以及如何解决...
Java程序员实习的主要目的是深化对Java开发的理解,掌握核心技术和实践经验。在实习期间,实习生将学习如何正确使用SQL,以及如何有效地应用SSH和其他企业级应用框架,例如Hibernate、Struts和Spring,同时熟悉相关...
在IT行业中,Java程序员的工作是复杂且多元化的。作为一个Java程序员,你需要掌握一系列的技术和实践,以便在工作中高效地解决问题并创造出...不断学习和实践这些知识点,将使你在Java开发的道路上不断进步,收获更多。
在Java开发中,有许多工具协助程序员提高效率,例如IDE(集成开发环境)如Eclipse、IntelliJ IDEA,它们提供了代码编辑、调试、重构等功能;版本控制系统如Git,用于管理代码变更历史;构建工具如Maven或Gradle,...