java ssh 提高书_更加优雅地搭建SSH框架(使用java配置)

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

项目是在intellj IDE 下创建的maven项目,目录如下

d9e356f807250708f23dfbb59cb96106.png

按照传统的方式,像DispatchServlet这样的Servlet会配置在web.xml文件中,但是借助Servlet3规范和Spring3.1增强,我们可以使用java将DispatchServlet配置在Servlet容器中,下面展示初始化类文件

public class WebInitializer extendsAbstractAnnotationConfigDispatcherServletInitializer {//指定配置类

@Overrideprotected Class>[] getRootConfigClasses() {return new Class>[] { RootConfig.class};

}

@Overrideprotected Class>[] getServletConfigClasses() {return new Class>[] { WebConfig.class};

}//将DispatchServlet映射到“/”

@OverrideprotectedString[] getServletMappings() {return new String[] { "/"};

}

}

创建WebInitializer需要继承AbstractAnnotationConfigDispatcherServletInitializer,因为继承该类的任意类都会自动地配置DispatchServlet和Spring应用上下文,Spring的应用上下文会位于应用程序的Servlet上下文之中。

d48f9d7f22301bfdb38430604e8270bf.png

我们可以看到底层的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中的

@ComponentScan("scau.zzf.web")//启用组件扫描

public class WebConfig extendsWebMvcConfigurerAdapter {

@BeanpublicViewResolver viewResolver(){

InternalResourceViewResolver resolver=

newInternalResourceViewResolver();

resolver.setPrefix("/WEB-INF/views/");

resolver.setSuffix(".jsp");

resolver.setExposeContextBeansAsAttributes(true);returnresolver;

}//配置静态资源的处理,要求DispatchServlet对静态资源的请求转发到servlet容器中默认的Servlet上

@Overridepublic voidconfigureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {

configurer.enable();

}

}

@Configuration

@Import(HibernateConfig.class)//导入Hibernate配置文件

@ComponentScan(basePackages={"scau.zzf"},

excludeFilters={

@ComponentScan.Filter(type= FilterType.CUSTOM, value=RootConfig.WebPackage.class)

}

)public classRootConfig {//扫描除了web以外的所有包

public static class WebPackage extendsRegexPatternTypeFilter {publicWebPackage() {super(Pattern.compile("scau.zzf\\.web"));

}

}

}

HbernateConfig 如下

@Configuration

@PropertySource(

value={"classpath:ds/ds-jdbc.properties"},

ignoreResourceNotFound= true)//加载在resources下的ds-jdbc.properties

public classHibernateConfig {

@Value("${jdbc.driverClassName}")privateString driverClassName;

@Value("${jdbc.url}")privateString jdbcURL;

@Value("${jdbc.username}")privateString username;

@Value("${jdbc.password}")privateString password;//配置sessionFactory

@BeanpublicSessionFactory sessionFactoryBean() {try{

LocalSessionFactoryBean lsfb= newLocalSessionFactoryBean();

lsfb.setDataSource(dataSource());//扫描实体类

lsfb.setPackagesToScan("scau.zzf.entity");

Properties props= newProperties();//设置方言 ,采用的是MySql

props.setProperty("dialect", "org.hibernate.dialect.MySQLDialect");

lsfb.setHibernateProperties(props);

lsfb.afterPropertiesSet();

SessionFactory object=lsfb.getObject();returnobject;

}catch(IOException e) {return null;

}

}//配置DataSource

@BeanpublicDataSource dataSource(){

BasicDataSource ds=newBasicDataSource();

ds.setDriverClassName(driverClassName);

ds.setUrl(jdbcURL);

ds.setUsername(username);

ds.setPassword(password);returnds;

}

@Beanpublic staticPropertySourcesPlaceholderConfigurer placeHolderConfigurer() {return newPropertySourcesPlaceholderConfigurer();

}

}

实体类如下

@Entity

@Table(catalog= "hibernate",name = "users")public classUser {

@ColumnprivateString username;

@ColumnprivateString password;

@ColumnprivateString sex;

@ColumnprivateString address;

@Columnprivate intenabled;//GeneratedValue覆盖@id的默认访问策略

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)//@GenericGenerator是在hibernate中定义的,使用hibernate内置的各种主键生成粗略生成主键值//@GenericGenerator(name = "hibernate-uuid",strategy = "uuid")//@GeneratedValue(generator = "hibernate-uuid")

private intid;public intgetEnabled() {returnenabled;

}public void setEnabled(intenabled) {this.enabled =enabled;

}publicString getAddress() {returnaddress;

}public voidsetAddress(String address) {this.address =address;

}publicString getSex() {returnsex;

}public voidsetSex(String sex) {this.sex =sex;

}publicString getUsername() {returnusername;

}public voidsetUsername(String username) {this.username =username;

}public intgetId() {returnid;

}public void setId(intid) {this.id =id;

}publicString getPassword() {returnpassword;

}public voidsetPassword(String password) {this.password =password;

}

}

在Test的环境下进行测试

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes= {WebConfig.class, RootConfig.class})

@WebAppConfigurationpublic classServiceTest {

@AutowiredprivateUserService userService;

@Testpublic voiduserServiceTest(){

User user=userService.findUser(1);

System.out.println(user.getUsername());

}

}

在test的环境下,类上的三个注解是一定要配置的,不然会出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值