1、Spring的基础学习Spring的基础学习Spring1. spring 概述1)Spring 的创始人: Rod Johnson。2)Spring 大大简化了Java企业级开发,提供了强大,稳定的功能,又没有带来额外的 负担。Spring 有两个主要目标:一是让现有技术更易于使用,二是促进良好的编程 习惯(或称为最佳实践)。3)Spring 是一个全面的解决方案。但它坚持一个原则:不重造轮子。已经有较好解决方案的领域,Spring决不做重复性的实现,比如对象持久化和OR映射,Spring只是对现有的JDBC,Hibernate,JPA 等技术提供支持。4)Spring框架包含许多特性,并被
2、很好地组织在下图所示的七个模块中。下面将依次介绍每个模块。Spring Core 封装包是框架最基础的部分。提供IoC和依赖注入特性。这里的基础概念是BeanFactory,他提供对Factory模式的经典实现来消除对程序性单例模式的的需要。并真正的允许你从程序逻辑中分离出依赖关系和配置。Spring Context (上下文) 封装包构筑于Spring Core封装包的坚固基础上。为企业级开发提供了便利和集成的工具。Spring Context包继承了beans包的功能,还增加了国际化(I18N),事件传播,资源装载,以及透明创建上下文,例如通过servlet容器。Spring DAO 对J
3、DBC提供了支持,简化了JDBC编码,同时使代码更健壮。它能解析数据库厂商特有的错误代码。并且提供了声明式事物管理方法。Spring ORM 对Hibernate等OR(对象/关系)映射框架提供了支持。Spring AOP 是基于Spring Core包的。典型的一个应用即声明式事务。它提供了符合AOP Alliance 规范的面向方面的编程(aspect-oriented programming)实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合。Spring Web 是为Spring在Web应用程序中
4、使用提供的支持。例如多方文件上传,利用Servlet listeners进行IoC容器初始化和针对Web的application context。当与WebWork或Struts一起使用时,这个包使Spring 可与其他框架集成。Spring Web MVC 我们知道Struts作为MVC实现是现在事实上的标准,但编码略显笨拙,Spring提供了一个稍微简单的Spring Web MVC框架,但应用不多。2分述在这里我们不做Spring的全面介绍。我们只着重介绍Spring Core,Spring DAO这两个模块1) Spring CoreIOC就是 DAO接口的实现不再是业务逻辑层调用工厂
5、类去获取,而是通过容器(比如spring)来自动的为我们的业务层设置DAO的实现类。这样整个过程就反过 来,以前是我们业务层主动去获取DAO,而现在是DAO主动被设置到业务逻辑层中来了,这也就是反转控制的由来。通过IOC,我们就可以在不修改任何代码 的情况下,无缝的实现数据库的换库迁移,当然前提还是必须得写一个实现特定数据库的DAO。我们把DAO普遍到更多的情况下,那么IOC就为我们带来更大 的方便性,比如一个接口的多个实现,我们只需要配置一下就ok了,而不需要再一个个的写工厂来来获取了。这就是IOC为我们带来的模块的松耦合和应用的便利性。其实IOC说白了其实就是由我们平常的new转成了使用反
6、射来获取类的实例。依赖注入(Dependency Injection ,DI)所谓依赖注入,就是明确地定义组件接口,独立开发各个组件,然后根据组件间的依赖关系组装运行的设计开发模式。在程序开发时,不用去关心其依赖组件的实现。在系统组装时,按照DAO-BIZ-ACTION的顺序依次注入。也就是说只要是DAO接口的实现类就可以注入到BIZ中,具体使用哪个实现类,组装的时候再决定。注入有两种方式:Setter注入和构造器注入。我们一般使用Setter注入。BeanFactory 和ApplicationContext Org.springframework.beans 及org.springfram
7、ework.context包是Spring IoC容器的基础。BeanFactory接口擅长处理bean的初始化和配置。而ApplicationContext是BeanFactory的扩展,增加了更多支持企业核心内容的功能。BeanFactory所具备的能力和行为也适用于Appllication。 在Spring中,那些组成你应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由Spring容器初始化,装配及管理的对象。而bean 定义以及bean相互间的依赖关系将通过配置元数据来描述。 配置元数据在通常情况下使用XML来作为描述格式,并在里面进行b
8、ean的定义。但XML并不是唯一的描述格式。它也可以基于注解的配置。XML的配置元数据的事例。具体参看工程里的实现。 Org.springframework.beans.factory.BeanFactory 是Spring IoC容器的实际代表者,IoC容器负责容纳此前所描述的bean,并对bean进行管理。 BeanFactory是Ioc容器的核心接口。它的职责包括:实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。 Spring为我们提供了许多的BeanFactory实现,XmlBeanFactory就是最常用的一个。该实现将以XML方式描述组成应用的对象以及对象间的依赖关系。X
9、mlBeanFactory类将获取此XML配置元数据,并用它来构建一个完全可配置的系统或应用。 从上图可以看到,Spring IoC容器将读取配置元数据,并通过它对应用中各个对象进行实例化,配置以及组装。 在通常的情况下,我们不需要显式的代码去实例化IoC容器实例。一般只有在Main()方法测试时才需要显示的实例化IoC容器。具体的代码如下:BeanFactory的方法:Resource resource = new ClassPathResource(Spring.xml); BeanFactory bean = new XmlBeanFactory(resource);Applicatio
10、nContext的方法:ApplicationContext ctx=new ClassPathXmlApplicationContext(“Spring.xml”); 以上两个方法都是创建bean工厂,此工厂将从XML文件中读取bean定义。通过使用getBean(String)方法取得bean的实例。一般最好不要用。这样可以避免对Spring API的依赖。 2) Spring DAOSpring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术, 如JDBC,Hibernate或者JDO,JPA等。它不仅可以让你方便地在这些持久化技术间切换, 而且让你在编
11、码的时候不用考虑处理各种技术中特定的异常。 为了便于以一种一致的方式使用各种数据访问技术,如JDBC、JDO和Hibernate, Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,通过它们你可以 获得与你当前使用的数据访问技术相关的数据源和其他配置信息。 Dao支持类: JdbcDaoSupport - JDBC数据访问对象的基类。 需要一个DataSource,同时为子类提供 JdbcTemplate。 HibernateDaoSupport - Hibernate数据访问对象的基类。需要一个SessionFactory,同时为子类提供 HibernateTemplat
12、e。也可以选择直接通过提供一个HibernateTemplate来初始化, 这样就可以重用后者的设置,例如SessionFactory, flush模式,异常翻译器(exception translator)等等。 JdoDaoSupport - JDO数据访问对象的基类。 需要设置一个PersistenceManagerFactory, 同时为子类提供JdoTemplate。JpaDaoSupport - JPA数据访问对象的基类。 需要一个EntityManagerFactory,同时 为子类提供JpaTemplate。下面我们举个例子来看看 Spring JdbcTemplate的使用:
13、/*查询所有用户信息*/ public class UserDaoImpl extends JdbcDaoSupport implements IUserDao private NamedParameterJdbcTemplate namet;public List searchAllUser() List list=new ArrayList(); String sql=select * from t_user; list= this.getJdbcTemplate().query(sql, new RowMapper()/实现RowMapper 里面的方法,他负责对ResultSet的处理
14、返回一个对象,这个对象我们对他进行了打包,每一个User对象里面存了用户名和密码. public Object mapRow(ResultSet rs, int rownum) throws SQLException User user=new User(); user.setId(rs.getInt(id); user.setName(rs.getString(name); user.setPassword(rs.getString(password); user.setBirthday(rs.getDate(birthday); user.setAddress(rs.getString(a
15、ddress); user.setState(rs.getInt(state); return user; ); return list; 说明:在这个UserDaoImpl类中继承了JdbcDaoSupport类,这个类最重要的功能就是使子类可以通过.getJdbcTemplate()方法,获得JdbcTemplate对象。那么你会自动的从JdbcDaoSupport类中继承了setDataSource()方法,JdbcTemplate是Spring JDBC框架中最重要的类,“它简化了JDBC的使用,有助于避免常见的错误,比如忘记关闭数据连接。/*保存用户*以传统(?)为占位符*/publ
16、ic int saveUser(User user) dt=this.getJdbcTemplate(); String sql=insert into t_user(id,name,password,birthday,address,state) + values(?,?,?,?,?,?); int uid=dt.update(sql,new ObjectInteger.valueOf(user.getId(),user.getName(),user.getPassword(),user.getBirthday(),user.getAddress(),Integer.valueOf(user
17、.getState(); return uid; /*修改用户*使用命名参数 例如(:name)*/ public int updateUser(User user) namedt=new NamedParameterJdbcTemplate(this.getDataSource(); String sql=update t_user set name= :name,password= :password,birthday= :birthday, + address= :address,state= :state where id= :id; SqlParameterSource namedP
18、aram=newBeanPropertySqlParameterSource(user); int count= namedt.update(sql,namedParam); return count; 说明:使用命名参数必须使用NamedParameterJdbcTemplate类。在这个方法里使用命名参数里的BeanPropertySqlParameterSource,使用javaBean的属性作为参数的名称和值。/*使用SimpleJdbcCall类实现存储过程的调用*/public int updateUser(User user) /通过这样的设置就可以无需担心返回参数值的大小写问题
19、啦 this.getJdbcTemplate().setResultsMapCaseInsensitive(true); this.simpleCall=new SimpleJdbcCall(this.getJdbcTemplate() /存储过程 包 名称 .withCatalogName(lrq_user) /存储过程名称 .withProcedureName(UserUpdate); /创建一个 SqlParameterSource实现类来制定传入的参数 SqlParameterSource sqlparam=new MapSqlParameterSource() .addValue(v
20、_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方法接受传入的参数 Map out=simpleCall.execute(sqlparam); int code=Integer.parseInt(out.get(errCode).toString(); if(code=0 & out.get(errMsg)=null) return 1; else return 0; 说明:调用存储过程必须使用SimpleJdbcCall类。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1