Spring 实现AOP是依赖JDK动态代理和CGLIB代理实现的。
以下是JDK动态代理和CGLIB代理简单介绍
JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。
CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强。
1)定义接口:
package com.beckham.dao;
import com.beckham.model.Person;
public interface PersonDAO {
public void add(Person person) ;
}
2)实现接口:
package com.beckham.daoimp;
import com.beckham.dao.PersonDAO;
import com.beckham.model.Person;
public class PersonDAOImp implements PersonDAO {
public void add(Person person) {
System.out.println(person.getName());
}
}
3)服务层:
package com.beckham.service;
import com.beckham.dao.PersonDAO;
import com.beckham.model.Person;
public class PersonService {
//注入personDAO
private PersonDAO personDAO ;
public PersonDAO getPersonDAO() {
return personDAO;
}
public void setPersonDAO(PersonDAO personDAO) {
this.personDAO = personDAO;
}
//调用personDAOImp里面的方法
public void add(Person person) {
personDAO.add(person) ;
}
}
4)切面类:
package com.beckham.aop;
public class LogHandler {
public void before(){
System.out.println("方法开始.......");
}
public void after(){
System.out.println("方法结束.......");
}
}
5)XML配置切面
<?xml version="1.0" encoding="UTF-8"?>
<!--
Application context definition for PetClinic on JPA.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
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/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="person" class="com.beckham.model.Person"
scope="prototype" />
<bean id="personDAO" class="com.beckham.daoimp.PersonDAOImp" />
<bean id="personService"
class="com.beckham.service.PersonService">
<property name="personDAO" ref="personDAO"></property>
</bean>
<bean id="user" class="com.beckham.model.User" />
<bean id="userDAO" class="com.beckham.daoimp.UserDAOImp" />
<bean id="userServiceInterfaceImpl"
class="com.beckham.service.UserServiceInterfaceImpl">
<property name="userDAO" ref="userDAO"></property>
</bean>
<!-- AOP配置 -->
<bean id="loghandler" class="com.beckham.aop.LogHandler" />
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut id="logCut"
expression="execution(* com.beckham.daoimp.PersonDAOImp.*(..))" />
<!-- 引用该切面类 -->
<aop:aspect id="aspect" ref="loghandler">
<aop:before method="before" pointcut-ref="logCut" />
<aop:after method="after" pointcut-ref="logCut" />
</aop:aspect>
</aop:config>
<!-- AOP配置 -->
<bean id="timehandler" class="com.beckham.aop.TimeHandler" />
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut id="timeCut"
expression="execution(* com.beckham.daoimp..*(..))" />
<!-- 引用该切面类 -->
<aop:aspect id="timAspect" ref="timehandler">
<aop:before method="before" pointcut-ref="timeCut" />
<aop:after method="after" pointcut-ref="timeCut" />
</aop:aspect>
</aop:config>
</beans>
6)测试:
package com.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.beckham.model.Person;
import com.beckham.model.User;
import com.beckham.service.PersonService;
import com.beckham.service.UserServiceInterface;
public class SpringTest {
/**
* beckham Dec 28, 2009 1:21:09 PM
*/
public static void main(String[] args) {
personManager();
}
public static void personManager() {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Person p = (Person) ctx.getBean("person");
p.setName("张三");
PersonService ps = (PersonService) ctx.getBean("personService");
ps.add(p);
}
public static void userManager() {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
User u = (User) ctx.getBean("user");
u.setName("张三");
UserServiceInterface ps = (UserServiceInterface) ctx.getBean("userServiceInterfaceImpl");
ps.sayHello(u.getName());
}
}
测试结果:
方法开始.......
1262678458703
张三
1262678458703
方法结束.......
分享到:
相关推荐
在Java开发中,动态代理和CGLIB代理是两种常见的面向切面编程(AOP)实现方式,它们都用于在不修改原有代码的情况下,增强或扩展对象的功能。本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中...
Spring 框架中 JDK 动态代理和 CGLIB 动态代理是 Spring AOP 中一个非常重要的知识点。Spring AOP 框架会根据实际情况选择使用 JDK 的动态代理还是 CGLIB 的动态代理。 JDK 动态代理是 Java 自带的动态代理机制,它...
Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...
5. **配置代理**:Spring会根据目标对象是否实现了接口来决定使用JDK动态代理还是CGLIB代理。如果目标对象实现了接口,Spring会选择JDK动态代理。动态代理类会继承自`java.lang.reflect.Proxy`,并实现目标对象的...
在实际开发中,如Spring AOP框架就同时支持JDK和CGLIB动态代理,根据目标类是否实现接口自动选择合适的代理方式。 总结来说,JDK动态代理和CGLIB动态代理都是为了在运行时提供对目标对象的增强,它们通过不同的实现...
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
Spring AOP则是在Spring框架中对AOP概念的实现,它利用了JDK动态代理或CGLIB(字节码增强)来实现。Spring AOP的主要目标是分离关注点,将非业务逻辑(如日志、事务管理)从核心业务代码中解耦出来。以下是Spring ...
在Spring AOP中,当目标对象实现了至少一个接口时,Spring会使用JDK的动态代理来创建代理对象。这是因为JDK的动态代理只适用于实现了接口的类,它通过生成一个与目标类接口相同的新类来实现代理。这个新类在运行时被...
Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...
Java中的动态代理、反射和...总之,理解和掌握JDK动态代理、CGLIB动态代理、反射和拦截器是提升Java开发技能的关键步骤。通过实际操作这些示例,你将能够更好地应用这些技术到实际项目中,提高代码的灵活性和可维护性。
Spring支持JDK动态代理和CGLIB动态代理,根据目标类是否实现了接口来选择合适的代理方式。 总结来说,代理模式是软件设计中的一个重要工具,它提供了在不修改原始对象的前提下扩展功能的能力。Java中的静态代理、...
Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code Generation Library)是一个开源的代码生成库,它允许运行时在内存中...
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...
在Spring AOP(面向切面编程)中,CGLIB是一个重要的动态代理库,它用于在运行时创建子类以实现对目标对象的代理。...在实际项目中,根据需求和性能考虑,我们可以灵活选择JDK动态代理或CGLIB代理来实现面向切面编程。
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用CGLIB实现AOP? * 添加CGLIB库,SPRING_HOME/cglib/*.jar * 在spring配置文件中加入<aop:aspectj-...
本资源将深入探讨Spring框架中使用的两种关键的动态代理方式:JDK动态代理和CGLib动态代理。这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好...
Spring AOP 中 JDK 和 CGLib 动态代理哪个更快?
在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...
- Spring支持两种类型的代理:JDK动态代理(如果目标对象实现了接口)和CGLIB代理(如果目标对象没有接口,使用字节码生成技术)。 - 在Spring配置中,可以使用`@Aspect`注解定义切面,`@Before`、`@After`、`@...
Spring的AOP实现有两种方式:JDK动态代理和CGLIB字节码代理。当目标对象实现了一个或多个接口时,Spring会选择使用JDK动态代理。以下是Spring AOP使用JDK动态代理的基本步骤: 1. **创建代理对象**:Spring会创建一...