SpringMVC全注解不是你们那么玩的
前言:忙了段时间,忙得要死要活,累了一段时间,累得死去活来。
偶尔看到很多零注解配置SpringMVC,其实没有根本的零注解。
1)工程图一张:
web.xml在servlet3.0里面已经被注解完全替代,但是spring里面的DispatcherServlet并没有被使用,本打算修改下源码弄成3.0的,奈何没啥时间。
这是一个标准的SpringMVC,重点是AppConfig与DBConfig,在Web.xml里面申明两个类的配置路径:
<servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>com.test.commom.AppConfig</param-value> </init-param> <!-- use annotation replace xml configuration. @Configuration class is required. --> <init-param> <param-name>contextClass</param-name> <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
AppConfig:
@Configuration @ComponentScan(basePackageClasses = AppConfig.class) @EnableTransactionManagement //The code equals aop config or provider annotation transaction. @EnableAspectJAutoProxy @PropertySource({"classpath:site-jdbc.properties"}) public class AppConfig extends DBConfig { /** * 国际化 * @return */ @Bean @Qualifier("messageSource") public ResourceBundleMessageSource messageSource() { ResourceBundleMessageSource bundleMessageSource = new ResourceBundleMessageSource(); bundleMessageSource.setBasename("i18n.u1wan-i18n"); bundleMessageSource.setUseCodeAsDefaultMessage(true); return bundleMessageSource; } /** * file upload * @return */ @Bean public CommonsMultipartResolver getCommonsMultipartResolver() { return new CommonsMultipartResolver(); } @Bean public SessionLocaleResolver localeResolver() { SessionLocaleResolver localeResolver = new SessionLocaleResolver(); return localeResolver; } @Bean public HessianProxyFactory loadHessianProxyFactory() { HessianProxyFactory hessianProxyFactory = new HessianProxyFactory(); return hessianProxyFactory; } /** * 定义spring MVC返回显示视图 * @return */ @Bean public TilesViewResolver viewResolver() { return new TilesViewResolver(); } @Bean public LoginInterceptor loginInterceptor() { return new LoginInterceptor(); } @Bean public SystemInterceptor systemInterceptor() { return new SystemInterceptor(); } @Bean public PermissionsInterceptor permissionsInterceptor() { return new PermissionsInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor()); registry.addInterceptor(systemInterceptor()); registry.addInterceptor(permissionsInterceptor()); } /** * 定义xml显示位置 * @return */ @Bean public TilesConfigurer tilesConfigurer() { TilesConfigurer tilesConfigurer = new TilesConfigurer(); tilesConfigurer.setDefinitions(new String[] { "classpath*:config/tiles/page-tiles.xml", "classpath*:config/tiles/common-tiles.xml" }); return tilesConfigurer; } /** * 定义Spring MVC显示 * @return */ @Bean public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); return multipartResolver; } }
DBConfig:
public class DBConfig extends DefaultWebConfig { @Inject Environment env; /** * 数据源 * @return */ @Bean(destroyMethod = "close") public DataSource dataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(env.getRequiredProperty("jdbc.driver.name")); dataSource.setUrl(env.getRequiredProperty("jdbc.writedb.proxy.url")); dataSource.setUsername(env.getRequiredProperty("jdbc.username")); dataSource.setPassword(env.getRequiredProperty("jdbc.password")); dataSource.setTestOnBorrow(true); dataSource.setValidationQuery("select 1"); return dataSource; } @Bean public SessionFactory sessionFactory() { LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource()) .scanPackages(AppConfig.class.getPackage().getName()); builder.setProperty(org.hibernate.cfg.Environment.DIALECT, MySQL5Dialect.class.getName()); return builder.buildSessionFactory(); } @Bean public MongoDBAccess mongoDBAccess() { MongoDBAccess mongoDBAccess = new MongoDBAccess(); mongoDBAccess.setMongoServerIpAddress(env.getRequiredProperty("mongodb.ip")); mongoDBAccess.setCollectionName(env.getRequiredProperty("mongodb.collection")); mongoDBAccess.setMongoServerPort(Integer.parseInt(env.getRequiredProperty("mongodb.port"))); mongoDBAccess.setDbName(env.getRequiredProperty("mongodb.db")); mongoDBAccess.initDB(); return mongoDBAccess; } @Bean public SessionLocaleResolver localeResolver() { SessionLocaleResolver localeResolver = new SessionLocaleResolver(); return localeResolver; } /** * hibernate事物 * @return */ @Bean public HibernateTransactionManager transactionManager() { HibernateTransactionManager transactionManager = new HibernateTransactionManager(); transactionManager.setSessionFactory(sessionFactory()); return transactionManager; } /** * ORM 映射--hibernate * @return */ @Bean public HibernateAccess hibernateAccess() { HibernateAccess hibernateAccess = new HibernateAccess(); hibernateAccess.setSessionFactory(sessionFactory()); return hibernateAccess; } /** * JDBC--性能要求高场合 * @return */ @Bean public JDBCAccess jdbcAccess() { JDBCAccess jDBCAccess = new JDBCAccess(); jDBCAccess.setDataSource(dataSource()); return jDBCAccess; } @Bean(name = "hibernateTransaction") public HibernateTransactionManager hibernateTransactionManager() { HibernateTransactionManager transactionManager = new HibernateTransactionManager(); transactionManager.setSessionFactory(sessionFactory()); return transactionManager; } }
通过类的配置,完全替代spring的配置文件,基本上不用配置文件,个人比较喜欢no配置文件的东西。
举例一个Controler:
@Controller public class WebsiteController { @Inject private WebsiteServer websiteServer; @RequestMapping(value = "/website/test", method = RequestMethod.GET) public String test(Map<String, Object> map, WebsiteRequest request) { map.put("test", "test"); return "test_page"; } @RequestMapping(value = "/website/testbody", method = RequestMethod.GET) @ResponseBody public String testBody(Map<String, Object> map) { try { websiteServer.test(); } catch (Exception e) { e.printStackTrace(); } return "test"; } }
在第一个方法中,会去找test_page这个配置试图,该试图对应一个页面
第二个方法,直接返回到body中。
在page-tiles.xml与common-tiles.xml中设置对应视图位置:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd"> <tiles-definitions> <definition name="cookie-error" template="/WEB-INF/common/error/cookie-error.jsp"></definition> <definition name="default-403" extends="intranet-template"> <put-attribute name="main-content1" value="/WEB-INF/common/error/default-403.jsp" /> <put-attribute name="title" value="Forbidden" /> </definition> <definition name="default-404" template="/WEB-INF/common/error/default-404.jsp"></definition> <definition name="default-error" extends="intranet-template"> <put-attribute name="main-content1" value="/WEB-INF/common/error/default-500.jsp" /> <put-attribute name="title" value="Server Error" /> </definition> </tiles-definitions>
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。