Java代码
package com.bjsxt.spring;
public class UserManagerImpl {
public void addUser(String name, String password) {
System.out.println("UserManagerImpl.addUser() -- name: " + name);
}
public void delUser(int id) {
System.out.println("UserManagerImpl.delUser() -- id: " + id);
}
public void modifyUser(int id, String name, String password) {
System.out.println("UserManagerImpl.modifyUser() -- id: " + id);
}
}
package com.bjsxt.spring; public class UserManagerImpl { public void addUser(String name, String password) { System.out.println("UserManagerImpl.addUser() -- name: " + name); } public void delUser(int id) { System.out.println("UserManagerImpl.delUser() -- id: " + id); } public void modifyUser(int id, String name, String password) { System.out.println("UserManagerImpl.modifyUser() -- id: " + id); } }
Java代码
package com.bjsxt.spring;
import org.aspectj.lang.JoinPoint;
public class MySecurityManagerImpl {
public void checkSecurity(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
if (args != null) {
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
if ("张三".equals(args[0])) {
System.out.println("你没有权限访问");
}
}
//...
//...
//System.out.println("进行安全检查!!");
}
}
package com.bjsxt.spring; import org.aspectj.lang.JoinPoint; public class MySecurityManagerImpl { public void checkSecurity(JoinPoint joinPoint) { Object[] args joinPoint.getArgs();
2.看看这次spring配置文件是如何配置的.
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Application context definition for JPetStore's business layer.
- Contains bean references to the transaction manager and to the DAOs in
- dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="userManager" class="com.bjsxt.spring.UserManagerImpl"/>
<bean id="mySecurityManager" class="com.bjsxt.spring.MySecurityManagerImpl"/>
<aop:config>
<aop:pointcut id="allAddMethod" expression="execution(* add*(..))"/>
<aop:aspect id="securityAspect" ref="mySecurityManager">
<aop:before pointcut-ref="allAddMethod" method="checkSecurity"/>
</aop:aspect>
</aop:config>
</beans>
<?xml version="1.0" encoding="UTF-8"?> <!-- - Application context definition for JPetStore's business layer. - Contains bean references to the transaction manager and to the DAOs in - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation"). --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <bean id="userManager" class="com.bjsxt.spring.UserManagerImpl"/> <bean id="mySecurityManager" class="com.bjsxt.spring.MySecurityManagerImpl"/> <aop:config> <aop:pointcut id="allAddMethod" expression="execution(* add*(..))"/> <aop:aspect id="securityAspect" ref="mySecurityManager"> <aop:before pointcut-ref="allAddMethod" method="checkSecurity"/> </aop:aspect> </aop:config> </beans>
3.写测试类
Java代码
package com.bjsxt.spring;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import junit.framework.TestCase;
public class TestAop extends TestCase {
public void testAop1() {
//读取配置文件,获取BeanFactory
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-beans.xml");
UserManagerImpl userManager = (UserManagerImpl)factory.getBean("userManager");
userManager.addUser("张三", "123");
// userManager.delUser(1);
// userManager.modifyUser(1, "李四", "abc");
}
}
package com.bjsxt.spring; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; import junit.framework.TestCase; public class TestAop extends TestCase { public void testAop1() { //读取配置文件,获取BeanFactory BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-beans.xml"); UserManagerImpl userManager = (UserManagerImpl)factory.getBean("userManager"); userManager.addUser("张三", "123"); // userManager.delUser(1); // userManager.modifyUser(1, "李四", "abc"); } }
4.我们看看运行结果:
Java代码
张三
123
你没有权限访问
UserManagerImpl.addUser() -- name: 张三
张三 123 你没有权限访问 UserManagerImpl.addUser() -- name: 张三
5. 如果目标类实现了接口,默认采用JDK动态代理来实现AOP
如果目标类没有实现接口,必须添加CGLIB支持,Spring会自动的在JDK和CGLIB代理之间切换
如果目标类实现了接口,可以定义让spring强制使用CGLIB代理
如何强制使用CGLIB代理实现AOP
将<aop:config>定义为<aop:config proxy-target-class="true">,
并且要引入CGLIB包:SPRING_HOME\lib\cglib\*.jar
http://blog.sina.com.cn/s/blog_44167fca0100eep6.html
分享到:
相关推荐
Spring支持两种代理机制:基于接口的JDK动态代理和基于类的CGLIB代理。 CGLIB(Code Generation Library)是一个强大的高性能代码生成库,其底层是通过使用操作Java字节码的开源字节码操作框架(比如ASM)来实现的...
在Spring中,Objenesis主要用于处理一些特殊情况,比如在CGLIB代理中,当目标类没有无参构造函数时,Objenesis可以帮助创建对象实例。 Objenesis的主要特点: 1. 快速:Objenesis设计为快速且高效,避免了传统构造...
Spring使用CGILib作为其代理实现的一部分,特别是在进行代理代理时,如事务管理、AOP切面等。 其次,`spring-objenesis-repack-2.1.jar`则是关于Objenesis库。Objenesis是一个轻量级库,用于在Java中快速实例化无参...
在Spring中,当目标对象不支持代理(如final类)或者没有接口时,Spring会使用CGLIB来生成代理对象,实现对目标对象的拦截和增强。"spring-cglib-repack-3.2.5.jar"是Spring项目对CGLIB的一个打包版本,方便在阅读...
当目标对象不支持接口或者为了提高性能时,Spring会使用CGLIB代理来创建代理对象。`spring-cglib-repack-3.2.6.jar` 包含了CGLIB库的重新打包版本,可能包含了针对Spring框架优化的特定实现,确保与Spring的其他组件...
在Spring中,当一个类没有实现接口时,Spring会使用CGLIB来创建代理对象,以便在不修改原有代码的情况下,为对象添加额外的功能,如事务管理、性能监控等。CGLIB的repack版本是对原始CGLIB库的重新打包,目的是为了...
当Spring需要对某个目标对象进行代理,但该对象不支持接口时,就会使用CGLIB。CGLIB通过字节码生成技术,为原始类创建一个子类,并在子类中拦截方法调用,实现事务管理、日志记录、性能监控等切面功能。3.2.5是CGLIB...
例如,Spring的事务管理、缓存管理和性能监控等功能,都可能依赖于CGlib动态代理。`repack`通常意味着这个库已经被重新打包,可能包含了特定的修改或优化,以便更好地与其他组件集成。 其次,`spring-objenesis-...
在Spring AOP中,有两种主要的代理方式:JDK动态代理和CGLib代理。JDK动态代理基于接口,如果目标对象实现了至少一个接口,Spring会使用JDK的Proxy类生成一个代理对象。而如果没有接口或者接口方法不能满足需求,...
在某些情况下,Spring使用Objenesis来实例化无参构造函数的类,特别是在CGLIB代理中。`spring-objenesis-repack-2.6.jar`是Spring框架与Objenesis集成的打包版本,同样可能包含了避免与其他库冲突的调整。 Apache...
当Spring需要为目标对象创建代理以便实现方法拦截时,如果目标类没有实现接口,CGLIB就会派上用场,生成一个该类的子类,然后在子类中插入拦截逻辑。这样,我们可以在不修改原有代码的情况下,通过AOP来增强或监控...
Spring框架使用CGLIB来创建代理对象,当目标类没有实现接口或者用户希望避免因接口添加新方法而导致的不兼容问题时,Spring会使用CGLIB。 接下来,我们来看"Objenesis"。Objenesis是一个Java库,用于在没有调用构造...
在Spring中,当目标类不支持接口(即不能使用Java的动态代理)时,CGLIB就会被用来创建代理对象,实现对目标类的方法拦截。CGLIB通过字节码技术生成子类并在运行时增强目标类的功能,这对于AOP代理和Mock测试非常...
CGLIB 动态代理使用 ASM 字节码工具来生成代理类。CGLIB 动态代理可以代理没有接口的类,這是因为 CGLIB 动态代理可以生成一个原类的子类,然后 override 原类的方法来实现代理。 在 Spring AOP 框架中,默认情况下...
当目标对象不支持接口(即为final类或者没有接口的类)时,Spring会使用CGlib来创建代理对象。通过这种方式,Spring能够注入切面逻辑,比如日志记录、事务管理等,即使在不修改原有代码的情况下也能实现扩展功能。 ...
在Spring中,Objenesis常与CGLIB结合使用,尤其是在CGLIB不能通过常规方式创建代理对象时。spring-objenesis-repack-2.2.jar是Objenesis的一个特定版本,适用于Spring源码的编译环境。 3. **编译Spring源码的步骤**...
当Spring的AOP代理无法通过简单地继承来实现时(例如,目标类为final或包含final方法),CGlib就会介入,通过字节码技术生成目标类的一个子类,以此来实现对目标方法的拦截和增强。CGlib的核心是ASM库,ASM是一个...
在Spring框架中,CGLIB主要被用来创建代理对象,特别是在没有实现接口的类上进行AOP(面向切面编程)操作。CGLIB通过生成子类并在子类的方法上插入拦截器来实现动态代理。"spring-cglib-repack-3.2.5.jar" 是CGLIB库...
Spring 3.x 是一个历史悠久但仍然广泛使用的Java应用程序框架,主要致力于简化企业级应用的开发。这个框架的核心特性包括依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及大量的集成模块。在Spring 3.x...