LoadTimeWeaver是用
LoadTimeWeaver是用
1.当我们在使用Sping AOP 的时候我们的目标类和切面都需要向Spring容器中注册,否则我们无法实现AOP,应为Spring使用都是代理模式
JDK动态代理和CGLIb的动态代理,都需要目标类。我们可以想,我们不用向Spring容器中注册,怎么实现AOP,我们可以在类加载的时候实现
修改字节码来,来把需要的方法注册进去,从而我们new的对象都是经过代理之后的
2.如何实现?? 我们通过修改JVM的参数来实现
我的事务切面,逻辑上的,只起个示范作用
package liusheng.aspect; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class TransactionAspect { @Before("execution(* liusheng.dao.UserDao.*(..))") public void start(){ System.out.println("开启事务"); } @After("execution(* liusheng.dao.UserDao.*(..))") public void end(){ System.out.println("关闭事务"); } }
我的dao类 (也是起个示范作用)
package liusheng.dao; public class UserDao { public void add(){ System.out.println("添加对象"); } public void delete(){ System.out.println("删除对象"); } }
我的测试类
package liusheng.test; import liusheng.dao.UserDao; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserTest { public static void main(String[] args){ UserDao dao=new UserDao(); dao.add(); dao.delete(); } }
我们需要一个aspectjweaver.jar包(一般配置都有)
然后我们需要一个配置aop的XML文件,如下
<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> <aspectj> <weaver> <!--必须把目标类和切面类都配置进去--> <include within="liusheng.dao.UserDao"/> <include within="liusheng.aspect.TransactionAspect"/> </weaver> <aspects> <!--切面类--> <aspect name="liusheng.aspect.TransactionAspect"/> </aspects> </aspectj>
配置jvm的参数是 -javaagent:C:\Users\刘升\.m2\repository\org\aspectj\aspectjweaver\1.8.3\aspectjweaver-1.8.3.jar
注意::C:\Users\刘升\.m2\repository\org\aspectj\aspectjweaver\1.8.3\aspectjweaver-1.8.3.jar这个是我的包的绝对路径
结果
我刚刚入门,可以能有错误的地方,请多指点指点,还有我能力有限,不能解释这个实现的原理。