Ioc控制反转
public class PersonServiceBean
{
private PersonDao personDao = new PersonDaoBean();
public void setPersonDao(PersonDao personDao)
{
this.personDao = personDao;
}
public void save(Person person)
{
personDao.save(person);
}
}
类和类之间 有哪些关系:
1、依赖
2、关联 1:1 1:N M:N
3、聚合(组成)
4、实现(接口 继承)
PersonDaoBean 是在应用程序内部创建及维护的。所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的控制反转。
依赖注入(Dependency Injection)
当我们把依赖对象交给外部容器负责创建,那么PersonServiceBean类可以改成如下:
public class PersonServiceBean
{
private PersonDao personDao;
//通过构造器参数,让容器把创建好的依赖对象注入进PersonServiceBean,当然也可以使用setter方法进行注入。
public PersonServiceBean(PersonDao personDao)
{
this.personDao = personDao;
}
public void save(Person person)
{
personDao.save(person);
}
}
所谓的依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。
为什么要使用Spring
1)降低组件之间的耦合度,实现软件各层之间的解耦
松散耦合 紧密耦合
2)可以使用容器提供的众多服务,如:事务管理服务、消息服务等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务,也不需要处理负责的事务传播。
Hibernate的事务操作:
public void save(){
Session session = sessionFactory.getCurrentSession();
session.beginTransaction(); //开始一个事务
Info info = new Info("马欢");
info.setContent("成功永远不会被复制");
session.save(info);
session.getTransaction.commit(); //提交
}
JDBC的事务操作:
Connection conn = null;
try{
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
stmt.executeUpdate("update person where name='张三');
conn.commit();
}
catch(Exception e){
conn.rollback();
}
finally{
conn.close();
}
看一个例子:
public void payment()
{
beanA.update(); //更新金额
beanB.save(); //记录操作日志
}
public class BeanA{
public void update(){
Connection conn = null;
conn.setAutoCommit(false);
Statement.executeUpdate("update account set amount=? where id=?");
}
}
public class BeanB{
public void save(){
Connection conn = null;
conn.setAutoCommit(false);
Statement.executeUpdate("insert into Log(content) values(?)");
}
}
如果我们不使用Spring,针对下面两种业务需求,我们该如何做?
1)要求beanA.update()和beanB.save()在同一个事务中执行。
2)要求不管beanA.update()的事务是否成功,都需要记录操作日志。
使用Spring,不再需要我们处理复杂的事务传播行为
我们只需要通过声明式的事务属性配置就可以轻松地实现这两种业务需求
1)要求beanA.update()和beanB.save()在同一个事务中执行。
2)要求不管beanA.update()的事务是否成功,都需要记录操作日志。
@Transactional(propagation=Propagation.Required)
public void payment()
{
beanA.update(); //更新金额
beanB.save(); //记录操作日志
}
public class BeanA{
@Transactional(propagation=Propagation.Required)
public void update(){
Statement.executeUpdate("update account set amount=? where id=?");
}
}
public class BeanB{
1)@Transactional(propagation=Propagation.Required)
2) @Transactional(propagation=Propagation.RequiresNew)
public void save(){
Statement.executeUpdate("insert into Log(content) values(?)");
}
}
3)容器提供单例模式支持,开发人员不再需要自己编写实现代码
4)容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
5)容器提供了众多辅助类,使用这些类能够加快应用程序的开发,如:JdbcTemplate、HibernateTemplate。
6)Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等。
public class PersonServiceBean
{
private PersonDao personDao = new PersonDaoBean();
public void setPersonDao(PersonDao personDao)
{
this.personDao = personDao;
}
public void save(Person person)
{
personDao.save(person);
}
}
类和类之间 有哪些关系:
1、依赖
2、关联 1:1 1:N M:N
3、聚合(组成)
4、实现(接口 继承)
PersonDaoBean 是在应用程序内部创建及维护的。所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的控制反转。
依赖注入(Dependency Injection)
当我们把依赖对象交给外部容器负责创建,那么PersonServiceBean类可以改成如下:
public class PersonServiceBean
{
private PersonDao personDao;
//通过构造器参数,让容器把创建好的依赖对象注入进PersonServiceBean,当然也可以使用setter方法进行注入。
public PersonServiceBean(PersonDao personDao)
{
this.personDao = personDao;
}
public void save(Person person)
{
personDao.save(person);
}
}
所谓的依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。
为什么要使用Spring
1)降低组件之间的耦合度,实现软件各层之间的解耦
松散耦合 紧密耦合
2)可以使用容器提供的众多服务,如:事务管理服务、消息服务等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务,也不需要处理负责的事务传播。
Hibernate的事务操作:
public void save(){
Session session = sessionFactory.getCurrentSession();
session.beginTransaction(); //开始一个事务
Info info = new Info("马欢");
info.setContent("成功永远不会被复制");
session.save(info);
session.getTransaction.commit(); //提交
}
JDBC的事务操作:
Connection conn = null;
try{
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
stmt.executeUpdate("update person where name='张三');
conn.commit();
}
catch(Exception e){
conn.rollback();
}
finally{
conn.close();
}
看一个例子:
public void payment()
{
beanA.update(); //更新金额
beanB.save(); //记录操作日志
}
public class BeanA{
public void update(){
Connection conn = null;
conn.setAutoCommit(false);
Statement.executeUpdate("update account set amount=? where id=?");
}
}
public class BeanB{
public void save(){
Connection conn = null;
conn.setAutoCommit(false);
Statement.executeUpdate("insert into Log(content) values(?)");
}
}
如果我们不使用Spring,针对下面两种业务需求,我们该如何做?
1)要求beanA.update()和beanB.save()在同一个事务中执行。
2)要求不管beanA.update()的事务是否成功,都需要记录操作日志。
使用Spring,不再需要我们处理复杂的事务传播行为
我们只需要通过声明式的事务属性配置就可以轻松地实现这两种业务需求
1)要求beanA.update()和beanB.save()在同一个事务中执行。
2)要求不管beanA.update()的事务是否成功,都需要记录操作日志。
@Transactional(propagation=Propagation.Required)
public void payment()
{
beanA.update(); //更新金额
beanB.save(); //记录操作日志
}
public class BeanA{
@Transactional(propagation=Propagation.Required)
public void update(){
Statement.executeUpdate("update account set amount=? where id=?");
}
}
public class BeanB{
1)@Transactional(propagation=Propagation.Required)
2) @Transactional(propagation=Propagation.RequiresNew)
public void save(){
Statement.executeUpdate("insert into Log(content) values(?)");
}
}
3)容器提供单例模式支持,开发人员不再需要自己编写实现代码
4)容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
5)容器提供了众多辅助类,使用这些类能够加快应用程序的开发,如:JdbcTemplate、HibernateTemplate。
6)Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等。