spring mvc+spring data jpa零配置构建

    出来工作都有一年了,做过不少项目,大多数都是以springmvc为基础,每次搭建项目的时候,都特别烦xml,但是有没有什么好的办法。最近有空看了下资料,springmvc早已经出了零配置xml构建工程方法。在网上找了下资料,发现挺简单,自己动手来玩玩下。

    需要用的技术 spring 5 mvc做web mvc框架,spring5 data jpa 做持久层,druid做连接池依赖,fastjson做jsonMessageConverter。

   项目用maven构建 pom.xml依赖如图:

因为不知道怎么插入xml 我只能插入图片,那个知道可以回复,教一下我!

  配置DispatcherServlet

    随着Servlet 3.0规范的发布,可以用几乎没有xml来配置你的Servlet容器。为此ServletContainerInitializer,在Servlet规范中有。在这个类中,你可以注册过滤器,监听器,servlet等,就像你在传统上做的那样web.xml。

    Spring提供了SpringServletContainerInitializer知道如何处理WebApplicationInitializer类的东西。AbstractAnnotationConfigDispatcherServletInitializer类实现WebMvcConfigurer内部实现WebApplicationInitializer。它注册一个ContextLoaderlistener(可选的)和一个,DispatcherServlet并允许您轻松地添加配置类来加载这两个类,并将过滤器应用于DispatcherServlet和提供servlet映射。

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

             @Override

            protected Class[] getRootConfigClasses() {

                return new Class[] { AppConfig.class};

}

                 @Override

     protected Class[] getServletConfigClasses() {

          // TODO Auto-generated method stub

             return new Class[] {WebMvcConfig.class};

}

    @Override

  protected String[] getServletMappings() {

             // TODO Auto-generated method stub

                         return new String[] {"/"};

}

                 @Override

public void onStartup(ServletContext  servletContext)throws  ServletException{                 

super.onStartup(servletContext);


CharacterEncodingFilter chEncodingFilter = new CharacterEncodingFilter();


Dynamic dynamic = servletContext.addFilter("chEncodingFilter",chEncodingFilter);

dynamic.setInitParameter("encoding", "UTF-8");        

dynamic.setInitParameter("forceEncoding","true");        

                                                                                                                                                         dynamic.addMappingForUrlPatterns(null, false, "/*");


//添加阿里云druid的数据库监控

StatViewServlet statViewServlet = new StatViewServlet();

javax.servlet.ServletRegistration.Dynamic servlet = servletContext.addServlet("statViewServlet", statViewServlet); servlet.addMapping("/druid/*");

}

Spring WebMVC配置

@Configuration

@EnableWebMvc

@ComponentScan(basePackages = "com.ting.spring.core", useDefaultFilters = false, includeFilters = @Filter(type = FilterType.ANNOTATION, value = { Controller.class }))

public class WebMvcConfig implements WebMvcConfigurer {

/** * 设置mvc 前缀 后缀 * * @return */

@Bean

public InternalResourceViewResolver resolver() {

InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/view/");

resolver.setSuffix(".jsp");

return resolver;

}

/** * 设置配置文件的前缀 * * @return */

public MessageSource messageSource() {

ResourceBundleMessageSource source = new ResourceBundleMessageSource();

source.setBasename("applicationContext");

return source;

}

/* * @Override public Validator getValidator() {

LocalValidatorFactoryBean * factoryBean = new LocalValidatorFactoryBean();

return factoryBean; } */

@Bean

public FastJsonHttpMessageConverter converter() {

FastJsonHttpMessageConverter jsonMessageConverter = new FastJsonHttpMessageConverter();

jsonMessageConverter.setDateFormat("yyyy-MM-dd hh:mm:ss");

jsonMessageConverter.setFeatures(SerializerFeature.WriteMapNullValue,

SerializerFeature.WriteNullNumberAsZero,

SerializerFeature.WriteNullStringAsEmpty,

SerializerFeature.WriteNullStringAsEmpty,

SerializerFeature.WriteDateUseDateFormat);

List supportedMediaTypes = new ArrayList(); supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);

supportedMediaTypes.add(MediaType.TEXT_PLAIN);

jsonMessageConverter.setSupportedMediaTypes(supportedMediaTypes);


return jsonMessageConverter;

}

/** * 添加静态资源映射 */

