SSH学习之Spring问题总结

学前思考

如果该接口同时有多个实现,那么Spring怎么知道该用哪个实现呢?猜测应该是在spring的配置文件中指定。
解答:如果同时有多个实现类,则在实现类上这样表示@Service(“messageService”),通过里面的名称区分。
2、Spring怎么与Struts2整合?
3、Spring怎么与Hibernate整合?
4、Spring怎么使用?
5、Spring的核心思想是什么?
6、为什么要用Spring?

1、Spring架构概述

Spring是一个轻量级的J2EE框架,其核心是控制反转,即实现对接口编程而不是对类编程,这样通过配置文件就可以实现业务对象的注入,并且建立他们之间的关系。Spring框架可以分为7个模块:

  • 一、Spring Core:

它提供了Spring框架的核心功能,该容器的BeanFactory通过控制反转,可以实现应用程序不同组件之间的依赖和应用程序代码的分离,这样程序员就不用通过代码实现不同组件之间的调用关系,而只要编写类使他们实现特定的接口,并且在配置文件中进行配置即可。

  • 二、Spring Context:

该模块主要获取配置文件的信息,向其他的组件提供这些信息。它构建在BeanFactory之上,通过它可以实现国际化、资源访问等功能。

  • 三、Spring AOP:

该模块主要用来提供面向切面编程的功能。由于Spring的核心是基于控制反转的,所以可以很容易地使Spring为AOP提供支持。

  • 四、Spring DAO:

该模块提供了简单而又有效的JDBC应用。

  • 五、Spring ORM:

Spring除了可以使用JDBC完成数据库操作,还体用了对其他ORM框架的支持,例如JDO、Hibernate和iBatis等。由于Spring的良好设计模式,这些框架都可以与Spring进行无缝结合。

  • 六、Spring Web:

提供了处理多部分请求,以及将请求参数绑定到域对象的任务。

  • 七、Spring Web MVC:

该模块提供了MVC2设计模式的实现,但是用户也可以不使用该模块的实现,而是在Spring中使用其他的入Struts2等MVC框架。Spring和Struts2可以很好地集成在一起。

2、Spring的特点

Spring框架主要是通过面向接口编程实现的,并且它要求程序员也采用面向接口编程,这样就可以实现应用程序不同组件的依赖关系,和实现这些组件的业务代码相分离。用户只有通过配置文件(或注解)去建立不同组件之间的调用关系,这样一旦调用关系发生变化,只要在配置文件中进行简单修改即可,而不会影响到组件代码的重新修改。
Spring的特点有:控制反转(IOC)思想、可扩展性、与其他框架无缝融合、能够替代EJB、实现了MVC2。

3、Spring开发的简单配置

  • 一、Spring jar包简介

    1、dist目录下存放的是Spring需要的相关jar。其中spring-core.jar对应Spring的核心模块。Spring.jar包含了所有模块的jar。
    2、src:该目录下存放的是Sprig的源代码,有兴趣的话可以看一下设计Spring框架的大神们是如何写代码的。
    3、samples:该目录下存放的是使用Spring的一些例子,例如jpetstore、petclinic等。可以先将这些例子生成war文件,然后复制到Tomcat的webapps下运行。

4、Spring与Struts2的整合:

Spring与Struts2的整合其实很简单,下面是整合步骤:

  • 一、复制jar文件。

把struts2-spring-plugin-..*.jar和spring.jar复制到Web工程的WEB-INF/lib目录下,并且还需要复制commons-logging.jar。

  • 二、配置Struts.objectFactory属性。

在struts.xml文件中配置:

<struts>
     <constant name="struts.objectFactory" value="spring">
</struts>
  • 三、配置Spring监听器。

在web.xml文件中添加监听器:

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
  • 四、在Spring配置文件applicationContext.xml中配置action对应的bean。

也可以用注解来声明bean,这样更简洁。

  • 五、编写struts2的配置文件

配置action的名字,类,以及结果。注意,这里的类名不用全限定类名,而是使用spring
中配置的bean名。这样,objectFactory找不到该类,所以就会到applicationContext.xml中去寻找bean的名字为相应名称的bean。
Struts+Spring整合完整小Demo的Github地址:https://github.com/Dodozhou/SpringDemo_0200_StrutsAndSpring

5、spring操作数据库

Spring框架提供了一系列的类和接口,程序员只需要实现这些接口并在配置文件里面把必须的组件注入,就可以很方便地进行数据库的操作。

  • 一、spring框架的事务处理:

        Spring框架使用AOP机制,很大程度地降低了进行事务时的复杂性。传统的数据库操作需要手动实现数据库连接的开启和关闭,异常的捕获,日志的记录,资源的释放等。Spring框架的事务处理是基于动态的AOP机制实现的,它把所有注入连接数据库、捕获异常、清理资源等操作封装到一些已经定义好的类和接口当中,程序员只需要在Spring配置文件中将它们载入,并且编写类实现那些处理业务逻辑的接口即可。Spring的事务处理方式有两种:编程式事务处理、声明式事务处理。
        a.编程式事务处理:编程式事务处理要求程序员在自己编写的类中,重写特定的方法去完成业务操作。例:
    
