AOP(面向切面)技术: Aspect-Oriented Programming,是对OOP的一种补充。
1.AOP和OOP的主要区别、:OOP针对实体及其属性和行为进行抽象封装
AOP针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,比如权限检查,日志写入,事务管理,并不需要对OOP采取嵌入式代码,而是采取在将通知在切点织入的方式。 还是通过容器注入进行管理。
2. AOP常用术语:a.切面(Aspect):是你要实现的交叉功能,是一种描述性的思想。
b.连接点(Joinpoint):应用程序执行过程中插入切面的地点(如方法调用,异常抛出),但连接点不一定要插入切面。
c.通知(Advice):切面的实际实现,是一种逻辑代码。
d.切入点(Pointcut):定义了通知应用在哪些连接点。e.目标对象(Target):被通知对象
e.代理(Proxy):将通知应用到目标对象后创建的对象。
f.织入:(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。
备注:代理模式的优势:授权机制:不同级别的用户对同一对象拥有不同的访问权利
某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动,可节省内存开销
客户端只与接口交互,通过代理模式可以get不同的业务对象。
七:面向切面编程的应用:事务管理(Spring分程序控制和声明式)
1.描述事务的缩写词(ACID)
a.(Atomic):原子性:事务由一个或多个行为绑在一起组成,好像是一个单独工作单元。
原子性确保在事务中的所有操作要么都发生,要么都不发生。
b.(Consistent):一致性:一旦一个事物结束了(不管成功与否),系统所处的状态和它的业务规则是一致的。
c.(Isolated):隔离性:事务应该允许多个用户操作同一个数据,一个用户的操作不会和其他用户的操作相混淆。
d.(Durable):一旦事务完成,事务的结果应该持久化。
2.事务属性:是对事务策略如何应用到方法的描述。
a.传播行为(Propagation):定义了客户端和被调用方法的事务边界,和ejb中传播规则相同,只是加了前缀PROPAGATION,如:PROPAGATION_REQUIRED
b.隔离级别(Isolation):一般采用数据库默认行为即可,在理想状态下,事物要完全相互隔离,然而完全隔离会影响性能,有时需要在事务隔离上有些弹性。
c.只读(readOnly):如果一个事务只对数据库执行读操作,数据库就可能利用事务只读的特性,使用某些优化措施。
d.事务超时(timeOut):只对具有启动新事务的传播行为的方法的事务设置超时才有意义,即:required,required_new,nested.
3.声明式事务
a.model:public class User {private Integer id; private String name;
private Integer age; //getter/setter; }
b.Dao: public interface UserDao { public Integer addUser(User user);
public User getUser(Integer userId); public List getUsers(); }
c.DaoImpl: public class UserDaoHibernate extends HibernateDaoSupport implements UserDao { public Integer addUser(User user) {
return (Integer) getHibernateTemplate().save(user); }
public User getUser(Integer userId) {
return (User) getHibernateTemplate().load(User.class, userId); }
public List getUsers() { String hql="from User";
return getHibernateTemplate().find(hql); } }
d.service: public interface UserManager { public Integer addUser(User user);}
e.serviceImpl: public class UserManagerImpl implements UserManager {
private UserDao userDao;
public Integer addUser(User user) {Integer userId=userDao.addUser(user);
return userId; } //对数据库的操作根本不用代码嵌入式transaction
public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
f.hbm.xml: <hibernate-mapping package="mypack"><class name="User" table="user">
<id name="id" column="id" type="integer"><generator class="identity"/> </id>
<property name="name" column="name" type="string"></property>
<property name="age" column="age" type="integer"></property> </class>
</hibernate-mapping>
g.applicationContext.xml: <bean id="userDao" class="mypack.UserDaoHibernate">
<property name="sessionFactory" ref="sessionFactory" /> //为supportDao注入
<bean id="userManagerTarget" class="mypack.UserManagerImpl">
<property name="userDao" ref="userDao"></property> </bean>
<bean id="transactionManager" //真正的事务管理实体对象
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/> </bean>
<bean id="userManager"//通过代理模式参照一个方法的事务属性决定如何执行事务策略。
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"></property>//通知
<property name="target" ref="userManagerTarget"></property> //目标
<property name="transactionAttributes">
<props> <prop key="add*">PROPAGATION_REQUIRED</prop> //切点
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> </props>
</property> </bean>
h.测试:public void testTransaction(){User user=new User();user.setName("liming");
user.setAge(22); Integer userId=userMgr.addUser(user); }
4.用元数据声明事务:
a.将service接口加上@ Transactional声明,当然也可以加在serviceImpl实现类上
@Transactional(propagation=Propagation.REQUIRES_NEW),此处表示声明该类所有方法
public interface UserManager { public Integer addUser(User user);}
//也可对具体方法声明
b.applicationContext.xml变成如下形式:使支持对元数据的支持
<bean id="userManager" class="mypack.UserManagerImpl">
<property name="userDao" ref="userDao"></property> </bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator>
</bean>
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager"></property>
<property name="transactionAttributeSource">
<bean class="org.springframework.transaction.annotation.
AnnotationTransactionAttributeSource"></bean> </property> </bean>
<bean class="org.springframework.transaction.interceptor.
TransactionAttributeSourceAdvisor"> <property name="transactionInterceptor" ref="transactionInterceptor"></property> </bean>