请教:为什么我定义切面之后,注入失败了(spring)

时间:2022-10-26 20:34:10
框架是struts2+spring2.5+hibernate3.5
以下是定义切面之前的主要代码,运行是成功的
applicationContext.xml:
<bean id="menuAction" class="com.infoCmu.login.action.MenuAction">
<property name="userServer" ref="userServer"></property>
</bean>
java:
public class MenuAction extends ActionSupport {

private UserServer userServer;

public void setUserServer(UserServer userServer){
this.userServer = userServer;
}

public String execute(){
User userobj1 = new User();
userobj1.setUserid("aaa"+(int)Math.floor(Math.random()*1000));
userobj1.setPwd("pwd");
try{
userServer.setUserinfo(userobj1);
}catch(Exception e){
e.printStackTrace();
}
}
这个时候通过debug可以看到,userServer是获得对象的
然后在applicationContext.xml加入了如下切面:
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* *..Action.execute())"/>
</aop:config>
这个时候再debug,上面的userServer就是null了。
最近在学习搭框架,所以程序的层次并不严谨,上面这些是在尝试做数据库事务处理时发生的。下一楼我会尽量贴出全部代码。

29 个解决方案

#1


applicationContext.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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* *..Action.execute())"/>
</aop:config>

<bean id="dataSource" 
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/infocum"></property>
<property name="username" value="root"></property>
<property name="password" value=""></property>
</bean>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mappingResources">
<list>
<value>com/infoCmu/domain/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.autoReconnect">true</prop>

</props>
</property>
</bean>

<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userServer" class="com.infoCmu.servers.UserServer">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<bean id="menuAction" class="com.infoCmu.login.action.MenuAction">
<property name="userServer" ref="userServer"></property>
</bean>

</beans>
java:
public class  MenuAction extends ActionSupport {

private UserServer userServer;

public void setUserServer(UserServer userServer){
this.userServer = userServer;
}
public String execute(){
// db链接实验
User userobj1 = new User();
userobj1.setUserid("aaa"+(int)Math.floor(Math.random()*1000));
userobj1.setPwd("pwd");
try{
userServer.setUserinfo(userobj1);
}catch(Exception e){
e.printStackTrace();
}
return "success";
}

}
public class  UserServer{

public void setUserinfo(User user){
try{
hibernateTemplate.save(user);
}catch(Exception e){
System.out.println(e.getStackTrace());
}
}

HibernateTemplate hibernateTemplate;

public void setHibernateTemplate(HibernateTemplate hibernateTemplate){
this.hibernateTemplate = hibernateTemplate;
}
}

以下是hibernateTool自动生成的mapping代码
package com.infoCmu.obj;

/**
 * User generated by hbm2java
 */
