1. 程式人生 > >SM框架新特性關於用Java配置類完全代替XML

SM框架新特性關於用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

 

告辭...