参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目。
添加依赖Jar包
推荐在http://mvnrepository.com/、http://search.maven.org/等网站上获取Jar包资源,当然也可以从对应Jar包的官网上获取。
修改后的pom.xml文件如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lock</groupId> <artifactId>LockMIS</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>LockMIS Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <org.springframework.version>4.0.7.RELEASE</org.springframework.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.9</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.4</version> </dependency> </dependencies> <build> <finalName>LockMIS</finalName> </build> </project>
修改完pom.xml文件之后,需要更新该项目。
执行更新操作,会从Maven仓库下载所依赖的jar包。
使用XML配置文件实现Spring的IOC
以系统构建子系统为例,实现系统配置项各子项目的数据操作。
创建如下主代码结构:
新建系统配置项ConfigItem对象bean
package com.lock.base.bean; /** * (T_G_CONFIGITEM) * * @author hs * @version 1.0.0 2016-08-09 */ public class ConfigItem implements java.io.Serializable { /** 版本号 */ private static final long serialVersionUID = -857268865287138078L; /** */ private Integer configitemid; /** */ private String idcode; /** */ private String label; /** */ private String itemvalue; /** */ private String note; /** */ private Integer datatypeid; /** * 获取 * * @return */ public Integer getConfigitemid() { return this.configitemid; } /** * 设置 * * @param configitemid * */ public void setConfigitemid(Integer configitemid) { this.configitemid = configitemid; } /** * 获取 * * @return */ public String getIdcode() { return this.idcode; } /** * 设置 * * @param idcode * */ public void setIdcode(String idcode) { this.idcode = idcode; } /** * 获取 * * @return */ public String getLabel() { return this.label; } /** * 设置 * * @param label * */ public void setLabel(String label) { this.label = label; } /** * 获取 * * @return */ public String getItemvalue() { return this.itemvalue; } /** * 设置 * * @param itemvalue * */ public void setItemvalue(String itemvalue) { this.itemvalue = itemvalue; } /** * 获取 * * @return */ public String getNote() { return this.note; } /** * 设置 * * @param note * */ public void setNote(String note) { this.note = note; } /** * 获取 * * @return */ public Integer getDatatypeid() { return this.datatypeid; } /** * 设置 * * @param datatypeid * */ public void setDatatypeid(Integer datatypeid) { this.datatypeid = datatypeid; } }
操作ConfigItem的接口IConfigItemDao
package com.lock.base.daointerface; import com.lock.base.bean.ConfigItem; public interface IConfigItemDao { public Boolean updateConfigItem(ConfigItem configItem); }
实现IConfigItemDao接口的ConfigItemDaoImpl类
package com.lock.base.daoimpl; import com.lock.base.bean.ConfigItem; import com.lock.base.daointerface.IConfigItemDao; public class ConfigItemDaoImpl implements IConfigItemDao { @Override public Boolean updateConfigItem(ConfigItem configItem) { // TODO Auto-generated method stub return null; } }
Spring容器的配置文件ConfigItemMapper.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="configItemDao" class="com.lock.base.daoimpl.ConfigItemDaoImpl"></bean> </beans>
配置项业务类ConfigItemService
package com.lock.base.service; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lock.base.bean.ConfigItem; import com.lock.base.daointerface.IConfigItemDao; public class ConfigItemService { IConfigItemDao configItemDao; public ConfigItemService() { //容器 ApplicationContext ctx=new ClassPathXmlApplicationContext("com/lock/base/daomapper/ConfigItemMapper.xml"); //从容器中获得id为configItemDao的bean configItemDao=(IConfigItemDao)ctx.getBean("configItemDao"); } public Boolean updateConfigItem(ConfigItem configItem){ System.out.println("更新ConfigItem"); Boolean result = configItemDao.updateConfigItem(configItem); System.out.println(result); return result; } }
上述代码添加完成后,执行Maven编译命令;检查编译结果,如果错误,则对应处理直至编译成功。
在测试代码目录下新建BaseTest测试类,并在测试类中调用ConfigItemService的方法进行编码测试。
package com.lock; import org.junit.Test; import com.lock.base.bean.ConfigItem; import com.lock.base.service.ConfigItemService; public class BaseTest { @Test public void test(){ System.out.println ("test"); ConfigItem configItem = new ConfigItem(); ConfigItemService configItemService = new ConfigItemService(); configItemService.updateConfigItem(configItem); } }
执行Maven编译命令,编译成功后,运行或者调试该测试代码
正确情况下,输出以下结果
使用Spring注解实现其IOC
Spring的注解是个很神奇的东西,对于各种云里雾里的注解,后续会详细剖析,这里只是拿来主义,讲解一下如何配置使用。
修改ConfigItemDaoImpl,为其添加@Component注解。Spring容器能够识别这种特定的注解,并且会自动把它转成容器管理的Bean。
package com.lock.base.daoimpl; import org.springframework.stereotype.Component; import com.lock.base.bean.ConfigItem; import com.lock.base.daointerface.IConfigItemDao; @Component("configItemDao") public class ConfigItemDaoImpl implements IConfigItemDao { @Override public Boolean updateConfigItem(ConfigItem configItem) { // TODO Auto-generated method stub return null; } }
修改ConfigItemService,同样添加@Component注解
package com.lock.base.service; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.stereotype.Component; import com.lock.base.bean.ConfigItem; import com.lock.base.daointerface.IConfigItemDao; @Component public class ConfigItemService { IConfigItemDao configItemDao; /* public ConfigItemService() { //容器 ApplicationContext ctx=new ClassPathXmlApplicationContext("com/lock/base/daomapper/ConfigItemMapper.xml"); //从容器中获得id为configItemDao的bean configItemDao=(IConfigItemDao)ctx.getBean("configItemDao"); }*/ public Boolean updateConfigItem(ConfigItem configItem){ ApplicationContext ctx=new ClassPathXmlApplicationContext("com/lock/base/daomapper/ConfigItemMapper.xml"); configItemDao=(IConfigItemDao)ctx.getBean("configItemDao"); System.out.println("更新ConfigItem"); Boolean result = configItemDao.updateConfigItem(configItem); System.out.println(result); return result; } }
修改ConfigItemMapper.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <context:component-scan base-package="com.lock.base.*"></context:component-scan> </beans>
修改BaseTest测试类,修改原方法或者新添加一个测试方法
package com.lock; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lock.base.bean.ConfigItem; import com.lock.base.service.ConfigItemService; public class BaseTest { /*@Test public void test(){ System.out.println ("test"); ConfigItem configItem = new ConfigItem(); ConfigItemService configItemService = new ConfigItemService(); configItemService.updateConfigItem(configItem); }*/ @Test public void test2(){ System.out.println ("test"); ApplicationContext ctx = new ClassPathXmlApplicationContext("com/lock/base/daomapper/ConfigItemMapper.xml"); ConfigItemService configItemService = ctx.getBean(ConfigItemService.class); ConfigItem configItem = new ConfigItem(); configItemService.updateConfigItem(configItem); } }
执行Maven编译命令,编译成功后,运行或者调试该测试代码
可以看到,输出结果与上一种方式相同。
基于Spring的自动装配实现其IOC
在第一种方法中,有一处使用ApplicationContext初始化容器后获得需要的Bean;而在第二种方法中,有两处应用。实际上在Spring中,还可以通过自动装配来简化这一过程。
修改ConfigItemDaoImpl类的注解,用@Repository替换原来的注解
package com.lock.base.daoimpl; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; import com.lock.base.bean.ConfigItem; import com.lock.base.daointerface.IConfigItemDao; @Repository public class ConfigItemDaoImpl implements IConfigItemDao { @Override public Boolean updateConfigItem(ConfigItem configItem) { // TODO Auto-generated method stub return null; } }
修改ConfigItemService类的注解为@Service,并且为configItemDao成员变量增加@Autowired注解。@Autowired默认是按照类型装配注入,Spring根据类型从容器中匹配一个Bean给configItemDao
package com.lock.base.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import com.lock.base.bean.ConfigItem; import com.lock.base.daointerface.IConfigItemDao; @Service public class ConfigItemService { @Autowired IConfigItemDao configItemDao; /* public ConfigItemService() { //容器 ApplicationContext ctx=new ClassPathXmlApplicationContext("com/lock/base/daomapper/ConfigItemMapper.xml"); //从容器中获得id为configItemDao的bean configItemDao=(IConfigItemDao)ctx.getBean("configItemDao"); }*/ public Boolean updateConfigItem(ConfigItem configItem){ /* ApplicationContext ctx=new ClassPathXmlApplicationContext("com/lock/base/daomapper/ConfigItemMapper.xml"); configItemDao=(IConfigItemDao)ctx.getBean("configItemDao"); */ System.out.println("更新ConfigItem"); Boolean result = configItemDao.updateConfigItem(configItem); System.out.println(result); return result; } }
ConfigItemMapper.xm配置文件和测试代码均维持不变,执行Maven编译,然后进行测试
无配置实现Spring的IOC
在上述三种方式中,Spring初始化容器时都必须使用xml配置文件。实际上,Spring还有一种零配置的方式来实现其IOC,也就是不需要配置文件。
修改ConfigItemService类中configItemDao成员变量的注解为@Resource,Resource注解默认是按照名称来装配注入
package com.lock.base.service; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import com.lock.base.bean.ConfigItem; import com.lock.base.daointerface.IConfigItemDao; @Service public class ConfigItemService { @Resource IConfigItemDao configItemDao; /* public ConfigItemService() { //容器 ApplicationContext ctx=new ClassPathXmlApplicationContext("com/lock/base/daomapper/ConfigItemMapper.xml"); //从容器中获得id为configItemDao的bean configItemDao=(IConfigItemDao)ctx.getBean("configItemDao"); }*/ public Boolean updateConfigItem(ConfigItem configItem){ /* ApplicationContext ctx=new ClassPathXmlApplicationContext("com/lock/base/daomapper/ConfigItemMapper.xml"); configItemDao=(IConfigItemDao)ctx.getBean("configItemDao"); */ System.out.println("更新ConfigItem"); Boolean result = configItemDao.updateConfigItem(configItem); System.out.println(result); return result; } }
由于取消xml文件配置,因此需要新增一个类来实现原xml文件所起的作用。在java主目录下新建Package:com.lock.base.config,并新建AppConfig类
package com.lock.base.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import com.lock.base.bean.ConfigItem; @Configuration @ComponentScan(basePackages="com.lock.base.*") public class AppConfig { @Bean public ConfigItem getConfigItem(){ return new ConfigItem(); } }
修改ConfigItem类,为该类添加注解@Component("configItem")
package com.lock.base.bean; import org.springframework.stereotype.Component; /** * (T_G_CONFIGITEM) * * @author hs * @version 1.0.0 2016-08-09 */ @Component("configItem") public class ConfigItem implements java.io.Serializable { /** 版本号 */ private static final long serialVersionUID = -857268865287138078L; /** */ private Integer configitemid; /** */ private String idcode; /** */ private String label; /** */ private String itemvalue; /** */ private String note; /** */ private Integer datatypeid; /** * 获取 * * @return */ public Integer getConfigitemid() { return this.configitemid; } /** * 设置 * * @param configitemid * */ public void setConfigitemid(Integer configitemid) { this.configitemid = configitemid; } /** * 获取 * * @return */ public String getIdcode() { return this.idcode; } /** * 设置 * * @param idcode * */ public void setIdcode(String idcode) { this.idcode = idcode; } /** * 获取 * * @return */ public String getLabel() { return this.label; } /** * 设置 * * @param label * */ public void setLabel(String label) { this.label = label; } /** * 获取 * * @return */ public String getItemvalue() { return this.itemvalue; } /** * 设置 * * @param itemvalue * */ public void setItemvalue(String itemvalue) { this.itemvalue = itemvalue; } /** * 获取 * * @return */ public String getNote() { return this.note; } /** * 设置 * * @param note * */ public void setNote(String note) { this.note = note; } /** * 获取 * * @return */ public Integer getDatatypeid() { return this.datatypeid; } /** * 设置 * * @param datatypeid * */ public void setDatatypeid(Integer datatypeid) { this.datatypeid = datatypeid; } }
修改BaseTest测试类,修改原方法或者新添加一个测试方法
package com.lock; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lock.base.bean.ConfigItem; import com.lock.base.config.AppConfig; import com.lock.base.service.ConfigItemService; public class BaseTest { /*@Test public void test(){ System.out.println ("test"); ConfigItem configItem = new ConfigItem(); ConfigItemService configItemService = new ConfigItemService(); configItemService.updateConfigItem(configItem); } @Test public void test2(){ System.out.println ("test"); ApplicationContext ctx = new ClassPathXmlApplicationContext("com/lock/base/daomapper/ConfigItemMapper.xml"); ConfigItemService configItemService = ctx.getBean(ConfigItemService.class); ConfigItem configItem = new ConfigItem(); configItemService.updateConfigItem(configItem); }*/ @Test public void test3(){ System.out.println ("test"); ApplicationContext ctx=new AnnotationConfigApplicationContext(AppConfig.class); ConfigItemService configItemService = ctx.getBean(ConfigItemService.class); ConfigItem configItem1 = new ConfigItem(); configItemService.updateConfigItem(configItem1); ConfigItem configItem2 = ctx.getBean("configItem",ConfigItem.class); configItemService.updateConfigItem(configItem2); ConfigItem configItem3 = ctx.getBean("getConfigItem",ConfigItem.class); configItemService.updateConfigItem(configItem3); } }
在该测试方法中,Spring通过反射AppConfig.class来初始化容器。
执行Maven编译,然后进行测试
项目结构调整
为了使项目文件结构更加清晰明了,对文件结构做如下调整
调整代码结构后,需要修改代码中引用的包路径。编译后测试无误。
小结
本文在上一篇Java Web学习系列——创建基于Maven的Web项目基础之上,介绍了Maven Web项目添加Spring及其相关依赖JAR包的方法。并以完整实例的形式分别讲解了四种不同的实现Spring IOC的方式。通过比较来看,无配置实现Spring IOC的方式更显简洁易用,但这本身还是建立在Spring注解的基础之上。后续也会更详细的说明Spring各项注解的详细应用。