public class  User implements java.io.Serializable {

private String userid;
private String pwd;

public User() {
}

public User(String userid, String pwd) {
this.userid = userid;
this.pwd = pwd;
}

public String getUserid() {
return this.userid;
}

public void setUserid(String userid) {
this.userid = userid;
}

public String getPwd() {
return this.pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

}
User.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2013-5-19 18:00:46 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.infoCmu.obj.User" table="user" catalog="infocmu">
        <id name="userid" type="string">
            <column name="userid" length="20" />
            <generator class="assigned" />
        </id>
        <property name="pwd" type="string">
            <column name="pwd" length="20" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

#2


你的 切面 没有注入 数据源 或 都说是 sessionFactory
<bean id="transactionManager" class="这里是Hibernate的transactionManager工厂类 (至于怎么写我网忘了 好久没用了)">
<tx:advice id="txAdvice" transaction-manager="transactionManager">

#3


二楼的朋友,你的意思是我下面的配置不对是么?
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
 <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>

#4


<tx:advice id="txAdvice" transaction-manager="transactionManager">
 <tx:attributes>
 <tx:method name="execute" propagation="REQUIRED"/>
 </tx:attributes>
 </tx:advice>

少了个属性吧

#5


<tx:advice id="txAdvice"  transaction-manager="transactionManager">
 <tx:attributes>
 <tx:method name="execute" propagation="REQUIRED"/>
 </tx:attributes>
 </tx:advice>

#6


4(5)楼的朋友,谢谢你的回答。
但是transaction-manager的默认值就是"transactionManager",所以不用特别设定。

#7


本人追加分数到100分,向各位大神求解。
这个事情已经折腾我2天了,拜托了。

#8


<aop:config>加上如下属性,试试:

<aop:config proxy-target-class="true">

#9


值栈中userserver为null说明,userserver没注入进去啊。看看你的spring和struts2是否正确整合,另外在你的代码中,  <class name="com.infoCmu.obj.User" table="user" catalog=" infocmu">
和<property name="url" value="jdbc:mysql://localhost:3306/ infocum"></property>两个数据库的名字不一样。关键是你的spring和你的struts2是否整合正确啊

#10


到我的博客下载那个开源项目看看,
基于spring整合的,里面有事务可以参考下做法

#11


一看就是execution(* *..Action.execute())这个有问题。

#12


引用 9 楼 qiangan7788 的回复:
值栈中userserver为null说明,userserver没注入进去啊。看看你的spring和struts2是否正确整合,另外在你的代码中,  <class name="com.infoCmu.obj.User" table="user" catalog=" infocmu">
和<property name="url" value="jdbc:mysql://localhost:3306/ infocum"></property>两个数据库的名字不一样。关键是你的spring和你的struts2是否整合正确啊

只要不加事务处理的切面,程序就是可以的。另外感谢你仔细看了我的程序,才能发现infocum这种细微的地方。我数据库的名字起错了,但是因为是练习,所以懒得改了。改完之后,还是不行,一样的问题。

#13


引用 11 楼 fangmingshijie 的回复:
一看就是execution(* *..Action.execute())这个有问题。

切点的声明我确实有点迷糊。能不能详细点,最好根据我现在的程序,帮我写一下声明?多谢。

#14


改为"execution(*  com.infoCmu.Action.*.*(..))"
根据你具体包名写

#15


引用 8 楼 ABCD_0000 的回复:
<aop:config>加上如下属性,试试:

<aop:config proxy-target-class="true">

加上这个属性启动就报错了。所以应该不是这个的问题。
Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.

#16


引用 13 楼 weightman2008 的回复:
Quote: 引用 11 楼 fangmingshijie 的回复:

一看就是execution(* *..Action.execute())这个有问题。

切点的声明我确实有点迷糊。能不能详细点,最好根据我现在的程序,帮我写一下声明?多谢。

确实有可能是切点的声明错误导致其后无法注入,Action应该无法代表MenuAction,这个查一下就知道了
即使先暂时换成MenuAction用来测试

#17


execution(* com.accp.biz.impl.*(这个*代表你的类).*(这个*代表你类中的方法)(..(括号中的两点代表你方法中的参数)))

#18


引用 15 楼 weightman2008 的回复:
加上这个属性启动就报错了。所以应该不是这个的问题。
Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.

没必要强制aop使用cglib代理,jdk动态代理没有报出错误

#19


引用 14 楼 fangmingshijie 的回复:
改为"execution(*  com.infoCmu.Action.*.*(..))"
根据你具体包名写

已经改成如下内容,还是一样的:
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* com.infoCmu.login.action.MenuAction.execute())"/>
</aop:config>

#20


引用 6 楼 weightman2008 的回复:
4(5)楼的朋友,谢谢你的回答。
但是transaction-manager的默认值就是"transactionManager",所以不用特别设定。

请教:为什么我定义切面之后,注入失败了(spring)这个还不知道呢,学习了

#21


execution(* com.infoCmu.login.action.MenuAction.execute( ..))是不是少了2点啊

#22


还是好好看看aop里面的几个概念再写配置吧

#23


谢谢各位的回复,我现在将事务处理定位在了server,经提示加入了cglib等包之后,在server层形成了事务。
我想也许是因为struts对action有限制所以无法设定切点吧。但我更期望能在action层形成事务,这个问题我回头再找找资料,如果大家还有好的想法,请继续回复。
我下午再研究下,晚上或者明天来结贴。再次感谢!

#24


引用 8 楼 ABCD_0000 的回复:
<aop:config>加上如下属性,试试:

<aop:config proxy-target-class="true">

果然是这个原因呢,加上这句话,事务处理切面就可以正常处理了,谢谢。
之前报错是因为缺少包,我以为是设定有问题,不好意思,但是切面如果定在server就不用这句话,下午再研究下。

#25


百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?

#26


引用 25 楼 weightman2008 的回复:
百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?

使用jdk动态代理的前提是受代理目标对象至少要实现一个接口,如果没有实现任何接口,就得用cglib了

#27


引用 26 楼 dracularking 的回复:
Quote: 引用 25 楼 weightman2008 的回复:

百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?

使用jdk动态代理的前提是受代理目标对象至少要实现一个接口,如果没有实现任何接口,就得用cglib了


那为什么一定要在切面里加入<aop:config  proxy-target-class="true">呢?我还实验了一下,加入了序列化的借口serialize,但是也不行。

#28


引用 27 楼 weightman2008 的回复:
那为什么一定要在切面里加入<aop:config  proxy-target-class="true">呢?我还实验了一下,加入了序列化的借口serialize,但是也不行。