@Override public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/static/**", "/js/**", "/css/**"); }

@Bean public DemoInterceptor initIntercepter() {

                 return new DemoInterceptor();

}

@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(initIntercepter());

}

//主要这一步是必须的,不然会出现类型转换。。

@Override

public void configureMessageConverters(List> converters) {

converters.add(converter());

}

}

spring data jpa配置

@EnableTransactionManagement

@Configuration

@PropertySource("classpath:applicationContext.properties") @ComponentScan(basePackages = "com.ting.spring.core", excludeFilters = { @Filter(value = {EnableWebMvc.class,Controller.class}) }) @EnableJpaRepositories(basePackages = "com.ting.spring.core.dao",entityManagerFactoryRef= "emf")

public class AppConfig {

@Autowired

private Environment env;

@Bean(name = "emf")

public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();

bean.setDataSource(getDataSource()); bean.setPackagesToScan("com.ting.spring.core.model");

JpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); bean.setJpaVendorAdapter(adapter);

bean.setJpaProperties(createProp());

return bean;

}

@Bean

public DataSource getDataSource() {

//DriverManagerDataSource dataSource = new DriverManagerDataSource();

DruidDataSource dataSource = new DruidDataSource();

dataSource.setUsername(env.getProperty("jdbc.mysql.username"));

dataSource.setUrl(env.getProperty("jdbc.mysql.url"));

dataSource.setPassword(env.getProperty("jdbc.mysql.password"));

dataSource.setDriverClassName(env.getProperty("jdbc.mysql.driver"));

dataSource.setMaxActive(Integer.parseInt(String.valueOf(env.getProperty("jdbc.maxActive"))));

dataSource.setInitialSize(env.getProperty("jdbc.initialSize", Integer.class));

dataSource.setMaxWait(env.getProperty("jdbc.maxWait", Integer.class));

dataSource.setMinIdle(env.getProperty("jdbc.minIdle", Integer.class));

dataSource.setMaxIdle(env.getProperty("jdbc.maxIdle", Integer.class));

dataSource.setTimeBetweenEvictionRunsMillis(env.getProperty("jdbc.timeBetweenEvictionRunsMillis", Long.class)); try {

dataSource.setFilters(env.getProperty("jdbc.filters"));


} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace();

} return dataSource;

}

@Bean public PlatformTransactionManager transactionManager(EntityManagerFactory enFactory) {

JpaTransactionManager jManager = new JpaTransactionManager();

jManager.setEntityManagerFactory(enFactory); return jManager;

}

@Bean

public PersistenceExceptionTranslationPostProcessor exceptionProcessor() {

return new PersistenceExceptionTranslationPostProcessor();

}

public Properties createProp() {

Properties properties = new Properties(); properties.setProperty("hibernate.show_sql", "true");

properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");

return properties;

}

}

实体类

@Entity

@Table(name = "user_info")

@ToString

@Data

public class UserInfo implements Serializable {

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

private Integer id;

@Column(name = "user_name")

private String userName;

private Integer age;

private String phone;

private String sex;

private String email;

@Column(name = "create_time")

private Date ctime;

}

service层和Dao

@Service

public class UserInfoService {

@Autowired private UserInfoDao userDao;

public List findAll(){

return userDao.findAll();

}

}

@Repository

public interface UserInfoDao extends JpaRepository{ }

控制层

@Controller

public class IndexController {

@Autowired private UserInfoService userService;

private static Logger log = Logger.getLogger(IndexController.class); @GetMapping("/index")

public String index() {

log.info("hello 。。。。。");

return "index";

}

/**

 *服务器sse推送

*/

@GetMapping(value="/push",produces="text/event-stream;charset=UTF-8") @ResponseBody

public String push() throws Exception {

Random r = new Random();

Thread.sleep(2000);

return new String("data:\n\n".getBytes(),"utf-8"); }

@GetMapping("user/list")

@ResponseBody public Object findAll() {

return userService.findAll();

}

}

整个目录架构


一般都是周末才有时间发帖,平常下班也没什么时间,一直都不是很清楚这个富文本框怎么用?如果有谁知道怎么让代码格式化更好看点,麻烦告诉我一声,有时间我会发更多学习帖子和大家分享!最后分享一个我构建工程主要参照帖子:spring5 example  

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容