public Object insert(String statement){
    final String str = statement;
    Object result = null;
    TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager);
    result = transactionTemplate.execute(new TransactionCallback(){
    //重写doInTransaction()方法
    public Object doInTransaction(TransactionStatus status){
    JdbcTemplate jdbcTemplate= new JdbcTemplate(dataSource);
    return jdbcTemplate.update(str);
    }
})
}

b.声明式事务处理
声明式事务处理不像编程式事务处理,靠重写接口去实现业务逻辑和事务逻辑和事务控制相分离,它是通过拦截器机制来实现此目的。在处理业务逻辑之前先靠拦截器去完成连接数据库、创建事务的处理,在处理事务逻辑之后逆向调用拦截器实现事务提交或回滚、清理资源等操作。这样用户就不用在自己编写的类中去重写接口,而仅需要在自命名的方法中处理业务逻辑,然后再配置文件中为该方法配置拦截器即可。例:

<beans>
......
     <bean id="InsertSqlProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
     <property name="transactionManager" ref="transactionManager"/>
     <property name="target" ref="需要拦截的类名"/>
     </beans>
  • 二、数据源DataSource的注入

        前面两个例子都用到了DataSource,它主要用来封装连接数据库的信息,然后提交给其他的组件,例如transactionManager、JdbcTemplate等。
        在配置文件中需要对数据源进行配置:
    
<bean id="dataSource" class="org.springframework.jdbc.dataSource.DriverManagerDataSource">
   <property name="driverClassName" value="com.mysql.jdbc.Driver"/> //驱动器
   <property name="url" value="jdbc:mysql://127.0.0.1:3306/pubdb"/>//连接数据库的操作
   <property name="username" value="root"/>     //用户名
   <property name="password" value="root1234"/>    //密码
</bean>
  • 三、PlatformTransactionManager接口的作用

            PlatformTransactionManager接口封装了所有对事物进行处理的方法,所有实现该接口的类都必须重写这些方法。在配置文件中一般通过bean标签定义一个该接口的实现类作为业务处理器。
    
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

这里的DataSourceTransactionManager就是PlatformTransactionManager接口的一个实现类,这些实现类通过调用特定的方法对事务进行操作。PlatformTransactionManager接口中有三个方法:TransactionStatus getTransaction(TransactionDefinition definition)、void commit(TransactionStatus status)、void rollback(TransactionStatus status);

  • 四、使用JdbcTemplate访问数据

    spring采用Template的模式来访问数据库。在进行事务处理时,虽然每个事务所进行的具体的数据库操作不同,但是每个事务都需要首先建立数据库连接,然后建立事务、提交事务、出现错误时回滚错误,这些步骤是所有事务都有的。所以模板就是把这些步骤提取出来,组成一个框架,把具体的数据库操作作为一个接口提供给程序员。
    jdbcTemplate提供了很多方法用来执行SQL语句。execute()方法给程序员建立了一个处理事务的框架,doInConnection是给程序员提供的回调方法。除了该方法外,还有update()、query()、queryForList()等方法,它们可以用来执行SQL语句,进行数据库的增删改查操作等。可以通过如下语句去查询数据库:

List rows=jdbcTemplate.queryForList("select * from user");//查询
Iterator iter=rows.iterator();
while(iter.hasNext()){
    Map map=(Map) it.next();
    String username=map.get("username");
    .......
    String email=map.get("email");
}
  • 五、Spring+Hibernate实例分析

    Spring框架可以使用前面讲解的方式调用jdbcTemplate进行数据库操作,也可以和其他ORM工具集成,Spring框架可以和Hibernate、iBatis等进行无缝集成。
    Spring整合Hibernate实例:
    1、在spring配置文件中配置dataSource、sessionFactory、TransactionManager等属性

 <!--创建SessionFactory的时候需要dataSource为参数,包含数据库连接信息-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <!-- <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>-->
        <property name="driverClassName" value="${driverClassName}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
    </bean>
    <!--创建HibernateTemplate的时候需要SessionFactory为参数,包含orm框架配置信息-->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            </props>
        </property>
        <property name="packagesToScan">
            <list>
                <value>com.star.model</value>
            </list>
        </property>
    </bean>
    <!--支持使用注解-->
    <tx:annotation-driven/>
    <!--配置Spring的事务管理器-->
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
  • 2、在类中使用HibernateTemplate进行操作
@Component
@Transactional   //不加此注解,会报read-only Exception,声明此事务要添加事务管理
public class UserDaoImpl implements UserDao {
    @Resource
    private SessionFactory sessionFactory;
    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
    public void regist(User user) {
        HibernateTemplate template=new HibernateTemplate(sessionFactory);
        template.save(user);
    }
}

实例Github地址:https://github.com/Dodozhou/SpringDemo_0200_StrutsAndSpring

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值