0.jar包依赖 maven  pom.xml

<properties>
<spring_version>4.3.25.RELEASE</spring_version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring_version}</version>
</dependency> <dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.10</version>
</dependency> <dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.11.23.RELEASE</version>
</dependency> <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.6.10.Final</version>
</dependency> <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.1.0.Final</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring_version}</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>

1.可被 servlet3.0 容器自动扫描加载的配置文件,位置不限,作用同 web.xml

package com.sw946.spring_demo.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() { // spring容器的配置文件
return new Class[]{SpringConfig.class};
} protected Class<?>[] getServletConfigClasses() { // springMVC容器的配置文件
return new Class[]{MvcConfig.class};
} protected String[] getServletMappings() { // 被DisatcjerServlet接管的请求路径
return new String[]{"/"};
}
}

2.spring容器的配置文件,管理 除被springMvc容器管理(如控制器) 以外的所有对象,可防止织入事务切面时不生效的情况发生

package com.sw946.spring_demo.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.EnableWebMvc; //申明为spring配置文件,spring若开启注解扫描,将会将此类作为spring容器配置的一部分
@Configuration
//开启注解扫描功能,并设置扫描范围,排除springMvc的配置文件和Controller组件
@ComponentScan(basePackages = {"com.sw946.spring_demo"},excludeFilters = @ComponentScan.Filter({EnableWebMvc.class, Controller.class}))
public class SpringConfig {
}

3.springMvc容器的配置文件,仅管理自定义的控制器,与spring容器为互补

package com.sw946.spring_demo.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration
//开启springMvc注解扫描功能
@EnableWebMvc
//仅扫描有@Controller注解的类纳入容器管理
@ComponentScan(basePackages = "com.sw946.spring_demo",includeFilters = @Filter(Controller.class),useDefaultFilters = false)
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) { //配置视图解析器(可选)
registry.jsp("/", ".jsp");
} //配置静态资源处理器,将对 / 路径下的静态资源请求映射为 对文件夹 classpath:/static/的请求,相比于默认静态资源处理器可指定映射到WEB-INFO的文件夹中(servlet默认规则下此目录不可访问)
  @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
}
}

4.JPA(数据持久化层)的配置文件,本例使用hibernate + mysql, 持久化框架和数据均可替换,配置思路相同

package com.sw946.spring_demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; @Configuration
//开启jpa注解扫描,并给定范围,jpa会为继承了JpaRepository接口的接口生成实现类
@EnableJpaRepositories(basePackages = "com.sw946.spring_demo.repository")
//开启事务管理功能
@EnableTransactionManagement
public class JpaConfig {
@Bean
public DataSource productDB() { //配置数据源,按实际要连接的数据库配置
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=UTC");
ds.setUsername("admin");
ds.setPassword("admin");
return ds;
} @Bean
public JpaVendorAdapter jpaVendorAdapter() { //配置ORM框架,这里为hibernate
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabase(Database.MYSQL);
adapter.setShowSql(true);
adapter.setGenerateDdl(false);
adapter.setDatabasePlatform("org.hibernate.dialect.MySQLDialect");
return adapter;
} @Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter){ //配置实体管理器工厂
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(dataSource);
emf.setJpaVendorAdapter(jpaVendorAdapter);
emf.setPackagesToScan("com.sw946.spring_demo.entity"); //给定实体类的扫描范围,会扫描@Entity注解的类
return emf;
} @Bean
public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean factoryBean) {
//配置事务管理器,依赖于实体管理器
return new JpaTransactionManager(factoryBean.getObject());
}
}

框架配置完成,下面为使用示例:

a.控制器(注意包的位置,根据扫描范围配置建立)

package com.sw946.spring_demo.controller;

import com.sw946.spring_demo.repository.GradeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
public class HomeController {
@Autowired
private GradeRepository gradeRepository; @RequestMapping("/home")
@ResponseBody
public String home() {
return gradeRepository.findLaster().toString();
}
}

b.持久层(因示例简单,忽略服务层)

package com.sw946.spring_demo.repository;

import com.sw946.spring_demo.entity.Grade;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository; import java.util.List; @Repository
public interface GradeRepository extends JpaRepository<Grade,String>{
List<Grade> findByIdLessThan(String id); //方法名查询,jpa提供 //JPql、原生sql查询
@Query(nativeQuery=true, value = "select * from grade order by id desc limit 0,1")
Grade findLaster();
}
package com.sw946.spring_demo.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.Date; @Entity
public class Grade {
@Id
private String id;
private String name; @Column(name = "create_time")
private Date createTime; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Date getCreateTime() {
return createTime;
} public void setCreateTime(Date createTime) {
this.createTime = createTime;
} @Override
public String toString() {
return "Grade{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", createTime=" + createTime +
'}';
}
}

c.数据库表

