(原)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>

(原)SpringMVC全注解不是你们那么玩的

时间: 2024-12-20 14:05:33

(原)SpringMVC全注解不是你们那么玩的的相关文章

【转载】springMVC表单校验+全注解

在这篇文章中,我们将学习如何使用Spring表单标签, 表单验证使用 JSR303 的验证注解,hibernate-validators,提供了使用MessageSource和访问静态资源(如CSS,JavaScript,图片)国际化支持我们的视图,使用ResourceHandlerRegistry,全部采用基于注解的配置. 我们将创建一个包含一个学生注册表格的简单应用,用户输入表单提交验证通过 JSR303 的验证注释验证,通过覆盖属性文件可使用国际验证消息的默认消息,还访问静态资源(如应用引

全注解方式配置SpringMVC

1.在J2EE三层的注解: 表现层:@Controller 业务层: @Service 持久层: @Repository 其他: @Component 注解起效需要几方: 1.需要一个注解 2.直接贴在什么地方 3.第三的扫描程序. 步骤: 1.开启注解扫描 <context:component-scan base-package="com._520it.springmvc.hello"/>  扫描哪个地方,这个是扫描一个包(如果扫描全部怎么配) 2.在对应的类上贴对应的注

springMVC,spring,mybatis全注解搭建框架--第一步,让框架跑起来

自己从事java开发工作也有一年多了,自己却没有亲手搭建一个完整的框架.于是今天自己动手搭建一个,过程中遇到一些问题,倒腾了大半天终于搞定了. 现在给大家分享一下过程,自己也记录下来,以后学习参考使用. 我采用全注解的方式去搭建springMVC,spring,mybatis框架,同时自己也可以去配置xml,但是主要还是通过注解的方式来实现.参考的网上其它大神分享的方法,多多少少有些地方写的不清楚,也并不是完全通过注解去实现的. springboot可以真正说是零配置吧,后面我将给大家演示spr

Spring4+MVC+Hibernate4全注解环境搭建(一)

声明: 以下任何观点.理解,都有可能是错的,那仅代表作者在某一时刻结合自己的学习经历和思考得出的观点,很明显,这样的前提下很多都可能是错的.请各位在看到任何可疑观点时,都不要轻信,如果你们在喷我的时候能把理由一并说出来,那我就非常感激了.像什么“你懂的”,“当然是!不然还能是什么.”那样的话恐怕既说服不了我,也说服不了别人. 目前为止我对这几个框架认识: 我的理解不一定对,但是我还是在此首先明确一下我为什么选择的是Spring4+MVC+Hibernate4. Spring就是用来提供一个IoC

java spring mvc 全注解

本人苦逼学生一枚,马上就要毕业,面临找工作,实在是不想离开学校.在老师的教导下学习了spring mvc ,配置文件实在繁琐,因此网上百度学习了spring mvc 全注解方式完成spring的装配工作; 废话不多说了上干货,其实我也没怎么理解不过简单的运行了一个spring mvc 全注解项目,也不能说是全注解,因为保留了web.xml和spring-serlvet.xml文件,(可能有的童鞋会说,这样配置可能对以后的修改不方便,无法达到只修改配置文件就切换某些环境.其实不是,零配置文件只是修

springmvc3.2+spring+hibernate4全注解方式整合(四)

以上是工程文件,下面开始测试 package test.testservice; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.t

springmvc3.2+spring+hibernate4全注解方式整合(一)

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.

基于已构建S2SH项目配置全注解方式简化配置文件

如果还不熟悉s2sh项目搭建的朋友可以先阅读 eclipse环境下基于已构建struts2项目整合spring+hibernate 这两篇文章熟悉一下. 本文是基于以上两篇文章的基础构建的,以下给出全注解方式配置S2SH项目的参考步骤. 第一步:实体类映射数据库表,简化hibernate通过xml配置文件映射 首先我们新建实体类作为测试,包结构如图所示: 新建User到model包下,实体类字段信息如下所示: package wjt.com.test.model; import javax.pe

【1】springmvc4 + servlet3 零配置全注解入门项目helloword

自从servlet3.0支持注解,使得javaweb项目使用全注解成为可能. 注解化将成为javaweb的发展方向.包括spring去年推出的spring-boot也是全部使用注解. 代码:https://github.com/heikehuan/learning-technology-code/tree/master/springmvc-annotation-web