Java代码
<BR>public class UserDAOImpl{
<BR><BR> public void save() {
<BR> // TODO Auto-generated method stub
<BR> System.out.println("user saved");
<BR> }
<BR>}
<BR>//相关配置,省略了一些不相关内容
<BR><bean id="userDAO" class="UserDAOImpl">
<BR><bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<BR> <property name="target">
<BR> <ref local="userDAO" />
<BR> </property>
<BR></bean>
public class UserDAOImpl{
public void save() {
// TODO Auto-generated method stub
System.out.println("user saved");
}
}
//相关配置,省略了一些不相关内容
<bean id="userDAO" class="UserDAOImpl">
<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target">
<ref local="userDAO" />
</property>
</bean> 测试代码
Java代码
ApplicationContext ctx =
<BR> new FileSystemXmlApplicationContext("applicationContext.xml");
<BR> UserDAOImpl userDAOImpl =
<BR> (UserDAOImpl)ctx.getBean("userDAOProxy");
<BR> userDAOImpl.save();
ApplicationContext ctx =
new FileSystemXmlApplicationContext("applicationContext.xml");
UserDAOImpl userDAOImpl =
(UserDAOImpl)ctx.getBean("userDAOProxy");
userDAOImpl.save(); 上面这种情况下程序可以正常运行,但是如果UserDAOImpl实现了一个接口,其他不变
Java代码
public class UserDAOImpl implements UserDAO {
<BR>
<BR> public void save() {
<BR> // TODO Auto-generated method stub
<BR> System.out.println("user saved");
<BR> }
<BR>
<BR>}
public class UserDAOImpl implements UserDAO {
public void save() {
// TODO Auto-generated method stub
System.out.println("user saved");
}
} 这种情况下,程序将不能正常运行,会抛出java.lang.ClassCastException异常
理解上面这种情况产生的原因需要了解Spring AOP的实现原理。
Spring 实现AOP是依赖JDK动态代理和CGLIB代理实现的。
以下是JDK动态代理和CGLIB代理简单介绍
JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。
CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强。
Spring是依靠什么来判断采用哪种代理策略来生成AOP代理呢?以下代码就是Spring的判断逻辑
Java代码
//org.springframework.aop.framework.DefaultAopProxyFactory
<BR> //参数AdvisedSupport 是Spring AOP配置相关类
<BR> public AopProxy createAopProxy(AdvisedSupport advisedSupport)
<BR> throws AopConfigException {
<BR> //在此判断使用JDK动态代理还是CGLIB代理
<BR> if (advisedSupport.isOptimize() || advisedSupport.isProxyTargetClass()
<BR> || hasNoUserSuppliedProxyInterfaces(advisedSupport)) {
<BR> if (!cglibAvailable) {
<BR> throw new AopConfigException(
<BR> "Cannot proxy target class because CGLIB2 is not available. "
<BR> + "Add CGLIB to the class path or specify proxy interfaces.");
<BR> }
<BR> return CglibProxyFactory.createCglibProxy(advisedSupport);
<BR> } else {
<BR> return new JdkDynamicAopProxy(advisedSupport);
<BR> }
<BR> }
//org.springframework.aop.framework.DefaultAopProxyFactory
//参数AdvisedSupport 是Spring AOP配置相关类
public AopProxy createAopProxy(AdvisedSupport advisedSupport)
throws AopConfigException {
//在此判断使用JDK动态代理还是CGLIB代理
if (advisedSupport.isOptimize() || advisedSupport.isProxyTargetClass()
|| hasNoUserSuppliedProxyInterfaces(advisedSupport)) {
if (!cglibAvailable) {
throw new AopConfigException(
"Cannot proxy target class because CGLIB2 is not available. "
+ "Add CGLIB to the class path or specify proxy interfaces.");
}
return CglibProxyFactory.createCglibProxy(advisedSupport);
} else {
return new JdkDynamicAopProxy(advisedSupport);
}
}
advisedSupport.isOptimize()与advisedSupport.isProxyTargetClass()默认返回都是false,所以在默认情况下目标对象有没有实现接口决定着Spring采取的策略,当然可以设置advisedSupport.isOptimize()或者advisedSupport.isProxyTargetClass()返回为true,这样无论目标对象有没有实现接口Spring都会选择使用CGLIB代理。所以在默认情况下,如果一个目标对象如果实现了接口Spring则会选择JDK动态代理策略动态的创建一个接口实现类(动态代理类)来代理目标对象,可以通俗的理解这个动态代理类是目标对象的另外一个版本,所以这两者之间在强制转换的时候会抛出j ava.lang.ClassCastException。而所以在默认情况下,如果目标对象没有实现任何接口,Spring会选择CGLIB代理, 其生成的动态代理对象是目标类的子类。
以上说的是默认情况下,也可以手动配置一些选项使Spring采用CGLIB代理。
org.springframework.transaction.interceptor.TransactionProxyFactoryBean是org.springframework.aop.framework. ProxyConfig的子类,所以可以参照ProxyConfig里的一些设置如下所示,将optimize和proxyTargetClass任意一个设置为true都可以强制Spring采用CGLIB代理。
Java代码
//相关配置,省略了一些不相关内容
<BR><bean id="userDAO" class="UserDAOImpl">
<BR><bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<BR> <property name="target">
<BR> <ref local="userDAO" />
<BR> </property>
<BR> <property name="optimize">
<BR> <value>true</value>
<BR> </property>
<BR> <property name="proxyTargetClass">
<BR> <value>true</value>
<BR> </property>
<BR></bean>
//相关配置,省略了一些不相关内容
<bean id="userDAO" class="UserDAOImpl">
<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target">
<ref local="userDAO" />
</property>
<property name="optimize">
<value>true</value>
</property>
<property name="proxyTargetClass">
<value>true</value>
</property>
</bean>
使用CGLIB代理也就不会出现前面提到的ClassCastException问题了,
也可以在性能上有所提高,但是也有它的弊端,Spring doc原文解释如下optimization will usually mean that advice changes won't take effect after a proxy has been created. For this reason, optimization is disabled by default。
分享到:
相关推荐
"如何科学高效地抄袭别人家的产品功能"这一主题实际上是在探讨如何以合法、尊重知识产权的方式,汲取他人的创新点,转化为自身的竞争优势。下面我们将深入探讨这个话题。 首先,了解竞争对手的产品功能是市场分析的...
本人原创作品,未抄袭他人。 本人原创作品,未抄袭他人。 本人原创作品,未抄袭他人。 本人原创作品,未抄袭他人。 本人原创作品,未抄袭他人。 本人原创作品,未抄袭他人。 本人原创作品,未抄袭他人。 本人原创...
在学术语境中,抄袭指的是未经许可,将别人的作品、观点或研究成果作为自己的劳动成果。这不仅包括直接复制他人文字,还包括间接地将他人的观点或创新思想占为己有而不给予适当的标注和承认。不管是哪种形式的抄袭,...
临摹、抄袭,注定是一个受到争议的话题,老牛从自身经历的那段临摹的日子,来给大家聊聊这些事儿。“我不知道第一步要干什么”——相信这是挺多小伙伴们所苦恼的事情。看过之前系列文章的小伙伴们应该了解,我主张”...
这一功能对于学术人员来说是至关重要的,它能够帮助他们避免在学术写作中不自觉地抄袭他人成果,同时也保护了他们的研究成果不受抄袭之害。 该软件的免费性质极大地降低了技术使用门槛,让更多的人有机会接触到高...
1. 网站设计和内容的原创性:企业应确保其在线内容和设计是原创的,避免抄袭他人的创意,否则可能面临法律责任。 2. 著作权的保护:网站的布局、文字、图片等元素都可能构成作品,享有著作权,未经许可的复制会侵犯...
"基于SIM的vjudge比赛反抄袭工具"是针对此类需求设计的一个软件,主要用于检测参赛代码之间的相似度,防止参赛者在比赛中抄袭他人的代码。SIM(Similarity)算法是这类工具的核心,通过比对各参赛作品间的代码相似度...
在学术界,保持原创性和诚信至关重要,而"反论文抄袭软件"正是为了这一目标而设计的工具。这类软件主要用于检测毕业论文的原创性,确保学生的作品独立完成,未侵犯他人的知识产权。以下将详细探讨这一领域的相关知识...
例如,不诚实的行为会被指出,如抄袭别人试卷,而正确的做法是承认错误并向他人道歉。同时,孩子们需要学会理解和尊重父母的观点,即使与他们有不同的看法,也要通过沟通表达自己的想法。 2. 法治意识:虽然题目...
3. **增加个人见解**:在参考他人观点的基础上,加入自己的分析和解读,使论文更具原创性。 4. **使用同义词替换**:合理运用同义词替换原有的词汇,但在保持原文意义不变的前提下进行。 5. **结构调整**:调整...
"反抄袭软件"是一种专门设计用于检测文本相似度的工具,旨在帮助作者确保他们的作品是原创的,并且不侵犯他人的知识产权。这种软件通常采用复杂的算法来分析和比较大量文献数据,找出可能的抄袭段落。 在撰写论文时...
在市场潜力的预判下,HTC不再满足于仅仅为别人生产手机,而是决定建立自己的品牌,并在三年的深思熟虑后实施了这一战略。转型过程中,HTC在代工的同时,与电信运营商建立合作,为自有品牌的推出打下坚实基础。HTC...
"反抄袭软件"是专门设计用于检测文本相似度的工具,它们可以帮助作者确保他们的作品是独立创作的,并且没有无意中引用或复制了他人的内容。这类软件广泛应用于教育、科研、出版等领域,确保学术诚信。 一、反抄袭...
这款软件专门针对CAD2004版设计,能够识别并检测出CAD图纸中的相似度,帮助教师判断学生作业是否抄袭或拷贝自他人的作品。通过比对不同图纸的几何形状、尺寸、颜色和图层设置等关键元素,软件可以找出潜在的抄袭迹象...
8. 学习途径的辨析:抄袭别人试卷是不正当的学习行为,不能视为学习途径。 9. 社交礼仪:串门时应尊重他人,如礼貌敲门、主动打招呼和帮忙整理物品。 10. 同学关系:与同学在一起可以共同学习、游戏,但不能一起...
在撰写毕业论文时,学生需要确保自己的研究成果独立且原创,但有时候可能会无意间引用了他人的观点或数据而未给予充分的引用,这就可能涉及到抄袭的问题。抄袭不仅违反了学术道德,也可能导致严重的学术处罚,如撤销...
抄袭是指在没有给出适当引用的情况下,使用他人的观点、研究成果或者表达方式,将其作为自己的成果。在学术界,每个作者都必须尊重他人的知识产权,正确引用所有参考资料。而这款反抄袭软件就是用来检测这种不正当...
使用过程中,要遵循软件的版权规定,不得用于非法用途,尊重他人的知识产权。 总的来说,反抄袭检测工具是保障学术诚信的重要辅助手段,它帮助学生和研究人员确保其作品的原创性,避免潜在的抄袭风险。通过熟练使用...