发表于: 2017-07-30 00:00:38

2 971


今天完成的:

前台页面的大部分service层

收获:

1.写了一天service,回过头来看写的dao,终于明白了dal工具对dao封装的好处,对外提供统一的dao接口。而我写的接口很乱,各种单表联表查询,不够统一,虽然功能能实现,但如果以后业务扩展,要么继续加接口,要么就要重构dao层,扩展性和复用性都太差。最好的办法是为db里每个表都建立映射关系,全部使用单表查询,在service层组装起来,通过调用api实现复杂的查询,但这样就和dal工具或mybatis generator一样了。。。兜了个圈子又回来了。

而且有个地方懒得写成两个接口,我在pojo里加了DB里不存在的字段,只为了方便封装list返回全部数据,这中做法也不好。

感觉一个好的开发规范真的很重要。但写到现在也懒得改了,先这样吧。

2.maven-compiler-plugin插件的作用

maven是个项目管理工具,如果我们不告诉它我们的代码要使用什么样的jdk版本编译的话,它就会用maven-compiler-plugin默认的jdk版本来进行处理,这样就容易出现版本不匹配的问题,以至于可能导致编译不通过的问题。例如代码中要是使用上了jdk1.7的新特性,但是maven在编译的时候使用的是jdk1.6的版本,那这一段代码是完全不可能编译成.class文件的。为了处理这一种情况的出现,在构建maven项目的时候,我习惯性第一步就是配置maven-compiler-plugin插件。

<plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-compiler-plugin</artifactId>
       <version>3.1</version>
       <configuration>
           <source>1.6</source> <!-- 源代码使用的开发版本 -->
           <target>1.6</target> <!-- 需要生成的目标class文件的编译版本 -->
           <!-- 一般而言,target与source是保持一致的,但是,有时候为了让程序能在其他版本的jdk中运行(对于低版本目标jdk,源代码中需要没有使用低版本jdk中不支持的语法),会存在target不同于source的情况 -->
       
        <!-- 这下面的是可选项 -->
           <meminitial>128m</meminitial>
           <maxmem>512m</maxmem>
           <fork>true</fork> <!-- fork is enable,用于明确表示编译版本配置的可用 --> 
        <compilerVersion>1.3</compilerVersion>
        <!-- 这个选项用来传递编译器自身不包含但是却支持的参数选项 -->
           <compilerArgument>-verbose -bootclasspath ${java.home}\lib\rt.jar</compilerArgument>
    </configuration>
</plugin>

3.maven-resources-plugin插件

manven项目默认的资源文件位置在resources文件夹下,但有些资源文件不在该目录下。比如mybatis generator生成的mapper,一般都把他们和dao接口一起放在dao层的java文件夹下。但maven打包时不会打包java文件夹下的资源文件。而只是将java文件夹认作源码目录进行编译。

这时就需要用到maven-resources-plugin手动将mapper资源文件打进包中。

<plugin>
   <artifactId>maven-resources-plugin</artifactId>
   <version>2.5</version>
   <executions>
       <execution>
           <id>copy-xmls</id>
           <phase>process-sources</phase>
           <goals>
               <goal>copy-resources</goal>
           </goals>
           <configuration>
               <outputDirectory>${basedir}/target/classes</outputDirectory>
               <--!指定资源文件位置-->
