纯Java配置的Spring Web项目

纯Java配置的Spring Web项目

通常我们在开发Java Web项目的时候,需要配置很多的XML文件,例如web.xml,servlet的配置文件。如果使用框架,如Spring等,还有Spring的配置文件。

由于使用Java配置Spring比XML更加简结,我们可以使用纯Java配置快速构建Spring Web应用,当然使用Spring Boot是一个更好的选择。

下面我们基于Spring 5 来搭建一个纯Java的Spring web项目。

新建Maven项目

使用IDEA或者ECLIPSE新建一个普通的Java 或者Java Web 项目。

假设我们的包为com.okayjam.spring

引入Maven依赖

配置Spring依赖和servlet依赖,在dependencies标签下添加如下依赖

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.1.9.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
  <scope>provided</scope>
</dependency>

Java配置类

我们在com.okayjam.spring包下面新建一个config的包,用来放配置相关的Java类。

新建 WebInitializer

这个类主要用来配置bean扫描和web配置类

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

新建 RootConfig

这个类主要是扫描bean,类实现为空

@Configuration
@ComponentScan(basePackages={"com.okayjam.spring"},
        excludeFilters={
                @ComponentScan.Filter(type= FilterType.ANNOTATION, value= Controller.class)
        })
public class RootConfig {
}

这个类使用了Configuration注解,说明了是Spring的Java配置类,可以在里面进行bean的定义。官方的说明如下:

The central artifact in Spring JavaConfig is the @Configuration-annotated class.These classes consist principally of @Bean-annotated methods that define instantiation, configuration, and initialization logic for objects that will be managed by the Spring IoC container.

An application may make use of just one @Configuration-annotated class, or many.
@Configuration can be considered the equivalent of XML’s <beans/> element. Like <beans/>, it provides
an opportunity to explicitly set defaults for all enclosed bean definitions.

同时还有ComponentScan注解,说明要扫描的包,同时忽略Controller注解,因为这个注解将会由另一个类扫描加载。

新建WebConfig

@Configuration
@EnableWebMvc
@ComponentScan("com.okayjam.spring")
public class WebConfig implements WebMvcConfigurer {

    /**
     * 处理JSP
     */
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    /**
     * 处理静态文件
     */
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

到此,Spring web 的配置已经完成了。

接下来我们新建一个Controller测试

@Controller
public class HomeController {

  @ResponseBody
  @RequestMapping(value = "/hello",method = GET)
  public String hello(Model model) {
    return "Hello world!";
  }
}

使用Maven插件快速运行

这样虽然配置好了,但是需要打包成war包并放到容器tomcat或者jetty才能运行。也可以使用maven运行。

为了使用jetty的maven插件,我们在pom中增加插件,在build标签中加入

    <plugins>
      <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>9.4.12.v20180830</version>
        <configuration>
          <httpConnector>
            <port>80</port><!--端口配置,默认8080-->
          </httpConnector>
          <!--自动热部署,默认automatic,手动manual-->
          <reload>automatic</reload>
          <!--与reload相关,默认值是 0。单位为秒。表示文件更改检查时间-->
          <scanIntervalSeconds>0</scanIntervalSeconds>
        </configuration>
      </plugin>
    </plugins>

如果需要打包,可以在plugins下加入如下的插件

      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>

然后在IDEA的maven插件栏中,运行jetty run。或者在命令行运行 jetty:run 。还可以在命令行使用mvn clean package进行打包,如果需要打成war包,需要在pom文件中把打包方式改为war

浏览器访问 http://localhost/hello, 如果输出 “Hello world! ” 则成功了。

基于XML的配置

在WebConfig类的配置中,如果使用我们熟悉的XML,配置如下

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:beans="http://www.springframework.org/schema/beans"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    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.xsd">  
    <!-- 开启注解-->
  <annotation-driven />

  <context:component-scan base-package="com.okayjam.spring" />

  <beans:bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
  </beans:bean>

    <!--/resources/**的资源都从/resources/里面进行查找。-->
  <resources mapping="/resources/**" location="/resources/" />

  <!-- 默认页
  <view-controller path="/" view-name="home" />
  -->

</beans:beans>

ref.
https://docs.spring.io/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes-other-injection

欢迎关注我的公众号
只说一点点点点

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据