zoukankan      html  css  js  c++  java
  • SSM框架新特性关于用Java配置类完全代替XML

    项目目录结构

    从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,

    这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,

    并用于构建bean定义,初始化Spring容器 

    • 替代web.xml

    WebApplicationInitializer.java

    package javaConfiguration;
    
    import javaConfiguration.RootConfig;
    import javaConfiguration.WebConfig;
    import org.springframework.web.filter.CharacterEncodingFilter;
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
    
    import javax.servlet.Filter;
    import java.util.logging.Logger;
    /*
    * Spring Mvc的配置
    *createDate: 2018年12月21日
    * author: dz
     * */
    public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
        private final static Logger LOG = Logger.getLogger(String.valueOf(WebAppInitializer.class));
    
        @Override
        protected Class<?>[] getRootConfigClasses() {
            LOG.info("root配置类初始化");
            return new Class<?>[]{RootConfig.class};
        }
    
        @Override
        protected Class<?>[] getServletConfigClasses() {
            LOG.info("------web配置类初始化------");
            return new Class<?>[]{WebConfig.class};
        }
    
        @Override
        protected String[] getServletMappings() {
            LOG.info("------映射根路径初始化------");
            return new String[]{"/"};//请求路径映射,根路径
        }
    
        @Override
        protected Filter[] getServletFilters() {
            LOG.info("-----编码过滤配置-------");
            CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter("UTF-8");
            return new Filter[]{encodingFilter};
        }
    }

    WebConfig.java

    package javaConfiguration;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.EnableAspectJAutoProxy;
    import org.springframework.validation.Validator;
    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.WebMvcConfigurer;
    
    /**
     *<p>Title: WebConfig.java</p>
     *<p>Description: 配置类,用于定义DispatcherServlet上下文的bean</p>
     *<p>CreateDate: 2018年12月20日</p>
     *@author dz
     */
    @Configuration
    @EnableWebMvc
    @EnableAspectJAutoProxy
    @ComponentScan(basePackages = "com.dznfit.controller")
    public class WebConfig implements WebMvcConfigurer{
    
    
        @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {
            registry.jsp("/WEB-INF/view/",".jsp");
        }
    
    }

    这是对应spring-mvc.xml的部分
    @Configuration及其下的@bean(比如注册了JSP的视图解析器的bean等springmvc常配置的bean)      

    Configuration注解就是告诉Spring这个是一个配置文件类,这里配置的Bean要交给Spring去管理
    @ComponentScan("com.dznfit.controller") //相当于<context:component-scan base-package="com.dznfit.controller"          

    配合@Controller注册Controller的bean
    @EnableWebMvc //相当于 <mvc:annotation-driven/>   启用Spring MVC支持
    至此spring-mvc.xml完全被代替。

    RootConfig.java

    package javaConfiguration;
    
    import javaConfiguration.root.MybatisConfig;
    import javaConfiguration.root.ShiroConfig;
    import org.springframework.context.annotation.*;
    import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
    
    /**
     *<p>Title: RootConfig.java</p>
     *<p>Description: 配置类,用于管理ContextLoadListener创建的上下文的bean</p>
     *<p>CreateDate: 2018年12月20日</p>
     *@author dz
     */
    @Configuration
    @ComponentScan(basePackages = {"com.dznfit.service"})
    @PropertySource("classpath:jdbc.properties")
    @Import({MybatisConfig.class, ShiroConfig.class})
    public class RootConfig {
        @Bean
        public static PropertySourcesPlaceholderConfigurer sourcesPlaceholderConfigurer() {
            return new PropertySourcesPlaceholderConfigurer();
        }
    }

    MybatisConfig.java

    package javaConfiguration.root;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    import com.mchange.v2.c3p0.DataSources;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.env.Environment;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    import javax.sql.DataSource;
    import java.beans.PropertyVetoException;
    import java.io.IOException;
    /**
     *<p>Title: DruidDataSourceConfig.java</p>
     *<p>Description: 数据源属性配置</p>
     *<p>CreateDate: 2018年12月20日</p>
     *@author dz
     */
    @Configuration
    @MapperScan(basePackages = "com.dznfit.dao")
    @EnableTransactionManagement
    public class MybatisConfig {
    
        @Value("${driver}")
        private String driver;
    
        @Value("${url}")
        private String url;
    
        @Value("${name}")
        private String user;
    
        @Value("${password}")
        private String password;
    
        @Autowired
        private Environment environment;
    
        @Bean("dataSource")
        public DataSource dataSourceConfig() throws PropertyVetoException {
            // 使用c3p0
            ComboPooledDataSource source = new ComboPooledDataSource();
            source.setDriverClass(driver);
            source.setJdbcUrl(url);
            source.setUser(user);
            source.setPassword(password);
            return source;
        }
    
        @Bean("sqlSessionFactoryBean")
        public SqlSessionFactoryBean sqlSessionFactoryBeanConfig() throws PropertyVetoException, IOException {
            SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
            factoryBean.setDataSource(this.dataSourceConfig());
            factoryBean.setTypeAliasesPackage("com.dznfit.entity");
            factoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    
            factoryBean.setMapperLocations(resolver.getResources("Mapper/*.xml"));
            return factoryBean;
        }
    
        @Bean("transactionManager")
        public DataSourceTransactionManager dataSourceTransactionManagerConfig() throws PropertyVetoException {
            DataSourceTransactionManager manager = new DataSourceTransactionManager();
            manager.setDataSource(this.dataSourceConfig());
            return manager;
        }
    }

    ShiroConfig.java

    package javaConfiguration.root;
    
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class ShiroConfig {
    }

    这部分相当于spring-*.xml中管理的常用dao(mapper)、Service

    @Configuration标记这是一个配置类
    @ComponentScan配合@Repository、 @Service注册dao和Service的bean

    @MapperScan("com.dznfit.service")     
    @MapperScan("com.dznfit.dao")
    //Mybatis mapper.class的位置相当MapperScannerConfigurer 的bean      

    如果用的是mybatis的话,用@MapperScan注册mapper的bean   

    为了方便管理增加灵活性把它们分开不同的类来注册,使用@Import引入

    @Import({MybatisConfig.class, ShiroConfig.class})

    @Configuration及其下的@bean(比如注册了DataSource和sqlSessionFactory等的bean)       

    Configuration注解就是告诉Spring这个是一个配置文件类,这里配置的Bean要交给Spring去管理

    @EnableTransactionManagement 相当于<tx:annotation-driven />

    此文章参考:javaConfiguration

    源码下载:dznf147

    告辞...

  • 相关阅读:
    android蓝牙技术
    startActivityForResult 页面跳转回调
    android提示框
    二级列表展示数据库查询
    字符串着色
    ActionBar窗口应用
    android 补间动画帧动画
    ExpandableListView二级列表
    解析json数组——TypeToken
    Scrapy中的Callback如何传递多个参数
  • 原文地址:https://www.cnblogs.com/dzcici/p/10153707.html
Copyright © 2011-2022 走看看