从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器
- 替代web.xml
实现WebApplicationInitializer
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.DispatcherServlet;
import javax.servlet.DispatcherType;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import java.util.EnumSet;
public class WebInitializer implements WebApplicationInitializer {
public void onStartup(javax.servlet.ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(AppConfig.class);
ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
servlet.setLoadOnStartup(1);
servlet.addMapping("/");
//配置encodingFilter
FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encoding", new CharacterEncodingFilter());
encodingFilter.setInitParameter("encoding","UTF-8");
encodingFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),true,"/*");
}
}
以上代码以上的代码分别调用了servletContext.addServlet,servletContext.addFilter来注册servlet和filter。也实现了根据配置文件注册Spring容器和SpringMVC容器。
- spring-common和spring-mvc.xml
spring-mvc.xml
@Configuration
@ComponentScan(basePackages="septem.controller")
@EnableWebMvc
public class WebConfig {
}
这是对应spring-mvc.xml的部分
@Configuration及其下的@bean(比如注册了JSP的视图解析器的bean等springmvc常配置的bean) Configuration注解就是告诉Spring这个是一个配置文件类,这里配置的Bean要交给Spring去管理
@ComponentScan("com.neusoft.hr.app") //相当于<context:component-scan base-package="com.neusoft.hr.app" 配合@Controller注册Controller的bean
@EnableWebMvc //相当于 <mvc:annotation-driven/> 启用Spring MVC支持
至此spring-mvc.xml完全被代替。
spring-common.xml
一些bean(dao,service)的注册
@Configuration
@ComponentScan(basePackages="septem.service")
public class AppConfig {
}
这部分相当于spring-common.xml中管理的常用dao(mapper)、Service
@Configuration标记这是一个配置类
@ComponentScan配合@Repository、 @Service注册dao和Service的bean
@MapperScan("com.neusoft.hr.app.dao")
//Mybatis mapper.class的位置相当MapperScannerConfigurer 的bean 如果用的是mybatis的话,用@MapperScan注册mapper的bean
声明性事务
@Configuration
@EnableTransactionManagement
public class DataConfig {
@Bean public AnnotationSessionFactoryBean sessionFactory() {
AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource());
sessionFactoryBean.setNamingStrategy(new ImprovedNamingStrategy());
sessionFactoryBean.setPackagesToScan("septem.model");
sessionFactoryBean.setHibernateProperties(hProps());
return sessionFactoryBean;
}
private DataSource dataSource() {
BasicDataSource source = new BasicDataSource();
source.setDriverClassName("org.hsqldb.jdbcDriver");
source.setUrl("jdbc:hsqldb:mem:s3demo_db");
source.setUsername("sa");
source.setPassword("");
return source;
}
@Bean public HibernateTransactionManager transactionManager() {
HibernateTransactionManager hibernateTransactionManager = new HibernateTransactionManager();
hibernateTransactionManager.setSessionFactory(sessionFactory().getObject());
return hibernateTransactionManager;
}
private Properties hProps() {
Properties p = new Properties();
p.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
p.put("hibernate.cache.use_second_level_cache", "true");
p.put("hibernate.cache.use_query_cache", "true");
p.put("hibernate.cache.provider_class",
"org.hibernate.cache.EhCacheProvider");
p.put("hibernate.cache.provider_configuration_file_resource_path",
"ehcache.xml");
p.put("hibernate.show_sql", "true");
p.put("hibernate.hbm2ddl.auto", "update");
p.put("hibernate.generate_statistics", "true");
p.put("hibernate.cache.use_structured_entries", "true");
return p;
}
}
这里对应spring.xml的数据库和事务部分
@Configuration及其下的@bean(比如注册了DataSource和sqlSessionFactory等的bean) Configuration注解就是告诉Spring这个是一个配置文件类,这里配置的Bean要交给Spring去管理
@EnableTransactionManagement 相当于<tx:annotation-driven />
至此,spring-common.xml完全被代替
以上这里是将AppConfig分成了几部分。
其实可以只用一个AppConfig代替spring-common.xml和spring-mvc.xml
@Configuration告诉Spring这是一个配置类,其下的@Bean注册了Spring的dataSource、sqlSessionFactory\DataSourceTransactionManager等bean,还有SpringMVC的jsp视图解析器等bean
@ComponentScan配合@Repository、@Service、@Controller注册dao、Service、Controller的bean;注意如果用的是mybatis的话,还需另外加上@MapperScan注册mapper的bean
@EnableTransactionManagement 开启声明式事务
@EnableWebMvc开启springmvc的注解
至此配置类完全代替spring-common.xml和spring-mvc.xml
package com.neusoft.hr.sys.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.neusoft.hr.sys.Convertor.DateConverter;
import com.neusoft.hr.sys.interceptor.AuthInterceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.format.FormatterRegistry;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import javax.sql.DataSource;
import java.text.SimpleDateFormat;
import java.util.List;
@Configuration //定义配置类,可代替XML文件
@EnableWebMvc //相当于 <mvc:annotation-driven/>
@PropertySource("classpath:app.properties") //相当于<context:property-placeholder location="classpath:app.properties"/>
@ComponentScan("com.neusoft.hr.app") //相当于<context:component-scan base-package="com.neusoft.hr.app"
@EnableTransactionManagement // <tx:annotation-driven />
@MapperScan("com.neusoft.hr.app.dao")//Mybatis mapper.class的位置 相当于MapperScannerConfigurer的bean
public class AppConfig extends WebMvcConfigurerAdapter {
@Autowired
private Environment environment;
/**
* 配置试图解析器,这里的视图解析器是相当于servlet内部解析器,调用了forward方法
*
* @param registry
*/
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/view/");
viewResolver.setSuffix(".jsp");
registry.viewResolver(viewResolver);
}
/**
* 配置公用字符串转日期
* @param registry
*/
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new DateConverter());
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
.indentOutput(true)
.dateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
}
/**
* 配置静态资源映射
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/").setCachePeriod(31536000);
super.addResourceHandlers(registry);
}
/**
* 其他找不到的资源就交给默认的servlet处理
*
* @param configurer
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
super.configureDefaultServletHandling(configurer);
}
/*
* 注册拦截器
* */
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor()) //这个拦截类是com.neusoft.hr.sys.interceptor.AuthInterceptor
.addPathPatterns("/**").excludePathPatterns("/static/**", "/login.*", "/login/**");
}
/**
* 配置数据库连接池
* @return
*/
@Bean
public DataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl(environment.getProperty("jdbc.url"));
druidDataSource.setUsername(environment.getProperty("jdbc.username"));
druidDataSource.setPassword(environment.getProperty("jdbc.password"));
return druidDataSource;
}
/**
* 配置sqlSessionFactory
*
* @return
* @throws Exception
*/
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
//设置数据库连接池
factoryBean.setDataSource(dataSource());
//设置mapper.xml文件的位置,如果不设置的话,你需要把mapper.xml放置在于mapper.class相同的位置
//factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
factoryBean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:/mybatis-config.xml"));
return factoryBean.getObject();
}
/**
* 配置事物管理器
*
* @return
*/
@Bean
public DataSourceTransactionManager transactionManager() {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource());
return dataSourceTransactionManager;
}
}