这个配置就是指示使用cglib。

Serializable接口这个倒特别提及,

我查到是这么实现的,假设 SimplePojo implements Pojo

ProxyFactory factory = new ProxyFactory(new SimplePojo());
factory.adddInterface(Pojo.class);
factory.addAdvice(new RetryAdvice());
factory.setExposeProxy(true);

Pojo pojo = (Pojo) factory.getProxy();

// this is a method call on the proxy!
pojo.foo();

#29


加包或者让serverxxx被代理类实现一个接口

#1


applicationContext.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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* *..Action.execute())"/>
</aop:config>

<bean id="dataSource" 
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/infocum"></property>
<property name="username" value="root"></property>
<property name="password" value=""></property>
</bean>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mappingResources">
<list>
<value>com/infoCmu/domain/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.autoReconnect">true</prop>

</props>
</property>
</bean>

<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userServer" class="com.infoCmu.servers.UserServer">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<bean id="menuAction" class="com.infoCmu.login.action.MenuAction">
<property name="userServer" ref="userServer"></property>
</bean>

</beans>
java:
public class  MenuAction extends ActionSupport {

private UserServer userServer;

public void setUserServer(UserServer userServer){
this.userServer = userServer;
}
public String execute(){
// db链接实验
User userobj1 = new User();
userobj1.setUserid("aaa"+(int)Math.floor(Math.random()*1000));
userobj1.setPwd("pwd");
try{
userServer.setUserinfo(userobj1);
}catch(Exception e){
e.printStackTrace();
}
return "success";
}

}
public class  UserServer{

public void setUserinfo(User user){
try{
hibernateTemplate.save(user);
}catch(Exception e){
System.out.println(e.getStackTrace());
}
}

HibernateTemplate hibernateTemplate;

public void setHibernateTemplate(HibernateTemplate hibernateTemplate){
this.hibernateTemplate = hibernateTemplate;
}
}

以下是hibernateTool自动生成的mapping代码
package com.infoCmu.obj;

/**
 * User generated by hbm2java
 */
public class  User implements java.io.Serializable {

private String userid;
private String pwd;

public User() {
}

public User(String userid, String pwd) {
this.userid = userid;
this.pwd = pwd;
}

public String getUserid() {
return this.userid;
}

public void setUserid(String userid) {
this.userid = userid;
}

public String getPwd() {
return this.pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

}
User.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2013-5-19 18:00:46 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.infoCmu.obj.User" table="user" catalog="infocmu">
        <id name="userid" type="string">
            <column name="userid" length="20" />
            <generator class="assigned" />
        </id>
        <property name="pwd" type="string">
            <column name="pwd" length="20" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

#2


你的 切面 没有注入 数据源 或 都说是 sessionFactory
<bean id="transactionManager" class="这里是Hibernate的transactionManager工厂类 (至于怎么写我网忘了 好久没用了)">
<tx:advice id="txAdvice" transaction-manager="transactionManager">

#3


二楼的朋友,你的意思是我下面的配置不对是么?
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
 <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>

#4


<tx:advice id="txAdvice" transaction-manager="transactionManager">
 <tx:attributes>
 <tx:method name="execute" propagation="REQUIRED"/>
 </tx:attributes>
 </tx:advice>

少了个属性吧

#5


<tx:advice id="txAdvice"  transaction-manager="transactionManager">
 <tx:attributes>
 <tx:method name="execute" propagation="REQUIRED"/>
 </tx:attributes>
 </tx:advice>

#6


4(5)楼的朋友,谢谢你的回答。
但是transaction-manager的默认值就是"transactionManager",所以不用特别设定。

#7


本人追加分数到100分,向各位大神求解。
这个事情已经折腾我2天了,拜托了。

#8


<aop:config>加上如下属性,试试:

<aop:config proxy-target-class="true">

#9


值栈中userserver为null说明,userserver没注入进去啊。看看你的spring和struts2是否正确整合,另外在你的代码中,  <class name="com.infoCmu.obj.User" table="user" catalog=" infocmu">
和<property name="url" value="jdbc:mysql://localhost:3306/ infocum"></property>两个数据库的名字不一样。关键是你的spring和你的struts2是否整合正确啊

#10


到我的博客下载那个开源项目看看,
基于spring整合的,里面有事务可以参考下做法

#11


一看就是execution(* *..Action.execute())这个有问题。

#12


引用 9 楼 qiangan7788 的回复:
值栈中userserver为null说明,userserver没注入进去啊。看看你的spring和struts2是否正确整合,另外在你的代码中,  <class name="com.infoCmu.obj.User" table="user" catalog=" infocmu">
和<property name="url" value="jdbc:mysql://localhost:3306/ infocum"></property>两个数据库的名字不一样。关键是你的spring和你的struts2是否整合正确啊

只要不加事务处理的切面,程序就是可以的。另外感谢你仔细看了我的程序,才能发现infocum这种细微的地方。我数据库的名字起错了,但是因为是练习,所以懒得改了。改完之后,还是不行,一样的问题。

#13


引用 11 楼 fangmingshijie 的回复:
一看就是execution(* *..Action.execute())这个有问题。

切点的声明我确实有点迷糊。能不能详细点,最好根据我现在的程序,帮我写一下声明?多谢。

#14


改为"execution(*  com.infoCmu.Action.*.*(..))"
根据你具体包名写

#15


引用 8 楼 ABCD_0000 的回复:
<aop:config>加上如下属性,试试:

<aop:config proxy-target-class="true">

加上这个属性启动就报错了。所以应该不是这个的问题。
Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.

#16


引用 13 楼 weightman2008 的回复:
Quote: 引用 11 楼 fangmingshijie 的回复:

一看就是execution(* *..Action.execute())这个有问题。

切点的声明我确实有点迷糊。能不能详细点,最好根据我现在的程序,帮我写一下声明?多谢。

确实有可能是切点的声明错误导致其后无法注入,Action应该无法代表MenuAction,这个查一下就知道了
即使先暂时换成MenuAction用来测试

#17


execution(* com.accp.biz.impl.*(这个*代表你的类).*(这个*代表你类中的方法)(..(括号中的两点代表你方法中的参数)))

#18


引用 15 楼 weightman2008 的回复:
加上这个属性启动就报错了。所以应该不是这个的问题。
Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.

没必要强制aop使用cglib代理,jdk动态代理没有报出错误

#19


引用 14 楼 fangmingshijie 的回复:
改为"execution(*  com.infoCmu.Action.*.*(..))"
根据你具体包名写

已经改成如下内容,还是一样的:
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* com.infoCmu.login.action.MenuAction.execute())"/>
</aop:config>

