代
理
的
实
现
{
有
接
口
+
实
现
类
:
s
p
r
i
n
g
采
用
j
d
k
动
态
代
理
P
r
o
x
y
只
有
实
现
类
:
s
p
r
i
n
g
采
用
c
g
l
i
v
字
节
码
增
强
在
.
x
m
l
的
代
理
工
厂
配
置
上
有
o
p
t
m
i
z
e
配
置
\mathrm{代理的实现}\left\{\begin{array}{l}\mathrm{有接口+实现类:}spring采用jdk动态代理Proxy\\\mathrm{只有实现类:}spring采用cgliv字节码增强\\\end{array}\right.\\ 在.xml的代理工厂配置上有optmize配置
代理的实现{有接口+实现类:spring采用jdk动态代理Proxy只有实现类:spring采用cgliv字节码增强在.xml的代理工厂配置上有optmize配置
<property name="optmize" value="true/false"></property>
<!--一般如果目标类有接口,采用jdk动态代理,没有接口,采用cglib字节码增强,如果选择true,则全部使用cglib-->
手动实现jdk动态代理要编写的要素:
{ 目 标 类 : 接 口 + 实 现 类 切 面 类 : 存 放 通 知 工 厂 类 : 编 写 工 厂 生 成 代 理 测 试 类 \left\{\begin{array}{l}\mathrm{目标类}:\mathrm{接口}+\mathrm{实现类}\\\mathrm{切面类}:\mathrm{存放通知}\\\mathrm{工厂类}:\mathrm{编写工厂生成代理}\\\mathrm{测试类}\end{array}\right. ⎩⎪⎪⎨⎪⎪⎧目标类:接口+实现类切面类:存放通知工厂类:编写工厂生成代理测试类
Spring编写半自动代理:
导 入 . j a r 包 { 4 + 1 A O P 联 盟 S p r i n g ( 实 现 ) − a o p \mathrm{导入}.jar包\left\{\begin{array}{l}4+1\\AOP\mathrm{联盟}\\Spring(\mathrm{实现})-aop\end{array}\right. 导入.jar包⎩⎨⎧4+1AOP联盟Spring(实现)−aop
AOP联盟将通知/增强分为5类,这里主要应用环绕通知MethodInterceptor(intercept截取拦截)
try{
//前置通知
//执行目标方法
//后置通知
}catch(){
//异常通知
}
目标类的接口与实现类的写法不变
原来的切面类中确定通知,现在删掉before,after写上invoke
pulic class MyAspect implements MethodInterceptor{
public Object invoke(MethodInvocation mi )throws Throable{
System.out.println("前");
Object obj=mi.procede();//手动执行目标方法
System.out.println("后");
return obj;
}
}
测试:(注意:.getBean(“代理类的id”)😉
public void demo(){
String xmlpath ="com.···.beans.xml"
ApplicationContext applicationContext= new ClassPathXmlApplicationContext(xmlpath);
UserSersvice userSvice =(UserSvice)applicationContext.getBean("代理类的id");
userSvice .adduser();
userSvice .updateuser();
userSvice .deleteuser();
}
.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
">
<!-- 目标类 -->
<bean id="UserId" class="com.~.UserServiceImpl"></bean>
<!-- 切面类 -->
<bean id="MyAspectId" class="com.~.MyAspect"></bean>
<!-- 设置代理工厂 -->
<bean id="proxuServiceId" class="org.springframework.aop.framework.ProxyFactoryBean(用于生产代理对像的类)">
<!-- 代理接口-->
<property name="Interface" value="全限定.UserService"></property>
如果多个接口:
<property name="Interfaces" ><array><value>全限定.UserService</value></array></property>
<!-- 目标类 -->
<property name="target" ref="UserServiceId"></property>
<!-- 切面类 -->
<property name="interceptorNames" value="MyAspectId(多个值仍使用子标签)"></property>
</bean>
</beans>
全自动Spring Aop 编程
1.导入com.springsource.org.aspectj.weaver.RELEASE.jar
2.在.xml中的配置中,目标类,切面类不变,Test中getBean(目标类Id)
3.下面更改xml文件实现Spring aop编程
使用aop:config进行配置
<!--aop标签支持-->
<aop:config>
<!--切入点表达式-->
<aop:pointcut id="mypointcut" expression="execution( * com.~.UserServiceImpl.*(..))"/>
<!--组合通知与切入点-->
<aop:advisor advice-ref="MyAspectId" pointcut-ref="mypointcut"/>
</aop:config>