spring mvc+spring data jpa零配置構(gòu)建

??? 出來工作都有一年了,做過不少項目,大多數(shù)都是以springmvc為基礎(chǔ),每次搭建項目的時候,都特別煩xml,但是有沒有什么好的辦法。最近有空看了下資料,springmvc早已經(jīng)出了零配置xml構(gòu)建工程方法。在網(wǎng)上找了下資料,發(fā)現(xiàn)挺簡單,自己動手來玩玩下。

??? 需要用的技術(shù) spring 5 mvc做web mvc框架,spring5 data jpa 做持久層,druid做連接池依賴,fastjson做jsonMessageConverter。

?? 項目用maven構(gòu)建 pom.xml依賴如圖:

因為不知道怎么插入xml 我只能插入圖片,那個知道可以回復(fù),教一下我!

? 配置DispatcherServlet

??? 隨著Servlet 3.0規(guī)范的發(fā)布,可以用幾乎沒有xml來配置你的Servlet容器。為此ServletContainerInitializer,在Servlet規(guī)范中有。在這個類中,你可以注冊過濾器,監(jiān)聽器,servlet等,就像你在傳統(tǒng)上做的那樣web.xml。

??? Spring提供了SpringServletContainerInitializer知道如何處理WebApplicationInitializer類的東西。AbstractAnnotationConfigDispatcherServletInitializer類實現(xiàn)WebMvcConfigurer內(nèi)部實現(xiàn)WebApplicationInitializer。它注冊一個ContextLoaderlistener(可選的)和一個,DispatcherServlet并允許您輕松地添加配置類來加載這兩個類,并將過濾器應(yīng)用于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的數(shù)據(jù)庫監(jiān)控

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 {

/** * 設(shè)置mvc 前綴 后綴 * * @return */

@Bean

public InternalResourceViewResolver resolver() {

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

resolver.setSuffix(".jsp");

return resolver;

}

/** * 設(shè)置配置文件的前綴 * * @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;

}

/** * 添加靜態(tài)資源映射 */

@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());

}

//主要這一步是必須的,不然會出現(xiàn)類型轉(zhuǎn)換。。

@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";

}

/**

?*服務(wù)器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();

}

}

整個目錄架構(gòu)


一般都是周末才有時間發(fā)帖,平常下班也沒什么時間,一直都不是很清楚這個富文本框怎么用?如果有誰知道怎么讓代碼格式化更好看點,麻煩告訴我一聲,有時間我會發(fā)更多學(xué)習(xí)帖子和大家分享!最后分享一個我構(gòu)建工程主要參照帖子:spring5 example ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容