Spring的基础学习.docx
《Spring的基础学习.docx》由会员分享,可在线阅读,更多相关《Spring的基础学习.docx(8页珍藏版)》请在冰豆网上搜索。
Spring的基础学习
Spring的基础学习
Spring
1.spring概述
1)Spring的创始人:
RodJohnson。
2)Spring大大简化了Java企业级开发,提供了强大,稳定的功能,又没有带来额外的
负担。
Spring有两个主要目标:
一是让现有技术更易于使用,二是促进良好的编程
习惯(或称为最佳实践)。
3)Spring是一个全面的解决方案。
但它坚持一个原则:
不重造轮子。
已经有较好解决方案的领域,Spring决不做重复性的实现,比如对象持久化和OR映射,Spring只是对现有的JDBC,Hibernate,JPA等技术提供支持。
4)Spring框架包含许多特性,并被很好地组织在下图所示的七个模块中。
下面将依次介绍每个模块。
JDBC编码,同时使代码更健壮。
它能解析数据库厂商特有的错误代码。
并且提供了声明式事物管理方法。
SpringORM对Hibernate等OR(对象/关系)映射框架提供了支持。
SpringAOP是基于SpringCore包的。
典型的一个应用即声明式事务。
它提供了符合AOPAlliance规范的面向方面的编程(aspect-orientedprogramming)实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合。
SpringWeb是为Spring在Web应用程序中使用提供的支持。
例如多方文件上传,利用Servletlisteners进行IoC容器初始化和针对Web的applicationcontext。
当与WebWork或Struts一起使用时,这个包使Spring可与其他框架集成。
SpringWebMVC我们知道Struts作为MVC实现是现在事实上的标准,但编码略显笨拙,Spring提供了一个稍微简单的SpringWebMVC框架,但应用不多。
2.分述
在这里我们不做Spring的全面介绍。
我们只着重介绍SpringCore,SpringDAO这两个模块
1)SpringCore
IOC
就是DAO接口的实现不再是业务逻辑层调用工厂类去获取,而是通过容器(比如spring)来自动的为我们的业务层设置DAO的实现类。
这样整个过程就反过来,以前是我们业务层主动去获取DAO,而现在是DAO主动被设置到业务逻辑层中来了,这也就是反转控制的由来。
通过IOC,我们就可以在不修改任何代码的情况下,无缝的实现数据库的换库迁移,当然前提还是必须得写一个实现特定数据库的DAO。
我们把DAO普遍到更多的情况下,那么IOC就为我们带来更大的方便性,比如一个接口的多个实现,我们只需要配置一下就ok了,而不需要再一个个的写工厂来来获取了。
这就是IOC为我们带来的模块的松耦合和应用的便利性。
其实IOC说白了其实就是由我们平常的new转成了使用反射来获取类的实例。
依赖注入(DependencyInjection,DI)
所谓依赖注入,就是明确地定义组件接口,独立开发各个组件,然后根据组件间的依赖关系组装运行的设计开发模式。
在程序开发时,不用去关心其依赖组件的实现。
在系统组装时,按照DAO->BIZ->ACTION的顺序依次注入。
也就是说只要是DAO接口的实现类就可以注入到BIZ中,具体使用哪个实现类,组装的时候再决定。
注入有两种方式:
Setter注入和构造器注入。
我们一般使用Setter注入。
BeanFactory和ApplicationContext
Org.springframework.beans及org.springframework.context包是SpringIoC容器的基础。
BeanFactory接口擅长处理bean的初始化和配置。
而ApplicationContext是BeanFactory的扩展,增加了更多支持企业核心内容的功能。
BeanFactory所具备的能力和行为也适用于Appllication。
在Spring中,那些组成你应用程序的主体及由SpringIoC容器所管理的对象,被称之为bean。
简单地讲,bean就是由Spring容器初始化,装配及管理的对象。
而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。
配置元数据在通常情况下使用XML来作为描述格式,并在里面进行bean的定义。
但XML并不是唯一的描述格式。
它也可以基于注解的配置。
XML的配置元数据的事例。
具体参看工程里的实现。
Org.springframework.beans.factory.BeanFactory是SpringIoC容器的实际代表者,IoC容器负责容纳此前所描述的bean,并对bean进行管理。
BeanFactory是Ioc容器的核心接口。
它的职责包括:
实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。
Spring为我们提供了许多的BeanFactory实现,XmlBeanFactory就是最常用的一个。
该实现将以XML方式描述组成应用的对象以及对象间的依赖关系。
XmlBeanFactory类将获取此XML配置元数据,并用它来构建一个完全可配置的系统或应用。
从上图可以看到,SpringIoC容器将读取配置元数据,并通过它对应用中各个对象进行实例化,配置以及组装。
在通常的情况下,我们不需要显式的代码去实例化IoC容器实例。
一般只有在Main()方法测试时才需要显示的实例化IoC容器。
具体的代码如下:
BeanFactory的方法:
Resourceresource=newClassPathResource("Spring.xml");
BeanFactorybean=newXmlBeanFactory(resource);
ApplicationContext的方法:
ApplicationContextctx=newClassPathXmlApplicationContext(“Spring.xml”);
以上两个方法都是创建bean工厂,此工厂将从XML文件中读取bean定义。
通过使用getBean(String)方法取得bean的实例。
一般最好不要用。
这样可以避免对SpringAPI的依赖。
2)SpringDAO
Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术,如JDBC,Hibernate或者JDO,JPA等。
它不仅可以让你方便地在这些持久化技术间切换,而且让你在编码的时候不用考虑处理各种技术中特定的异常。
为了便于以一种一致的方式使用各种数据访问技术,如JDBC、JDO和Hibernate,Spring提供了一套抽象DAO类供你扩展。
这些抽象类提供了一些方法,通过它们你可以获得与你当前使用的数据访问技术相关的数据源和其他配置信息。
Dao支持类:
JdbcDaoSupport-JDBC数据访问对象的基类。
需要一个DataSource,同时为子类提供JdbcTemplate。
HibernateDaoSupport-Hibernate数据访问对象的基类。
需要一个SessionFactory,同时为子类提供HibernateTemplate。
也可以选择直接通过提供一个HibernateTemplate来初始化,这样就可以重用后者的设置,例如SessionFactory,flush模式,异常翻译器(exceptiontranslator)等等。
JdoDaoSupport-JDO数据访问对象的基类。
需要设置一个PersistenceManagerFactory,同时为子类提供JdoTemplate。
JpaDaoSupport-JPA数据访问对象的基类。
需要一个EntityManagerFactory,同时为子类提供JpaTemplate。
下面我们举个例子来看看SpringJdbcTemplate的使用:
/*
*查询所有用户信息
*/
publicclassUserDaoImplextendsJdbcDaoSupportimplementsIUserDao{
privateNamedParameterJdbcTemplatenamet;
publicListsearchAllUser(){
Listlist=newArrayList();
Stringsql="select*fromt_user";
list=this.getJdbcTemplate().query(sql,newRowMapper(){
//实现RowMapper里面的方法,他负责对ResultSet的处理返回一个对象,这个对象我们对他进行了打包,每一个User对象里面存了用户名和密码….
publicObjectmapRow(ResultSetrs,intrownum)throwsSQLException{
Useruser=newUser();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
user.setBirthday(rs.getDate("birthday"));
user.setAddress(rs.getString("address"));
user.setState(rs.getInt("state"));
returnuser;
}
});
returnlist;
}
}
说明:
在这个UserDaoImpl类中继承了JdbcDaoSupport类,这个类最重要的功能就是使子类可以通过.getJdbcTemplate()方法,获得JdbcTemplate对象。
那么你会自动的从JdbcDaoSupport类中继承了setDataSource(…)方法,JdbcTemplate是SpringJDBC框架中最重要的类,“它简化了JDBC的使用,有助于避免常见的错误,比如忘记关闭数据连接。
/*
*保存用户
*以传统(?
)为占位符
*/
publicintsaveUser(Useruser){
dt=this.getJdbcTemplate();
Stringsql="insertintot_user(id,name,password,birthday,address,state)"+
"values(?
?
?
?
?
?
)";
intuid=dt.update(sql,newObject[]{Integer.valueOf(user.getId()),user.getName(),user.getPassword(),user.getBirthday(),user.getAddress(),Integer.valueOf(user.getState())});
returnuid;
}
/*
*修改用户
*使用命名参数例如(:
name)
*/
publicintupdateUser(Useruser){
namedt=newNamedParameterJdbcTemplate(this.getDataSource());
Stringsql="updatet_usersetname=:
name,password=:
password,birthday=:
birthday,"+
"address=:
address,state=:
statewhereid=:
id";
SqlParameterSourcenamedParam=newBeanPropertySqlParameterSource(user);
intcount=namedt.update(sql,namedParam);
returncount;
}
说明:
使用命名参数必须使用NamedParameterJdbcTemplate类。
在这个方法里使用命名参数里的BeanPropertySqlParameterSource,使用javaBean的属性作为参数的名称和值。
/*
*使用SimpleJdbcCall类实现存储过程的调用
*/
publicintupdateUser(Useruser){
//通过这样的设置就可以无需担心返回参数值的大小写问题啦
this.getJdbcTemplate().setResultsMapCaseInsensitive(true);
this.simpleCall=newSimpleJdbcCall(this.getJdbcTemplate())
//存储过程包名称
.withCatalogName("lrq_user")
//存储过程名称
.withProcedureName("UserUpdate");
//创建一个SqlParameterSource实现类来制定传入的参数
SqlParameterSourcesqlparam=newMapSqlParameterSource()
.addValue("v_name",user.getName())
.addValue("v_password",user.getPassword())
.addValue("v_birthday",user.getBirthday())
.addValue("v_address",user.getAddress())
.addValue("v_state",user.getState())
.addValue("v_id",user.getId());
//execute方法接受传入的参数
Mapout=simpleCall.execute(sqlparam);
intcode=Integer.parseInt(out.get("errCode").toString());
if(code==0&&out.get("errMsg")==null){
return1;
}else{
return0;
}
}
说明:
调用存储过程必须使用SimpleJdbcCall类。