#20


引用 6 楼 weightman2008 的回复:
4(5)楼的朋友,谢谢你的回答。
但是transaction-manager的默认值就是"transactionManager",所以不用特别设定。

请教:为什么我定义切面之后,注入失败了(spring)这个还不知道呢,学习了

#21


execution(* com.infoCmu.login.action.MenuAction.execute( ..))是不是少了2点啊

#22


还是好好看看aop里面的几个概念再写配置吧

#23


谢谢各位的回复,我现在将事务处理定位在了server,经提示加入了cglib等包之后,在server层形成了事务。
我想也许是因为struts对action有限制所以无法设定切点吧。但我更期望能在action层形成事务,这个问题我回头再找找资料,如果大家还有好的想法,请继续回复。
我下午再研究下,晚上或者明天来结贴。再次感谢!

#24


引用 8 楼 ABCD_0000 的回复:
<aop:config>加上如下属性,试试:

<aop:config proxy-target-class="true">

果然是这个原因呢,加上这句话,事务处理切面就可以正常处理了,谢谢。
之前报错是因为缺少包,我以为是设定有问题,不好意思,但是切面如果定在server就不用这句话,下午再研究下。

#25


百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?

#26


引用 25 楼 weightman2008 的回复:
百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?

使用jdk动态代理的前提是受代理目标对象至少要实现一个接口,如果没有实现任何接口,就得用cglib了

#27


引用 26 楼 dracularking 的回复:
Quote: 引用 25 楼 weightman2008 的回复:

百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?

使用jdk动态代理的前提是受代理目标对象至少要实现一个接口,如果没有实现任何接口,就得用cglib了


那为什么一定要在切面里加入<aop:config  proxy-target-class="true">呢?我还实验了一下,加入了序列化的借口serialize,但是也不行。

#28


引用 27 楼 weightman2008 的回复:
那为什么一定要在切面里加入<aop:config  proxy-target-class="true">呢?我还实验了一下,加入了序列化的借口serialize,但是也不行。

这个配置就是指示使用cglib。

Serializable接口这个倒特别提及,

我查到是这么实现的,假设 SimplePojo implements Pojo

ProxyFactory factory = new ProxyFactory(new SimplePojo());
factory.adddInterface(Pojo.class);
factory.addAdvice(new RetryAdvice());
factory.setExposeProxy(true);

Pojo pojo = (Pojo) factory.getProxy();

// this is a method call on the proxy!
pojo.foo();

#29


加包或者让serverxxx被代理类实现一个接口