今天照着书,试着配了AOP(全注解),结果踩了各种坑,后来参考书附带的源码,终于走出来了,现在总结一下

  • 除了spring的jar包以外,还需要导入以下包:

1、Spring核心配置文件beans.xml(这里是大坑)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<!-- 启动@AspectJ支持 -->
<!-- <bean
class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" /> -->
<context:component-scan
base-package="com.sysker.bean,com.sysker.aspect">
<context:include-filter type="annotation"
expression="org.aspectj.lang.annotation.Aspect" />
</context:component-scan>
<!-- 设置AOP为自动代理 -->
<aop:aspectj-autoproxy /> </beans>
  • 如果全部采用注解的话,bean是不需要在这里配置的,只需要在对应的类上面写上@Component("name")注解即可,前面不清楚,所以我在这个坑里呆了很久,书上也没说,自己也没去查

  • 这里的另外一个坑就是这里:

<context:component-scan
base-package="com.sysker.bean,com.sysker.aspect">
<context:include-filter type="annotation"
expression="org.aspectj.lang.annotation.Aspect" />
</context:component-scan>
  • 如果这里路径配置有问题的话,会提示找不到bean,错误信息大概如下:
Loading XML bean definitions from class path resource [beans.xml]
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'hello' availa
ble
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.ja
va:686)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:
1210)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1095)
at com.sysker.test.AspectJTest.main(AspectJTest.java:22)
  • base-package里面可以配置多个路径,一定要完整

2、 Aspect类(这里有另外的大坑)

package com.sysker.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before; @Aspect
public class AuthAspect {
@Before("execution(* com.sysker.impl.*.*(..))")
public void authority() {
System.out.println("模拟执行权限检查");
}
}
  • 这里就有另外一个大坑在等着你,主要会出错的地方还是路径的问题:
@Before("execution(* com.sysker.impl.*.*(..))")
  • 路径必须正确,否则是没有效果了,比如我的路径,impl下的实现类要实现AOP,那么我的路径是要配到impl,然后还要有.. ,不然就是各种无效果,而且还不报错;
  • 还要提一下,Aspect必须要注解,注解,注解,就这样的@Aspect,然后后面的@Before("execution(* com.sysker.impl..(..))"),就是要执行的操作
  • 如果要针对某一个类,比如HelloImpl类,这需要写出具体的类:
@Before("execution(* com.sysker.impl.HelloImpl.*(..))")
  • 如果要针对某一个的具体方法,就需要写出具体的类的方法:
@Before("execution(* com.sysker.impl.HelloImpl.foo(..))")

3、service及Impl

package com.sysker.bean;

public interface Hello {
void foo(); int addUser(String name, String pass);
}
package com.sysker.bean;

public interface World {
public void bar(); }
  • service是不要注解的,也没必要
package com.sysker.impl;

import org.springframework.stereotype.Component;

import com.sysker.bean.Hello;

@Component("hello")
public class HelloImpl implements Hello {
@Override
public void foo() {
System.out.println("执行Hello组件的foo()方法");
}
@Override
public int addUser(String name, String pass) {
System.out.println("执行Hello组件的addUser添加用户:" + name);
return 20;
}
}
package com.sysker.impl;

import org.springframework.stereotype.Component;

import com.sysker.bean.World;
@Component("world")
public class WorldImpl implements World { @Override
public void bar() {
System.out.println("执行World组件的bar()方法");
} }
  • 这里需要注意的就是上面提到的,要注解@Component("world"),后面通过Spring容器创建对象要用到

4、测试类

package com.sysker.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.sysker.bean.Hello;
import com.sysker.bean.World;
import com.sysker.impl.HelloImpl;
import com.sysker.impl.WorldImpl; public class AspectJTest {
public static void main(String[] args) { ApplicationContext ctx = new
ClassPathXmlApplicationContext("beans.xml");
Hello hello = ctx.getBean("hello" , Hello.class);
hello.foo();
hello.addUser("孙悟空" , "7788");
World world = ctx.getBean("world" , World.class);
world.bar();
}
}

正常运行结果:

总结

今天虽然在这个问题上快纠结了一天,但总算功夫没白费,终于把这个坑填平了,收获满满,继续加油,不说了,我要继续去写bug了!!!

最新文章

  1. try-catch
  2. JAva使用DOM读取XML数据(解析)
  3. angularJs自定义服务
  4. CCF真题之图像旋转
  5. 移动平台前端开发之WebApp代码技巧
  6. 递归神经网络(Recurrent Neural Networks,RNN)
  7. Android 一步步教你从ActionBar迁移到ToolBar
  8. 使用 Docker 搭建 Java Web 运行环境
  9. Windows Server 2012 R2超级虚拟化之七 远程桌面服务的增强
  10. Qt之开机自启动
  11. RH133读书 笔记(5) - Lab 5 User and Group Administration
  12. C语言库函数大全及应用实例二
  13. MySQL5.6新特性Index conditontion pushdow
  14. [LeetCode] Design Compressed String Iterator 设计压缩字符串的迭代器
  15. 面向对象select方法
  16. 扩展 StackExchange.Redis 支持实体
  17. 界面编程之QT绘图和绘图设备20180728
  18. 如何在SpringMVC中获取request对象
  19. (转)windows下VMware-workstation中安装CentOS
  20. 第51章 设置FLASH的读写保护及解除—零死角玩转STM32-F429系列

热门文章

  1. win7系统查看端口占用情况
  2. JQuery 常用代码
  3. SetOperations
  4. Filter/replace - VBA
  5. windows 安装 pytorch
  6. 【leetcode刷题笔记】Construct Binary Tree from Preorder and Inorder Traversal
  7. Gym - 100513K :Treeland (按距离还原一棵树)
  8. What is Photon Server?
  9. BZOJ2733:[HNOI2012]永无乡
  10. java代码JFrame练习