为什么要用spring
Spring是基于j2ee框架. 他站在非常实用的角度帮助程序员解决了很多不需要程序员搞和程序员一直重复搞的问题. 下面我只讲能节省我们工作的地方以使得大家对spring有足够的兴趣.
1, 松耦合问题.
这个问题我不费太多笔墨. 因为太多的文章解释这个问题. 大名叫:依赖注入. 说白了就是根据配置文件动态组装复杂对象. 或许有人又问, 我就是用程序组合也很简单啊. 是的, 你程序组装简单业务的是很简单. 如果组装的对象里面包含了Ejb, 包含了JMS, 包含了远程RMI那就没有这样组装简单了. 就说到这里.不说那么多废话.
2, AOP, 面向切面编程.
这个功能我们自己是不好设计的. 这个功能大家也都知道是干什么的, 例如方法的事务管理, 用户安全验证, 日志记录, 等等. 为了避免将更多的代码放进方法中去.spring使用这个AOP来监控符合你配置的正则表达式的方法名字. 并允许在执行这个方法的前后执行你的方法. 这个是建立在spring上下文框架下的一个功能. 原理是映射机制. 如果没有上下文是不好搞的.
虽然spring AOP对于大多程序员就足够了. 但与AspectJ相比, 他只能是功能比较弱的解决方案. AspectJ提供了SpringAOP不可能实现的多种切点类型. 如果不够用,你可以引入AspectJ. 来帮助你做更多的工作.
上面两个是大的方面的一个简单的说明. Spring在更多细节中方便了大家的工作. 下面我继续依次给以说明.
3, Bean工厂节省了您自己构造工厂.
你不用再自己构造工厂了. 不用再用自己构造单例模式了. 不用自己再关心对象的创建了. 不用new对象了. 一切都直接从 上下文的框架中取就行了. 框架会帮助你构造你需要的对象. 你只需要跟上下文打交道就可以了. 当然,你多出了装配的工作. 但这是必须要付出的代价. 因为复杂性被集成在了配置里面. 使得你在开发层面只关心业务. 要是配置有可视化的工具就太好了. 但别着急, 找找, 现在只有想不到,没有找不到.
4, 集成Hibernate使用节省了事务的显式代码.
这个其实还是切面的一个好处应用. 配置进去是很简单. 事务的代码其实还是有的,只是不对显示了. 都隐藏在了模板里面. 只要你在配置里面说明使用事务就可以.
5, Spring 针对不同的数据库访问模式提供了不同的模板. 分别适用于不同的持久机制. 节省了重复代码.
包括: 针对JCA CCI的链接, 针对JDBC的, 支持命名参数的JDBC的链接, Hebernate的,针对iBATIS sqlMap的, Oraclede TopLink的. 这些模板使用方式的统一降低了程序员使用不同数据库的成本.模板的使用让你只关心数据的准备, 而看不到那些样板代码, 其实那些样板代码都还在, 只是被巧妙的隐含到了template中了.
例如: List list = jdbcTemplate.query(“select * from table1”,new Object[]{“a”,”b”},new RowMapper(){…..}); 意思表达到了.
其中对数据源的引用可以配置使用JNDI以从应用服务器中获取数据库的连接. 这样程序就可以集中处理业务逻辑而不必关心数据库的具体情况 .
如果不能从JNDI中取得, 那就必须在spring中配置一个连接池. 可以使用开源的DBCP. 这个支持多种数据库连接.
6, 数据库层面的缓存的使用.
Spring并不提供实际的缓存解决方案, 而是要以来第三方的缓存方案. 包括: EHcache
,Gigaspaces, JBoss Bache, JCS, OSCache, Coherence .无论采用哪种缓存方案, 对于spring的配置都是一样的. 但缓存的配置文件都是要分开的. 简化了使用缓存的成本.
7. 安全验证方面节省的工作.
基于多种方式的用户验证. 都节省了很多工作. 你不用再自己去配置过滤器了. Spring也是过滤器来进行安全的管理. 使用过滤器进行拦截, 然后根据你的配置注入各种安全的校验. 拦截器仅仅是拦截,他并不实际应用安全规则. 然后你就可以配置各种spring为你准备好的用户安全验证机制.
A. 基于容器的用户验证, 也就是tomcat,JBoss,Resin,Jetty的用户可以直接使用用来验证.
B. 以匿名的方式验证用户,及时用户尚未登录,仍需要用户令牌时,会比较有用.
C. 根据JA-SIG”中心认证服务”(CAS)验证身份.在用户需要单点登录时回比较有用.
D. 从数据库获取用户信息,包括用户名和密码.
E. 根据某一个轻量级目录访问协议LDAP服务进行身份验证
F. 从JAAS登录配置中获取用户信息
G. 验证某一之前验证并被记住的用户身份信息.这是的无需提示用户名和密码即可自动登录成为某一用户
H. 根据就远程服务验证用户身份
I. 用户单元测试.自动认为一个TestingAuthenticationToken是有效的. 不应用于生产环境
J. 使用X509证书验证身份.对于验证实际上是其他应用程序(比如,某一WEB服务客户端)的用户身份会比较有用.
K. 针对身份已经被运行身份管理器替换的用户进行认证.
对于上面的D可能是大多数开发者需要的. 因为大多的用户密码都存在数据中. 所以使用DaoAuthenticationProvider比较合适. 他是一个简单的认证提供者. 配置很简单, 装配上他所依赖的DAO即可.
Spring也提供了一种xml配置用户名密码的方式. 这样的用户密码比较简单. 你需要使用InMeoryDaoImpl作为Dao的实现即可达到.
如果密码是需要加密的. Spring也提供了多种加密的密码编码器. 装配到DaoAuthenticationProvider中区即可. 包括MD5,SHA, SSHA. 装配的方式可以参考其他各种文档. 你的工作只是装配. 所以节省了很多工作.
至于上面的其他各验证渠道, 请参考其他文档. 我就不废话了. 说的多了容易走题.
8, 访问 RMI , 访问 Http Invoker, 访问Hessian或者Burlap, 访问Web Service
如果要穿越防火墙是需要后三种. Hessian或者Burlap允许处理java对象进行远程访问. 但httpInvoder局限于spring的对象POJO. Spring可以直接把本地对象序列化使得本地对象可以远程访问. webService 可以多种.平台. 不管使用哪种, spring都为他们的配置提供了统一简单的配置. 使用起来非常方便. Xfire协助你访问webService简单易用.
本来使用远程服务是让人乏味的杂务, 但spring提供了对远程的服务的支持, 让使用远程服务和使用常用的JavaBean一样简单.
9, JMS的访问. 大量冗余的代码被节省了. 配置好了即可使用. 当然你需要使用activeMQ第三方的队列服务器来接受消息. JMS是非常有用的, 对于非阻塞的业务, 可以直接发送通知给activeMQ, 另外的服务可以直接去activeMQ中读取为处理的任务. 例如日志的处理, 订货通知, 发布的消息.
spring中使用不同的方法通过JMS既发送消息,也接受消息. 都必须使用JMS的链接工厂通过消息中介发送消息. 因此必须配置JMS连接工厂, 是他能够了解activeMQ.
<bean id=”connectionFactory” class=”org.apache.activemq.ActiveMQConnectionFactory”>
<property name=”brokerURL” value=”tcp://localhost:61616/>
</bean>
还要配置消息的队列或者主题, 取决于你的业务需要. 配置文件不在这里罗列了.
利用配置的bean, 使用JmsTemplate发送和接受消息. 如果不使用这个, 你需要构建大量的重复代码建立各种连接, 配置各种关系. 然后才能发送消息.
一次性的配置好JmsTemplate,并注入链接工厂.
<bean id=”jmsTemplate” class=”org.springframework.jms.JmsTemplate”>
<property name=”connectionFactory” ref=”commectionFactory” />
</bean>
然后直接使用jmsTemplate.send(………………………); 即可发送.
接受消息的不举例子了. 道理一样的.
JmsTemplate的receive()方法会查看队列或者主题中是否有消息. 如果没有消息或者消息没有达到之前程序无法进行任何事情. 只能等待是否有消息.
且更复杂的消息监听去参看更多其他文档吧. 我说的有过了.太细节了.
10 , 访问EJB所有额外的工作,你配置好之后, spring都帮你做了.但由于EJB应用的还不很宽泛.所以不做太多介绍了.
11, 访问 JNDI都非常简单了.
传统的JNDI查找对象是枯燥乏味的事情. 你要编写很多的重复代码. 必须创建一个初始上下文, 必须捕捉异常..代码于jndi查找紧密耦合,代码与特定的jndi名字绑定了.所以spring就将共同的代码集成, 让程序员集中处理业务相关.
12, 发送邮件的支持.
说实在的. Spring只是更进一层的包装了javaMail. 抽象出来MailSender接口. 配置好bean即可使用. 如果需要验证则配置好用户名密码. 否则只需要配置地址端口即可 . 配置好之后可以注入到各种需要发送邮件的bean中去. 具体发送方式,参考文档去吧.
13, 调度任务 终于不用自己构造复杂的定时器代码了. Spring通过TimerFactoryBean向应程序上下文提供对javaTimer的支持. 不用自己再搞出xml配置了. 配置格式都设计好了.非常方便. 可以调度定时任务, 可以启动定时器, 可以严师定时器启动. 也可以使用Quartz执行定时调度器. JavaTimer没有提供足够的支持这样的调度.