本文参考了royzhou1985 的博文,在此感谢他无私的分享。
一 什么是aop?
我的理解,aop就是让我们专心做我们最关心的功能,而把其他很多类都需要的公共的功能分离出来,从而大大提高了我们来发的效率,也方便以后的维护和拓展。比如说,你现在有一个普通用户类,用户里有采购商品,收藏商品,发表评论等业务功能,另外还有一个会员类,可能会有更多其他的功能,但他们都需要先登录,才能享有这些功能,所以登录这个功能就不是我们最为关心的,可能我们很多类的方法里都需要先实现这个功能。所以,aop就的作用就是帮我们把登录这个功能分离出去,让我们将更多的精力放到其他的功能实现中去。
二 aop的好处?
前面已经谈过了。
三 aop的实现方式?
aop主要有两种实现方式:jdk的动态代理和cglib代理。
动态代理,通俗的说,就是在代码里,只定义接口,然后再执行的过程中,将具体的目标对象织如到接口中。好比,你去装一台电脑,只需在电脑类里定义一个cpu接口,那么在具体的安装过程中,电脑类会动态的根据用户的需要织入具体的cpu,可能是amd的,可能是intel的。
jdk的动态代理,需要我们的目标对象所在类去实现接口。然后通过jdk里的反射机制去实现动态代理。
cglib代理,目标对象所在类不用去实现接口。它实现代理时用的是net.sf.cglib.
proxy.Enhancer这样一个类。
四 Spring aop相关概念。
在用Spring做aop前,有些基本概念是需要理解的。
Spring主要通过代理来实现AOP
下面是AOP的一些基本概念:
切面(Aspect):对横切关注点的抽象(类似类对对象的抽象)
连接点(JoinPoint):被拦截到的点,泛指方法
切入点(CutPoint):对哪些连接点进行拦截的定义
通知(Advice):在特定的连接点,AOP框架执行的动作.前置/后置/例外/最终/环绕通知(调用方法之前执行,全部执行完毕之后)
引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。
目标对象(Target Object): 包含连接点的对象。也被称作 被通知或被代理对象。
AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时 完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样, 在运行时完成织入。
五 Spring aop的实现步骤。
Spring aop有两种实现方式,注释方式和xml配置方式。
对于注释方式,必须引入三个jar包:
aspectjweaver.jar
aspectjrt.jar
cglib.jar
首先写一个接口,一个任务目标所在类,然后再写一个带注释的通知,最后在spring的配置文件里配置就可以了。
对于xml配置方式,不需要导包,写通知类时也不用写注释。
六 用Spring aop实现一个简单的权限管理
我用的是xml配置方式实现的。
编写接口和实现类
java代码:
package com.hjy.SpringAopDemo.beans;
public interface Loginer {
public void login(String name,String pw);
}
package com.hjy.SpringAopDemo.beans;
public class LoginerImpl implements Loginer {
private String name;
private String pw;
public void login(String name,String pw) {
this.name=name;
this.pw=pw;
System.out.println("用户:" + name + "登录成功!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
}
编写通知类:
java代码:
package com.hjy.SpringAopDemo.advisor;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyaroudAdvice implements MethodInterceptor {
public Object invoke(MethodInvocation arg0) throws Throwable {
System.out.println("开始登陆");
if (arg0.getArguments()[1].equals("841026")) {
System.out.println("欢迎" + arg0.getArguments()[0] + "您回来");
return arg0.proceed();
} else {
System.out.println("对不起,您的密码错误,登录失败!");
return null;
}
}
}
配置spring配置文件:
java代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="LoginerImpl"
class="com.hjy.SpringAopDemo.beans.LoginerImpl">
</bean>
<bean id="MyaroudAdvice"
class="com.hjy.SpringAopDemo.advisor.MyaroudAdvice">
</bean>
<bean id="Login"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.hjy.SpringAopDemo.beans.Loginer</value>
</property>
<property name="target">
<ref local="LoginerImpl" />
</property>
<property name="interceptorNames">
<list>
<value>MyaroudAdvice</value>
</list>
</property>
</bean>
</beans>
编写测试类:
package com.hjy.SpringAopDemo.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.hjy.SpringAopDemo.beans.Loginer;
import com.hjy.SpringAopDemo.beans.LoginerImpl;
public class Test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
Loginer loginer=(Loginer)ac.getBean("Login");
loginer.login("张三","841000");
loginer.login("李四","841026");
}
}
测试结果:
开始登陆
对不起,您的密码错误,登录失败!
开始登陆
欢迎李四您回来
用户:李四登录成功!
分享到:
相关推荐
spring aop jar 包
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
描述一下Spring AOP? 在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring AOP 代理是什么? 引介...
一、适合人群 1、具备一定Java编程基础,初级开发者 2、对springboot,mybatis,mysql有基本认识 3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 ...4、spring boot,mybatis,druid,spring aop的使用
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
springaop依赖的jar包,spring版本2.5.6,如果需要,可以下载使用,欢迎各位评论指出不足
Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。
死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序
spring aop的demo spring aop的demo
AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析...
Spring AOP 几个不同使用方法的完整例子,使用Junit4c测试, 在我的博客上有不同配置组合的说明,可以参考
spring aop切面拦截指定类和方法实现流程日志跟踪 一般情况下,在不侵入业务代码的情况下,需要做流程日志跟踪是比较合理的 采用springaop切面思想
Spring aop Spring aop
开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE...
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
springAOP所需jar包 springAOP所需jar包 springAOP所需jar包 springAOP所需jar包 springAOP所需jar包
NULL 博文链接:https://306963591.iteye.com/blog/1129837
springAOP详解
Spring AOP简单demo 入门级的 advice