Java Web学习系列——Maven Web项目中集成使用Spring 添加依赖Jar包 使用XML配置文件实现Spring的IOC 使用Spring注解实现其IOC 基于Spring的自动装配实现其IOC 无配置实现Spring的IOC 项目结构调整 小结

参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目。

Java Web学习系列——Maven Web项目中集成使用Spring
添加依赖Jar包
使用XML配置文件实现Spring的IOC
使用Spring注解实现其IOC
基于Spring的自动装配实现其IOC
无配置实现Spring的IOC
项目结构调整
小结

推荐在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>
View Code

修改完pom.xml文件之后,需要更新该项目。

Java Web学习系列——Maven Web项目中集成使用Spring
添加依赖Jar包
使用XML配置文件实现Spring的IOC
使用Spring注解实现其IOC
基于Spring的自动装配实现其IOC
无配置实现Spring的IOC
项目结构调整
小结

 执行更新操作,会从Maven仓库下载所依赖的jar包。

Java Web学习系列——Maven Web项目中集成使用Spring
添加依赖Jar包
使用XML配置文件实现Spring的IOC
使用Spring注解实现其IOC
基于Spring的自动装配实现其IOC
无配置实现Spring的IOC
项目结构调整
小结

使用XML配置文件实现Spring的IOC

 以系统构建子系统为例,实现系统配置项各子项目的数据操作。

创建如下主代码结构:

Java Web学习系列——Maven Web项目中集成使用Spring
添加依赖Jar包
使用XML配置文件实现Spring的IOC
使用Spring注解实现其IOC
基于Spring的自动装配实现其IOC
无配置实现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;
     }
}
View Code

操作ConfigItem的接口IConfigItemDao

package com.lock.base.daointerface;

import com.lock.base.bean.ConfigItem;

public interface IConfigItemDao {
    public Boolean updateConfigItem(ConfigItem configItem);
}
View Code

实现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;
    }

}
View Code

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>
View Code

配置项业务类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;
    }
}
View Code

上述代码添加完成后,执行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);
    }
}
View Code

执行Maven编译命令,编译成功后,运行或者调试该测试代码

Java Web学习系列——Maven Web项目中集成使用Spring
添加依赖Jar包
使用XML配置文件实现Spring的IOC
使用Spring注解实现其IOC
基于Spring的自动装配实现其IOC
无配置实现Spring的IOC
项目结构调整
小结

正确情况下,输出以下结果

Java Web学习系列——Maven Web项目中集成使用Spring
添加依赖Jar包
使用XML配置文件实现Spring的IOC
使用Spring注解实现其IOC
基于Spring的自动装配实现其IOC
无配置实现Spring的IOC
项目结构调整
小结

使用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;
    }

}
View Code

修改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;
    }
}
View Code

修改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>
View Code

修改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);
    }
}
View Code

执行Maven编译命令,编译成功后,运行或者调试该测试代码

Java Web学习系列——Maven Web项目中集成使用Spring
添加依赖Jar包
使用XML配置文件实现Spring的IOC
使用Spring注解实现其IOC
基于Spring的自动装配实现其IOC
无配置实现Spring的IOC
项目结构调整
小结

可以看到,输出结果与上一种方式相同。

基于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;
    }

}
View Code

修改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;
    }
}
View Code

ConfigItemMapper.xm配置文件和测试代码均维持不变,执行Maven编译,然后进行测试

Java Web学习系列——Maven Web项目中集成使用Spring
添加依赖Jar包
使用XML配置文件实现Spring的IOC
使用Spring注解实现其IOC
基于Spring的自动装配实现其IOC
无配置实现Spring的IOC
项目结构调整
小结

无配置实现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;
    }
}
View Code

由于取消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();
    }
}
View Code

修改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;
     }
}
View Code

修改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);
    }
}
View Code

在该测试方法中,Spring通过反射AppConfig.class来初始化容器。

执行Maven编译,然后进行测试

Java Web学习系列——Maven Web项目中集成使用Spring
添加依赖Jar包
使用XML配置文件实现Spring的IOC
使用Spring注解实现其IOC
基于Spring的自动装配实现其IOC
无配置实现Spring的IOC
项目结构调整
小结

项目结构调整

 为了使项目文件结构更加清晰明了,对文件结构做如下调整

Java Web学习系列——Maven Web项目中集成使用Spring
添加依赖Jar包
使用XML配置文件实现Spring的IOC
使用Spring注解实现其IOC
基于Spring的自动装配实现其IOC
无配置实现Spring的IOC
项目结构调整
小结

调整代码结构后,需要修改代码中引用的包路径。编译后测试无误。

小结

本文在上一篇Java Web学习系列——创建基于Maven的Web项目基础之上,介绍了Maven Web项目添加Spring及其相关依赖JAR包的方法。并以完整实例的形式分别讲解了四种不同的实现Spring IOC的方式。通过比较来看,无配置实现Spring IOC的方式更显简洁易用,但这本身还是建立在Spring注解的基础之上。后续也会更详细的说明Spring各项注解的详细应用。