更加优雅地搭建SSH框架(使用java配置)
时代在不断进步,大量基于xml的配置所带来的弊端也显而易见,在XML配置和直接注解式配置之外还有一种有趣的选择方式-JavaConfig,它是在Spring 3.0开始从一个独立的项目并入到Spring中的。它结合了XML的解耦和JAVA编译时检查的优点。JavaConfig可以看成一个XML文件,只不过是使用Java编写的。现在下面为大家展示如何编写基于java Config 配置 spring+springmvc+hibernate。
项目是在intellj IDE 下创建的maven项目,目录如下

按照传统的方式,像DispatchServlet这样的Servlet会配置在web.xml文件中,但是借助Servlet3规范和Spring3.1增强,我们可以使用java将DispatchServlet配置在Servlet容器中,下面展示初始化类文件
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
//指定配置类
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebConfig.class };
}
//将DispatchServlet映射到“/”
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
创建WebInitializer需要继承AbstractAnnotationConfigDispatcherServletInitializer,因为继承该类的任意类都会自动地配置DispatchServlet和Spring应用上下文,Spring的应用上下文会位于应用程序的Servlet上下文之中。

我们可以看到底层的AbstractAnnotationConfigDispatcherServletInitializer拓展和实现了WebApplicationInitializer,在Servlet3 环境中,容器会在类路径中查找实现了javax.servlet.ServletContainerInitializer接口的类,并将该类来配置Servlet容器,而spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现了WebApplicationInitializer的类并将配置的任务交给他们来完成,所以当我们WebInitializer拓展了AbstractAnnotationConfigDispatcherServletInitializer ,同时就实现了WebApplicationInitializer,因此当部署到Servlet3.0容器中的时候,容器就会自动发现他,并用它来配置Servlet上下文。
WebInitializer中要求DispatchServlet加载应用上下文时,使用定义在WebConfig配置类中的bean。
在使用xml配置spring的时候,必须配置spring监听器,也是就ContextLoaderListener,然而很多人不知道的是,ContextLoaderListener会创建spring web 应用中的另一个上下文。
我们希望DispatchServlet加载包含Web组件的bean,如控制器、视图解析器以及处理器映射,而ContextLoaderListener要加载应用中的其他bean,这些bean通常是驱动应用后端的中间层和数据层组件。
也就是说WebConfig的类中会用来定义DispatcherServlet应用上下文的bean,RootConfig的类中会用来配置ContextLoadListener创建的上下文的bean
@Configuration
@EnableWebMvc //注解驱动springMVC 相当于xml中的<mvc:annotation-driven>
@ComponentScan("scau.zzf.web")//启用组件扫描
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver resolver=
new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
//配置静态资源的处理,要求DispatchServlet对静态资源的请求转发到servlet容器中默认的Servlet上
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
} }
@Configuration
@Import(HibernateConfig.class)//导入Hibernate配置文件
@ComponentScan(basePackages={"scau.zzf"},
excludeFilters={
@ComponentScan.Filter(type= FilterType.CUSTOM, value=RootConfig.WebPackage.class)
}
)
public class RootConfig {
//扫描除了web以外的所有包
public static class WebPackage extends RegexPatternTypeFilter {
public WebPackage() {
super(Pattern.compile("scau.zzf\\.web"));
}
} }
HbernateConfig 如下
@Configuration
@PropertySource(
value={"classpath:ds/ds-jdbc.properties"},
ignoreResourceNotFound = true)//加载在resources下的ds-jdbc.properties
public class HibernateConfig {
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.url}")
private String jdbcURL;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
//配置sessionFactory
@Bean
public SessionFactory sessionFactoryBean() {
try {
LocalSessionFactoryBean lsfb = new LocalSessionFactoryBean();
lsfb.setDataSource(dataSource());
//扫描实体类
lsfb.setPackagesToScan("scau.zzf.entity");
Properties props = new Properties();
//设置方言 ,采用的是MySql
props.setProperty("dialect", "org.hibernate.dialect.MySQLDialect");
lsfb.setHibernateProperties(props);
lsfb.afterPropertiesSet();
SessionFactory object = lsfb.getObject();
return object;
} catch (IOException e) {
return null;
}
}
//配置DataSource
@Bean
public DataSource dataSource(){
BasicDataSource ds=new BasicDataSource();
ds.setDriverClassName(driverClassName);
ds.setUrl(jdbcURL);
ds.setUsername(username);
ds.setPassword(password); return ds;
}
@Bean
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
实体类如下
@Entity
@Table(catalog = "hibernate",name = "users")
public class User {
@Column
private String username;
@Column
private String password;
@Column
private String sex;
@Column
private String address;
@Column
private int enabled; //GeneratedValue覆盖@id的默认访问策略
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
// @GenericGenerator是在hibernate中定义的,使用hibernate内置的各种主键生成粗略生成主键值
// @GenericGenerator(name = "hibernate-uuid",strategy = "uuid")
// @GeneratedValue(generator = "hibernate-uuid")
private int id; public int getEnabled() {
return enabled;
} public void setEnabled(int enabled) {
this.enabled = enabled;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}
在Test的环境下进行测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {WebConfig.class, RootConfig.class})
@WebAppConfiguration
public class ServiceTest { @Autowired
private UserService userService;
@Test
public void userServiceTest(){ User user=userService.findUser(1);
System.out.println(user.getUsername());
} }
在test的环境下,类上的三个注解是一定要配置的,不然会出错。
转载请说明出处:http://www.cnblogs.com/xxzhuang/p/5943410.html 多谢合作
更加优雅地搭建SSH框架(使用java配置)的更多相关文章
- Java之基于Eclipse搭建SSH框架(下)
在上篇博客里,我简介了Tomcat滴配置与Struts2滴搭建,假设对这个还不会滴童鞋去看一下我滴上篇博客<Java之基于Eclipse搭建SSH框架(上)>.今天我们接着上篇博客滴内容. ...
- [JavaEE] SSH框架笔记_eclipse搭建SSH框架详解
SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题.下面我介绍一下SSH框架搭建的全过程. 第一步:准备工作. 下载好eclipse,Struts2,Spring,Hibe ...
- Maven环境下搭建SSH框架
© 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Maven:3.3.9 Struts2:2.5.10 Spring:4.3.8.RELEASE Hibernate:5.1.7.Fina ...
- Maven环境下搭建SSH框架之Spring整合Hibernate
© 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Spring:4.3.8.RELEASE Hibernate:5.1.7.Final MySQL:5.7.17 注意:其他版本在某些特性 ...
- 搭建SSH框架整合Struts2和Spring时,使用@Autowired注解无法自动注入
© 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述: 搭建SSH框架,在进行Struts2和Spring整合时,使用Spring的@Autowired自动注入失败,运行报错java.lan ...
- eclipse Indigo搭建SSH框架详解
SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题.下面我介绍一下SSH框架搭建的全过程. 第一步:准备工作. 下载好eclipse,Struts2,Spring,Hi ...
- myeclipse搭建SSH框架
搭建SSH框架 Struts+hibernater+spring架构(myeclipse) 右击,首先加入spring,加入hibernater,再加入struts2 复制jar包(把tomcat发布 ...
- MyEclipse8.5快速搭建SSH框架
来源于:http://jingyan.baidu.com/article/a378c960a78125b3282830cc.html MyEclipse8.5快速搭建SSH框架 使用版本: Strut ...
- MeEclipse搭建SSH框架之———大体框架
必备:MyEclipse软件,SSH需要的jar包,数据库,连接数据库的驱动jar包 先搭建大体框架,再加别的东西,要不都不知道哪里错了 一.新建web项目 MyEclipse左边右键--->N ...
随机推荐
- showmessage函数里
首先说一下,漏洞是t00ls核心群传出去的,xhming先去读的,然后我后来读的,读出来的都是代码执行,1月5日夜里11点多钟,在核心群的黑客们的要求下,xhming给了个poc,我给了个exp,确实 ...
- SQLServer公历转农历函数(1900年-2049年)
ALTER FUNCTION [dbo].[f_SysGetLunar]( @solarDay DATETIME) RETURNS varchar(20 ...
- 连上VPN后,如何访问内网(添加路由表实现网络分流方法)
route add 192.168.4.0 mask 255.255.255.0 192.168.2.0 metric 1 不止有“邮件系统”会出现这种情况,还有其他情况,这时,你需要在没有连接外网和 ...
- 私服 Nexus 的配置
一.概述 1.概要 现在的项目基本都是用Maven来管理工程,这样一来在公司内容搭建一个私服就非常有必要了,这样一来可以管理公司内部用的JAR包,也可以管理第三方的各种JAR来,以免每次都要从外网的仓 ...
- android Animation 动画绘制逻辑
参考:http://www.jianshu.com/p/3683a69c38ea 1.View.draw(Canvas) 其中步骤为:/* * Draw traversal performs seve ...
- WIN7,WIN8,WIN8.1,64位客户端使用32位的ODBC配置
运行64位的ODBC管理器,点开始-->运行-->odbcad32回车即可打开,但打开后看不到32位的驱动, 如果要运行32位的ODBC管理器,该怎么办呢,其实很简单, 只要执行C:\Wi ...
- VS2013 解决方案文件结构分析
http://www.cnblogs.com/haogj/p/4248030.html Visual Studio 的解决方案文件是一个文本文件,其中的内容不是太复杂,有些时候 Visual Stud ...
- nginx 相关问题
Nginx配置文件nginx.conf 参考:http://www.2cto.com/os/201212/176520.html Nginx自动切分日志: nignx没有自动分开文件存储日志的机制. ...
- 调用 google speech api (使用Google语音识别引擎)
完全参考自: http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11/ http://aiku.me/bar/104480 ...
- 配置jenkins,并把iOS包自动上传至fir.im
安装jenkins,有两种方式 1.首先要安装 homebrew,利用homebrew来管理安装包十分方便,一条命令就可以 安装 homebrew命令 $ ruby -e "$(curl - ...