<resources>
                   <resource>
                       <directory>${basedir}/src/main/java</directory>
                       <includes>
                           <include>**/*.xml</include>
                       </includes>
                   </resource>
               </resources>
           </configuration>
       </execution>
   </executions>
</plugin>

4.tomcat7-maven-plugin插件

一般maven项目可以直接配置外部web容器启动。也可以用插件。

<plugins>
   <!-- 配置Tomcat插件 -->
   <plugin>
       <groupId>org.apache.tomcat.maven</groupId>
       <artifactId>tomcat7-maven-plugin</artifactId>
       <version>2.2</version>
   </plugin>
</plugins>  

5.maven-jar-plugins和maven-dependency-plugins插件

这个是在任务1踩过的坑,打成包含主类的jar包,要配置manifest配置文件指明主类,idea里直接packing打包是不包含manifest配置文件的,运行时会提示缺少主清单文件。除此之外也要加上maven-dependency-plugins插件。

一般好像打成jar的都不用主函数,但有一些比如rmi服务打成jar包,运行时就要用主函数保持进程。


<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
   <archive>
       <manifest>
           <addClasspath>true</addClasspath> //
<classpathPrefix>lib/</classpathPrefix> //在MANIFEST中配置引用的lib
<mainClass>com.imooc.RunTest</mainClass>//配置主类入口
</manifest>
   </archive>

</configuration>

</plugin>

<!--除此之外还需要使用maven-dependency-plugin插件配置lib,将依赖添加到jar包中,否则打出的jar包会报找不到某某类的异常-->
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-dependency-plugin</artifactId>
   <executions>
       <execution>
           <id>copy</id>
           <phase>package</phase>
           <goals>
               <goal>copy-dependencies</goal>
           </goals>
           <configuration>
               <outputDirectory>${project.build.directory}/lib</outputDirectory>
           </configuration>
       </execution>
   </executions>
</plugin>

6.spring-junit事务回滚

/*
spring-junit整合测试,jdk默认以BlockJUnit4ClassRunner使用注解运行Test,
这里使用SpringJunit4ClassRunner,它继承了BlockJUnit4ClassRunner,如果项目使用了spring
且不交给SpringJunit4ClassRunner,则spring容器下的环境无法测试
*/
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners(listeners = {
DependencyInjectionTestExecutionListener.class,
       TransactionalTestExecutionListener.class
})
/*
spring4.2以后废弃了TransactionConfiguration,拆分成了两个注解
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
*/
@Rollback(value = true)
@Transactional(transactionManager = "transactionManager")
//读取配置文件
@ContextConfiguration(locations = {"classpath:/spring/spring-*.xml"})
public class DAOTest extends AbstractTransactionalJUnit4SpringContextTests {
private static final Logger logger = Logger.getLogger(DAOTest.class);
   @Autowired
   private CompanyDAO companyDAO;
   @Autowired
   private ProfessionDAO professionDAO;
   @Autowired
   private TagDAO tagDAO;
   @Autowired
   private CompanyService companyService;
   @Autowired
   private ProfessionServiceImpl professionService;

   @Test
   public void serviceTest() {
/*
       正常来说应该一个测试接口一个方法,而且查询接口不需要配置事务
        */
       logger.debug("==================================1>>" + companyService.queryCompanyDetailInf(1));
//        logger.debug("==================================2>>" + companyService.companyQueryService("", null, null, null));
//        logger.debug("==================================3>>" + professionService.queryNewestProfession());
//        logger.debug("==================================4>>" + professionService.queryRecommendProfession());
//        logger.debug("==================================5>>" + professionService.searchProfessionByCompanyId(1, 1, null));
//        logger.debug("==================================6>>" + professionService.searchProfessionByCondition(null, null, null, null, null, null));
   }

7.aop切面事务管理

        <!-- 事务管理器 -->
<bean id="transactionManager"
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
       <!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
   <!-- 传播行为 -->
   <!-- 如果前缀为一下的方法且开启事务,则运行事务 ,
   propagation:默认required在有transaction状态下执行;如当前没有transaction,则创建新的transaction-->
   <tx:method name="save*" propagation="REQUIRED" />
   <tx:method name="insert*" propagation="REQUIRED" />
   <tx:method name="add*" propagation="REQUIRED" />
   <tx:method name="create*" propagation="REQUIRED" />
   <tx:method name="delete*" propagation="REQUIRED" />
   <tx:method name="update*" propagation="REQUIRED" />
   <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
   <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
   <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
       <!-- 切面 -->
<aop:config>
<!-- 任意返回值任意包任意类任意方法名任意参数的切面 -->
<aop:advisor advice-ref="txAdvice"
            pointcut="execution(* com.xxx.service.*.*(..))" />
</aop:config>


遇到的问题:

1.提交svn出错,由于之前提交的代码文件名小写,后来改成大写再提交。这样会产生冲突,SVN不识别文件名大小写归根结底,还是得先从库中删除,再添加。可以理解为SVN只支持增删查,不支持改。

正常情况下,svn可以自动合并不冲突的代码,比如A向文件a添加一段代码,B再向文件a添加一段代码。这样可以自动合并。如果B修改了A添加的代码,再添加新的代码,提交svn会产生冲突,如下。

这时A和B要商量一下保留谁的代码。

2.使用tomcat插件运行项目和用外部tomcat运行项目有什么区别吗?使用插件有什么好处?

明天的计划:

把前台service层写完,测试完。


返回列表 返回列表
评论

    分享到