1.Spring 的容器事务管理机制---参数化配置的事务管理
UserDAOProxy节点配置了一个针对userDAO bean的事务代理(由
target属性指定)。
运用:
*注意这里须通过代理Bean"userDAOProxy"获得引用,而不是直接getBean(“userDAO”)
InputStream is = new FileInputStream("Application-Context.xml");
XmlBeanFactory factory = new XmlBeanFactory(is);
UserDAO userDAO = (UserDAO) factory.getBean("userDAOProxy");
userDAO.insertUser();
*特点:将(事务)代码转移到了配置文件,并没有减少太多的工作量,事实上是如此。
2.template(模板模式):
org.springframework.jdbc.core.JdbcTemplate:针对jdbc的封装的模板。
三.Hibernate in Spring
1.hibernate的session是对jdbc的轻量级封装,它维护着一个connection
2.ApplicationContext.xml对事务管理器的定义改为:
org.springframework.orm.hibernate.HibernateTransactionManager">
3.注意看UserDAO.java的定义结构:
public class UserDAO extends HibernateDaoSupport implements IUserDAO
{
public void insertUser(User user) {
getHibernateTemplate().saveOrUpdate(user);
}
}
4.HibernateDaoSupport
4.HibernateDaoSupport实现了HibernateTemplate和SessionFactory实例的关联。
与JdbcTemplate类似,HibernateTemplate对Hibernate Session操作进行了封装
5.IUserDAO userDAO = (IUserDAO)factory.getBean("userDAOProxy");
这里并没有直接用UserDAO对获得的Bean实例进行强制转型。这与上面
JdbcTemplate的测试代码不同
,为了实现动态AOP,Spring在默认情况下会使用Java Dynamic
Proxy,但是,Dynamic Proxy要求其代理的对象必须实现一个接口,该接口定义了准备
进行代理的方法
6.AOP:而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步
骤或阶段(片断)
AOP和OOD/OOP并不冲突,我们完全可以在一个应用系统中同时应用OOD/OOP和
AOP设计思想,通过OOD/OOP对系统中的业务对象进行建模,同时通过AOP对实体处理
过程中的阶段进行隔离处理。即使不是OOD/OOP,而是在传统的POP(面向过程编程)中,
AOP也能起到同样的作用。
就是应用代码可以脱离AOP组件独立编译。(源代码组成无关性)
7.proxy
一般为处理某方法调用前后需要进行一此特殊处理,
》定义一接口
》定义一类实现该接口,在实现方法中写些代码,再次调用本接口方法。
public void saveUser(User user) {
UserTransaction tx = null;
try {
tx = (UserTransaction) (
new InitialContext().lookup("java/tx")
);
userDAO.saveUser(user);//再次调用本接口方法,只不过是加上了事务处理的壳而以
tx.commit();
。。。。。。。
8.dynamic proxy:
public class TxHandler implements InvocationHandler {
private Object originalObject;
public Object bind(Object obj) {
this.originalObject = obj;
return Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
if (!method.getName().startsWith("save")) {
UserTransaction tx = null;
try {
tx = (UserTransaction) (
new InitialContext().lookup("java/tx")
);
result = method.invoke(originalObject, args);
tx.commit();
} catch (Exception ex) {
if (null != tx) {
try {
tx.rollback();
} catch (Exception e) {
}
}
}
} else {
result = method.invoke(originalObject, args);
}
return result;
}
}//个代理类适用于所有接口的实现
*******************************************************************************
1.容器配置管理事务,通过动态AOP(dynamic proxy)实现;
2.运用对hibernate之session封装的模板(HibernateTemplate),简化代码;
3.IOC/DI的运用,用来控制组件之间的依赖关系,改由容器根据配置文件注入,注入到的组件里
用set/get来声明一下(注入之type 2)
4.如果没有spring的IOC/DI,我们采用常规方法得:写配置文件,写factory方法,在factory方法里我们得读配置文件,来决定执行哪一个接口实现类。
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=204795