学前思考
如果该接口同时有多个实现,那么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