CREATE TABLE `grade` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
INSERT INTO `grade` (`id`, `name`, `create_time`) VALUES ('', '', '2019-11-18 15:50:41');
INSERT INTO `grade` (`id`, `name`, `create_time`) VALUES ('', '', '2019-11-18 17:32:56');

tomcat运行,访问 127.0.0.1:端口号/home ,即可看到数据库返回的json字符串,框架搭建完成!

web框架 Spring+SpringMvc+Jpa 纯注解搭建的更多相关文章

  1. spring+springMVC+JPA配置详解(使用缓存框架ehcache)

    SpringMVC是越来越火,自己也弄一个Spring+SpringMVC+JPA的简单框架. 1.搭建环境. 1)下载Spring3.1.2的发布包:Hibernate4.1.7的发布包(没有使用h ...

  2. Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World(转发)

    [JSP]Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World 来源:http://blog.csdn.net/zhshulin/article/de ...

  3. Spring SpringMVC SpringBoot SpringCloud 注解整理大全

    Spring SpringMVC SpringBoot SpringCloud 注解整理 才开的博客所以放了一篇以前整理的文档,如果有需要添加修改的地方欢迎指正,我会修改的φ(๑˃∀˂๑)♪ Spri ...

  4. 【Spring Data 系列学习】Spring Data JPA @Query 注解查询

    [Spring Data 系列学习]Spring Data JPA @Query 注解查询 前面的章节讲述了 Spring Data Jpa 通过声明式对数据库进行操作,上手速度快简单易操作.但同时 ...

  5. SSM框架——Spring+SpringMVC+Mybatis的搭建教程

    一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP. S ...

  6. Maven 搭建 SSM框架——Spring+SpringMVC+Mybatis的搭建教程

    一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP.Sp ...

  7. [JSP]Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World

    来源:http://blog.csdn.net/zhshulin/article/details/37956105?utm_source=tuicool&utm_medium=referral ...

  8. SSM框架—Spring+SpringMVC+MyBatis

    1.环境搭建 1.1概念 Spring是一个Java应用的开源框架,Bean/Context/Core/IOC/AOP/MVC等是其重要组件,IOC控制反转,AOP面向切面编程,各种注入方式,实现方式 ...

  9. spring+springmvc+ibatis整合注解方式实例【转】

    源自-----> http://shaohan126448.iteye.com/blog/2033563 (1)web.xml文件(Tomcat使用) 服务器根据配置内容初始化spring框架, ...

随机推荐

  1. OpenCV笔记(3)(Canny边缘检测、高斯金字塔、拉普拉斯金字塔、图像轮廓、模板匹配)

    一.Canny边缘检测 Canny边缘检测是一系列方法综合的结果.其中主要包含以下步骤: 1.使用高斯滤波器,平滑图像,滤除噪声. 2.计算图像中每个像素点的梯度强度和方向. 3.应用非极大值抑制(N ...

  2. BZOJ 3697: 采药人的路径 点分治

    好久不做点分治的题了,正好在联赛之前抓紧复习一下. 先把边权为 $0$ 的置为 $-1$.定义几个状态:$f[dis][0/1],g[dis][0/1]$ 其中 $f$ 代表在当前遍历的子树内的答案. ...

  3. Python GUI教程(六):使用Qt设计师进行窗口布局

    本篇介绍使用qt设计师进行GUI窗口的布局管理,主要包含以下内容: 使用Qt设计师布局我们的窗口部件: 垂直布局: 水平布局: 网格布局: 使用间隔: 使用“伙伴”将label标签与窗口部件进行连接. ...

  4. mysql bit 和 tinyint 的区别及使用场景?

    bit类型语法:bit[(M)] : 位字段类型.M表示每个值的位数,范围从1到64.如果M被忽略,默认为1. tinyint是数字类型,存储小数, 一般对应编辑语言里的小字典或枚举类型. 节省空间的 ...

  5. golang string、int、int64 float 互相转换

    #string到int int,err := strconv.Atoi(string) #string到int64 int64, err := strconv.ParseInt(string, 10, ...

  6. C++入门经典-例4.1-声明、定义和使用函数

    1:代码如下: // 4.1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  7. gdb调试时忽略SIGPIPE 等信号

    GDB调试网络程序时,会遇到SIGPIPE信息,默认GDB会把程序停下来,即使程序使用signal(SIGPIPE, SIG_IGN);来忽略信号.用handle命令设置一下缺省的signal的处理行 ...

  8. spring的AOP——采用注解完成AOP

    AOP的两种配置方式:XML配置和Aspectj注解方式. 一.项目的目录: 二.文件配置 我们采用的是JDK代理,所以首先将接口和实现类代码附上: public interface UserMana ...

  9. 【攻克RabbitMQ】常见问题

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/zlt995768025/article/ ...

  10. SAE中Python无法创建多线程的解决方案

    最近在SAE上开发了一个给kindle退送书的小公众号(kindle免费书库),由于微信对http响应时间 有限制,而推送本身是发邮件,当附件一大就很容易超时而使得用户收不到应答.一开始我是想通过多线 ...