今天特意学习了一下sprig框架,Spring是一个开源框架,它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情,可以总结spring是一个开源的控制反转(Inversion of Control,IoC)和面向切面(AOP)的容器框架,它的主要目的是简化企业开发。我就从代码的方式阐述控制反转和面向切面:
1、什么是控制反转:
Public class PersonServiceBean{
Private PersonDao personDao = new PersonDaoBean();
Public void save(Person person){
personDao.save(person);
}
}
PersonDaoBean是在应用内部创建及维护的,所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。
3 什么叫DI依赖注入:当我们把依赖对象交给外部容器负责创建,那么PersonServiceBean类可以改成如下:
Public class PersonServiceBean{
Private PersonDao personDao;
//通过构造器参数,让容器把创建好的依赖对象注入进PersonServiceBean,当然也可以使用setter方法进行注入
Public PersonServiceBean(PersonDao personDao){
this.personDao = personDao
}
Public void save(){
personDao.save(person);
}
}
所谓依赖注入就是指:在运行期,由外部容器动态的将依赖对象注入到组件中,减少类与类之间的耦合程度。
4 为什么我们要使用spring:至少在我看来,在项目中引入spring立即可以带来下面的好处:
1)降低组件类之间的耦合度,实现软件各层之间的解耦。
Controller===>Service===>Dao
2)可以使用容器提供的众多服务,如:事务管理服务、消息服务等等,当我们使用容器管理事务时,开发人员就不再需要手工控制事务,也不需要复杂的事务传播。
3)容器提供单例模式支持,开发人员不再需要自己编写实现代码
4)容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
5)容器提供的众多辅助类,使用这些类能够加快应用开发,如:JdbcTemplate、HibernateTemplate。
6)spring对于主流的应用框架提供了集成支持,如:集成Hibernate,JPA,Structs等,这样便于应用程序开发。
5 如果使用spring的话,我们就不要手工控制事务:
蓝色代码就不用我们自己写了。显得代码不会那么臃肿,看起来比较优雅。
6 另外,如果使用spring,我们不需要处理复杂的事务传播行为。
第1种可能业务要求:要求Beans1.update()和Beans2.save()在同一个事务中执行。
第2种可能业务需求:要求不管Beans1.update()的事务是否成功,都需要记录操作日志。
6 另外,如果使用spring,我们不需要处理复杂的事务传播行为。
Public void payment(){
Bean1.update();//更新金额
Beans2.save();//记录操作日志
}
如果我们不使用spring,针对下面这两中业务要求,我们该如何做?
第1种可能业务要求:要求Beans1.update()和Beans2.save()在同一个事务中执行。
第2种可能业务需求:要求不管Beans1.update()的事务是否成功,都需要记录操作日志。
当使用spring,我们就不再需要处理复杂的事务传播行为
使用spring,我们只需要通过声明式的事务属性配置就可以轻松的实现这两种业务要求
1、要求Bean1.update()和Bean2.save()在同一个事务中执行
2、要求不管bean1.update()事务是否成功执行,都需要记录日志
使用spring,我们只需要通过声明式的事务属性配置就可以轻松的实现这两种业务要求
1、要求Bean1.update()和Bean2.save()在同一个事务中执行
2、要求不管bean1.update()事务是否成功执行,都需要记录日志
@Transactional(propagation=Propagation.Required)
Public void payment(){
Bean1.update();//更新金额
Bean2.save();//记录操作
}
Public class Bean1(){
@Transactional(propagation=Propagation.Required)
Public void update(){
executeUpdate(....);
}
}
Public class Bean2{
@Transactional(propagation=Propagation.RequiresNew)
Public void save(){
executeUpdate(....);
}
}
7 框架的轻量级和重量级之分