SpringAOP是利用代理模式,在运行时生成一个目标对象的代理,并且使用代理代替目标对象,整个过程对使用者透明,使用者无法像使用目标对象一样使用代理对象,代理对象类型是目标对象所属类的子类或者接口实现,北京IT培训http://www.kmbdqn.cn/认为这个子类也是在运行时动态生成,这个生成子类的过程使用 *** 作字节码技术,Spring框架中使用两种字节码技术:JDK动态代理和CGLIB,当目标类实现了接口时使用JDK动态代理,否则使用CGLIB代理。
AOP的实现包含下面几个步骤:根据配置或注解解析切面。
生成AOP代理对象,给目标对象生成一个代理类以及代理类实例,根据解析出的切面,生成通知链设置到代理对象,在代理的回调中会执行通知链。
把AOP代理对象注册到容器中代替目标对象,当使用者向容器请求目标bean时,容器会返回代理对象。
下面对这几个步骤逐一的分析。
切面解析在分析切面解析过程之前,首先先了解一下几个关键的接口,看下面的类图。
PointCut:描述切点,在进行切点匹配时,使用ClassFilter进行类匹配,MethodMatcher进行执行方法匹配。
Advice:通知,AfterAdvice后通知,BeforeAdvice前通知,DynamicIntroductionAdvice引用通知,环绕通知通过Interceptor实现。
Advisor:通知器,也就是切面,PointcutAdvisor切点通知器,IntroductionAdvisor引用通知器。
在创建AOP代理之前需要把相关的切面配置解析成上面类图中的接口子类的对象,对于ProxyFactoryBean来说,没有这个过程,因为这种方式下不能使用切点。
切面解析完成之后,把解析出的通知添加通知链中,AOP代理对象引用该通知链执行切面通知逻辑。
对于aop标签方式和注解方式添加通知链这个动作的代码是类似的,解析切面这个过程有些差异。
SaUserDAO userdao=(SaUserDAO)context.getBean("userDAOProxy")context.getBean("userDAOProxy")是说从spring环境context中拿出id=userDAOProxy对象.再把这个对象强制转换成SaUserDAO.
你改成
SaUserDAO userdao=(SaUserDAO)context.getBean("SaUserDAO")
你把userDAOProxy对象强转成SaUserDAO,这样行不?
关键是要明白spring做了什么
你的配置文件sessionFactory有没有进行配置
SPRING就是一个IOC容器,简单来讲我们平常一般是NEW一个对象.
有了SPRING后,将对象配置在SPRING后,我们就可以从SPRING的容器里面拿出那些对象了直接用.也就是所谓的注入.
比如说:你在A类中,要调用B类的方法时,通常是new一个B的实例.
用SPRING的话,只用在A中加一个属性 B b然后在配置文件中将A的属性b进行配置就可以了.
<bean id="b" class="B">
<bean id="a" class="wgh.db.A">
<property name="b">
<ref bean="b" />这里的b就是上面的id=b的那个值
</property>
</bean>
关于SPRING的代理
AOP代理
Spring缺省使用J2SE 动态代理(dynamic proxies)来作为AOP的代理。 这样任何接口(或者接口集)都可以被代理。
Spring也可以使用CGLIB代理. 对于需要代理类而不是代理接口的时候CGLIB代理是很有必要的。如果一个业务对象并没有实现一个接口,默认就会使用CGLIB。
简单来讲,你的类没有实现接口就得强制使用CGLIB来代理.类实现了接口默认采用JDK的动态代理机制实现AOP.
强制使用CGLIB生成代理.
1在spring配置文件中加入
<aop:aspectj-autoproxy proxy-target-class="true"/>
2 加入CGLIB库
spring/lib/cglib/*.jar
spring对事务的管理也就是AOP了
推荐你一个不错的视频
我复制一个我学习时用到的配置文件
Spring与hibernate的集成
要控制事务,就得要拿到hibernate的session. hibernate的session获得方式:sessionfactory.sessionfactory的创建configuration,configuration的获得就由配置文件了.Spring整合Hibernate主要是对hibernate的Session进行管理,包含Session的创建、提交、关闭的整个生命周期。此处的session可以看作是一个connection.
声明式事务的配置
1配置sessionfactory
2配置事务管理器
3配置事务的传播特性
4配置哪些哪些方法使用事务
<!--配置sessionfactory -->
配置sessionFactory,让spring来创建Session。
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name=" configLocation ">
<value>classpath:hibernate.cfg.xml</value>hibernate的配置文件
</property>
</bean>
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"//只适合xml方式
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean//兼容注解
<!-- 配置事务管理器 -->
把sessionFactory拿过来放到事务管理器里. 创建了一个id为transactionManager的事务管理器,它匹配一个session工厂,<ref bean="sessionFactory"/>这个sessionFactory是指session工厂的ID。
<bean
id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="beanFactory" ref=” sessionFactory”/>
</bean>
<!-- 配置事务的传播特性 -->
这里创建了一个advice(通知),对事务管理器进行事务设置,这里意思是指,对于以save、del、update开头的方法应用事务。
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 配置哪些哪些方法使用事务 -->
配置的作用是把我们上面创建的advice应用到具体的类中。以下代码的意思指,给包com.spring下的所有类的所有方法应用allManagerMethod()方法.
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.spring.*.*(..))"/>com.spring包下所有的类所有的方法
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>advisor可以理解为一个aspect,一个aspect一般有pointcut,advice.
</aop:config>
你学习这个最好弄懂SPRING的原理
IOC,AOP这些概念原理什么的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)