分两部分,切面逻辑的设计,切面逻辑的使用。以为很难,其实还好.实际上是还没搞到更难的,自我鼓励下~~
就那学到的那个做例子做记录,印象会深刻些~ Spring 中的动态代理与struts中的inteceptor,filter,责任链中的chain 原理是一样的,就是在原有的程序顺序上,从另一个角度切入某些操作,做处理,里面有个递归使用,然后返回原调用函数的核心内容,但其实不很重要,知道这个思想并且会用就可以了~
Spring中的使用分两部分:
1)LogInterceptor的设计;
2)测试类中队LogInterceptor的使用,这个更有难度,但记下来熟悉就好了,核心是想起来用动态代理,并用的好~
详细内容:
1)LogInterceptor切面的设计。
public classLogInterceptor implements InvocationHandler {
publicObject target;
publicObject getTarget() {
returntarget;
}
@Resource(name = "u")//本来想使用Spring 的DI对target进行值注入,但是不知道哪儿出错了
publicvoid setTarget(Object target) {
this.target= target;
}
publicvoid beforeMethod(Method m) {
System.out.println(m.getName()+ " start!");
}
@Override//这个函数很核心哦!
publicObject invoke(Object proxy, Method m, Object[] args)
throwsThrowable {
beforeMethod(m);//先运行beforeMethod方法
m.invoke(target, args);//在调用方法m,target一般为调用这个切面逻辑的对象,但是是在切面逻辑初始化时已经确定的
return null;//返回
}}
2)测试程序
@Test
publicvoid testPoxy(){
UserDAOuserDAO = new UserDAOImpl();
LogInterceptorli = new LogInterceptor();
li.setTarget(userDAO);//对Li的初始化,实现一个aspect的完成的对象,然后插入到程序的正常逻辑中,实现他的作用。
UserDAO userDAOProxy =(UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(),userDAO.getClass().getInterfaces(), li);//此处为动态代理的核心部分,产生一个userDAO的动态代理的对象,并插入LI切片的对象。
System.out.println(userDAOProxy.getClass());//打印动态类的对象,打印出来是带$的类名。
userDAOProxy.save(newUser("gao","wenjian"));//此处可看出先运行Li的逻辑,然后运行userDAO的save方法。
}