




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
appfuse源码分析二(业务层) 来源网址:/j2ee/200812232.asp2008-12-23 作者:刘文涛 来源:1 Manager2 LookupManager3 RoleManager4 UserManager 和包org.appfuse.dao下的1Dao2LookupDao3RoleDao4UserDao相关方法是以工厂方法的设计模式组合的.但是他们是通过sping的IoC来实现的。例如 :在applicationContext-hibernate.xml中定义的lookupDAO:123在applicationContext-service.xml中定义的lookupManager:123在LookupManagerImpl中:1privateLookupDAOdao;23publicvoidsetLookupDAO(LookupDAOdao)4super.dao=dao;5this.dao=dao;6解释一下:一 :在bean lookupManager的定义中,它有一个属性为lookupDAO,依赖于bean lookupDAO,在类LookupManagerImpl中,它继承实现了LookupManager接口的方法:setLookupDAO(LookupDAOdao);此方法去掉set剩下的部分第一个字母小写后的名字就是lookupDAO.也就是中的name.巧合?当然不是,spring正是通过它的IoC,把lookupDAO通过配置文件传给LookupManager.从这个例子可以看到spring他通过xml格式的配置文件处理类之间的调用关系.而且可以看到在lookupManager 中 setLookupDAO(LookupDAO dao)中的参数是个接口,配置文件中12指向的是个类。可以看出,通过spring 配置的各个bean的在调用类中是个接口,spring是面向接口编程的。Manager,RoleManager,UserManager.与LookupManager类似。二 :MailEngine是与邮件管理器相关的类,spring框架对邮件服务JavaMail提供了支持。它发送邮件主要是通过org.springframework.mail.cos.CosMailSenderImpl和org.springframework.mail.javamail.JavaMailSenderImpl实现。appfuse使用的是后者。MainEngine其中的两个方法:1setMailSender(MailSendermailSender)2setVelocityEngine(VelocityEnginevelocityEngine)在配置文件applicationContext-Server.xml中1234通过这个把mailSender和velocityEngine赋予MainEngine。1 :Bean mainSender的定义:可以看到mailSender的实现为org.springframework.mail.javamail.JavaMailSenderImpl,它有三个属性 :1host2username3password它们的值是读配置文件perties读到的。具体看web/WEB-INF/applicationContext-resources.xml中的Bean propertyConfigurer,如下:12345classpath:perties6782 :Bean velocityEngine的定义:12345class67org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader89101112解释一下:Velocity是一种java模版引擎技术,允许任何人使用简单而强大的模版语言来引用定义在java代码中的对象。在spring中对它的支持是VelocityEngineFactoryBean。3 :MailEngine中的其他方法:1send(SimpleMailMessagemsg)2sendMessage(SimpleMailMessagemsg,StringtemplateName,Mapmodel)3sendMessage(StringemailAddresses,ClassPathResourceresource,StringbodyText,Stringsubject,StringattachmentName)3.1 :send(SimpleMailMessage msg)调用mailSender把msg发出去。3.2 :sendMessage(SimpleMailMessage msg, String templateName,Map model)把model中的值通过velocityEngine写到 templateName里的相应位置。把结果放到msg的文本区。然后调用send方法把msg发出去。3.3 :sendMessage(String emailAddresses,ClassPathResource resource, String bodyText, String subject, String attachmentName) 此方法的作用为;把mailSender强制转换成JavaMailSenderImpl,然后调用它的createMimeMessage()方法。创建一个类型为MimeMessage的message,根据他创建一个类型为MimeMessageHelper的类helper.然后把message的主题设为subject,text设为bodyText,attachment(附件)的文件为resource,名为attachmentName。然后用mailSender把它发出去。三 :UserExistsException :继承于 Exception的异常类,当数据库中此用户存在抛出此异常。参考UserManager 中的方法:saveUser(Useruser)throwsUserExistsException;四:UserSecurityAdvice :publicclassUserSecurityAdviceimplementsMethodBeforeAdvice,AfterReturningAdvice这里使用了spring的aop工具,spring提供的aop装备有以下几种 :1MethodBeforeAdvice(实现before装备)2AfterReturningAdvice(实现After装备)3ThrowsAdvice(Throw装备)4Methodinterceptor(Around装备).appfuse在这里使用的是MethodBeforeAdvice ,AfterReturningAdvice五 :在applicationContext-server.xml中定义了一个名为txProxyTemplate的bean,它是个抽象bean13456PROPAGATION_REQUIRED7PROPAGATION_REQUIRED8PROPAGATION_REQUIRED,readOnly91011他的类型是个事务代理工厂,erceptor.TransactionProxyFactoryBean它有两个属性 :1 :transactionManager,依赖与bean transactionManager.2 :transactionAttributes,它定义了在处理事务时的规则.1如果代理对象的方法以save开头,则ROPAGATION_REQUIRED 既事务类型为required,2以remove开头的方法的事务类型为则PROPAGATION_REQUIRED,事务类型为required.3其他为PROPAGATION_REQUIRED,readOnly.解释一下事务的概念:在EJB中,容器提供了声明性事务的支持.EJB 支持7中不同的声明性事务.1Required(如果存在事务就在事务中运行,如果没有事务生成一个新事务),2RequiredNew(无论有没有事务都要生成新事务,在自己的事务中运行),3Mandatory(事务是必须的,如果没有事务报异常),4Supports(有事务使用事物,没有事务不使用事务),5NotSupports(不能在事务中运行),6Never(不能在另一个事务意境中调用此方法)7Bean-Managed(由Bean类自己管理事务)在spring中与它们对应的是在接口org.springframework.transaction.TransactionDefinition中定义的:1intPROPAGATION_REQUIRED=0;2intPROPAGATION_SUPPORTS=1;3intPROPAGATION_MANDATORY=2;4intPROPAGATION_REQUIRES_NEW=3;5intPROPAGATION_NOT_SUPPORTED=4;6intPROPAGATION_NEVER=5;7intPROPAGATION_NESTED=6;可以看到spring没有ejb的 Bean-Magaged事务,但是它新增一个PROPAGATION_NESTED事务.如果现在存在一个事务,就在一个嵌套的事务里运行.这个只有在spring使用基于jdbc3.0的DataSourceTransactionManager时才使用.六 :在applicationContext-service.xml中定义的三个bean: 1manager2roleManager3userManager都是从txProxyTemplate继承下来的.1 :manager 的定义为:1234567可以看到它与lookupManager123的区别:前者继承txProxyTemplate,13456PROPAGATION_REQUIRED7PROPAGATION_REQUIRED8PROPAGATION_REQUIRED,readOnly91011txProxyTemplate的class是erceptor.TransactionProxyFactoryBeanmanager 的 target为org.appfuse.service.impl.BaseManager所以相对于loopupManager来说通过TransactionProxyFactoryBean实现了事务管理.roleManager 与Manager类似.2 :userManager的定义如下:12345678910PROPAGATION_REQUIRED,-UserExistsException11PROPAGATION_REQUIRED12PROPAGATION_REQUIRED,readOnly131415171819202122可以看到它继承了txProxyTemplate,但是与前面两个不同的是 :2.1 :它覆盖了txProxyTemplate的属性transactionAttributes.对于target :UserManagerImpl中以save开头的方法事务的类型为required.如果此方法抛出UserExistsException异常,则事务回滚(UserExistsException前面的-表示回滚,如果是+表示提交).2.2 :还有一个叫preInterceptors的属性,它引用beanuserSecurityInterceptor1234它有两个属性 :1: advice指向Bean userSecurityAdvice,2 : patterns为.*saveUser,userSecurityAdvice的类为就是此包下的UserSecurityAdvice.总之调用spring的userManager时,spring 会在它前面调用userSecurityAdvice.七: userSecurityAdvice的before方法:通过SecurityContextHolder取得类型为SecurityContext的上下文ctxSecurityContextctx=SecurityContextHolder.getContext();通过ctx取得类型为Authentication的对象auth.Authenticationauth=ctx.getAuthentication();Acegi为j2ee提供认证服务是通过两个接口Authentication和AuthenticationManager实现的我们这里用的是Authentication.它有下列方法:1getPrincipal(),获取用户标识(一般是用户名),2getCredentials(),证明调用者身份的凭证.(一般是密码)3getAuthorities().获取用户的角色信息.(Role集合)在前边org.appfuse.model.User实现了接口UserDetails的一些方法例如1getUsername()-此方法返回的就是用户名2getPassword()-此方法返回的就是用户密码3getAuthorities()-此方法返回用户的角色集org.appfuse.model.Role实现了接口GrantedAuthority的方法getAuthority()-此方法返回角色名继续看before方法,1 :它通过Authentication 实例取的用户授权角色集roles,然后遍历授权角色集如果授权角色集里有名为Constants.ADMIN_ROLE的角色,令boolean administrator = true.2 :接下来是:User user = (User) args0;然后把user的的名字放在String username里。3 :如果auth.getPrincipal()类型为UserDetails,则currentUser的值为auth.getPrincipal().getUsername(),否则为String.valueOf(auth.getPrincipal()。此时分情况判断:1。如果username和currentUser不等新建一个resolver对象:AuthenticationTrustResolver resolver = new AuthenticationTrustResolverImpl();通过它判断此用户类型:如果是非匿名用户:如果不是administrator 抛出AccessDeniedException 异常。2。如果username和currentUser相等,此用户不是administrator.把user的角色集放到一个Set userRoles里。把授权角色放到一个Set authorizedRoles里。如果授权角色集和角色集不等的话,抛出异常 AccessDeniedException.总之这个类的作用是是保证用户只能更新自己,而不是其他人。applicationContext-server.xml是上述类的spring文件的配置片段。主要与邮件服务,和与数据库操作相关的.appfuse.service.impl:此包下是org.appfuse.server包定义的接口的具体实现。org.appfuse.service.util:此包下的类是在具体操作过程中使用到一些对象转换类。ConvertUtil:它有如下方法:convertBundleToMap,convertListToMap,convertBundleToProperties,populateObject(Object obj, ResourceBundle rb)-把rb转换成Map map,然后把map组装到obj里然后返回obj.getOpposingObject(Object o) 此方法是处理hibernate的pojo对象与struts的form之间的转换。convert(Object o) 调用getOpposingObject取到与o想对的对象target,然后把o的所有属性值赋给target.返回target.convertLists(Object o) 此方法的作用是如果o的属性里有一个类型为list的属性,对此属性的每一个元素调用convert方法,把转换后的对象放到一个list里,然后用list重新设置此属性。返回o.CurrencyConverter是与钱相关的转换实用类。它实现Converter接口的convert方法。定义了金钱的格式为“#,#.00”convert方法,可以把String,或Double类型的value转换成格式为“#,#.00”的double类型数返回。DateUtil:它有以下属性:String defaultDatePattern:String timePattern = HH:mm;方法:String getDatePattern()-从ApplicationContext.里根据locale取得“date.format”的值。做为日期格式,放到defaultDatePattern里,如果没有“date.format”,defaultDatePattern = MM/dd/yyyy。getDate(Date aDate)-以defaultDatePattern的格式把aDate转换成字符串返回。convertStringToDate(String aMask, String strDate)-以aMask的格式把SstrDate转换成日期返回。getDateTime(String aMask, Date aDate)-以aMask的格式返回aDate的字符串表示形式。getTimeNow(Date theTime)-以timePattern的形式返回时间。Calendar getToday()-以Calendar的方式返回当时时间。getDateTime(String aMask, Date aDate)-以aMask的格式返回aDate的字符串表达。convertDateToString(Date aDate)-以“date.format”定义的格式返回aDate的字符串表达。convertStringToDate(String strDate)-以“date.format”定义的格式把strDate转换成日期返回
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024桂林理工大学辅导员招聘笔试真题
- 9.团体标准《茗冠茶-绿茶加工技术规程》意见反馈表
- 2025年TFT-LCD用偏光片合作协议书
- ABC分类法在食品安全检测中的高效管理与优化策略
- 2025年湖南大学岳麓书院学工助理招聘考试笔试试题【答案】
- 2025年嘉兴嘉睿人力招聘考试笔试试题【答案】
- 2025年事业单位招考综合基础知识全真模拟考试试题【答案】
- 2025年电火花成型机床项目发展计划
- 干部教育培训工作调研报告
- 消费者购物行为对在线时尚品牌的影响
- DB11-T 1192-2025 工作场所防暑降温技术规范
- 2025年社区工作者招聘考试(公共基础知识)经典试题及答案
- 2025年精益生产管理考试试题及答案
- 历年造价员考试试题及答案
- 2025年北京高考地理真题及答案
- 小学美术大单元教学设计与实施研究
- 山地生态治理修复项目可行性研究报告
- 2025广西公需科目真题续集(附答案)
- 小儿喘息性肺炎的护理
- 新能源产业中液流电池储能电站项目的成功要素解析
- 2877管理学基础1-15套试题答案 国开
评论
0/150
提交评论