Spring框架中的aop

1.建立了日志类

package cn.edu.proxy.cglibproxy;

public class Logger {

	public void logging() {
		// TODO Auto-generated method stub
		System.out.println("logging");
	}

}

2.建立安全类

package cn.edu.proxy.cglibproxy;

public class Security  {

	public void security() {
		// TODO Auto-generated method stub
		System.out.println("security");
	}

}

3.建立权限类

package cn.edu.proxy.cglibproxy;

public class Privilege {
	private String access;

	public String getAccess() {
		return access;
	}

	public void setAccess(String access) {
		this.access = access;
	}

}

4.建立薪水管理接口

package cn.edu.proxy.cglibproxy;

public interface SalaryManager {
	public void showSalary();

}

5.建立薪水管理类的实现

package cn.edu.proxy.cglibproxy;

public class SalaryManagerImpl implements SalaryManager {

	@Override
	public void showSalary() {
		// TODO Auto-generated method stub
		System.out.println("查看工资");
	}

}

6.建立拦截器类,并且把其他的类以构造函数的形式导入,此类实现了InvocationHandler接口,其中Object是目标类

如果满足access为admin就执行方法,否则就输出没有权限

package cn.edu.proxy.cglibproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class SalaryInterceptor implements InvocationHandler{
	private Object target;
	private Logger logger;
	private Security security;
	private Privilege privilege;

	public SalaryInterceptor(Object target, Logger logger, Security security,
			Privilege privilege) {
		super();
		this.target= target;
		this.logger = logger;
		this.security = security;
		this.privilege = privilege;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// TODO Auto-generated method stub
		if(this.privilege.getAccess().equals("admin")){
			this.logger.logging();
			this.security.security();
			method.invoke(this.target, args);
		}else{
			System.out.println("对不起,您没有权限");
		}
		return null;
	}

}

7.建立测试类,建立日志类,安全类,以及权限类的实例,并且建立拦截器类。

使用代理的方法newProxyInstance()返回薪水管理类(这是目标类)

package cn.edu.proxy.cglibproxy;

import java.lang.reflect.Proxy;

import org.junit.Test;

public class SalaryTest {
	@Test
	public void test(){
		Object target=new SalaryManagerImpl();//目标类
		Logger logger=new Logger();
		Privilege privilege=new Privilege();
		privilege.setAccess("admin");
		Security security=new Security();
		SalaryInterceptor interceptor=new SalaryInterceptor(target, logger, security, privilege);
		 SalaryManager salaryManager=(SalaryManager)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), interceptor);
		salaryManager.showSalary();
	}
}

总结:

aop:

1.切面

日志,安全类框架,权限等都是切面

2.通知

切面中的方法就是通知

3.目标类

4.切入点

5.织入

形成代理对象的方法的过程

好处:

日志,安全性框架,权限,目标方法之间完全是松耦合的

时间: 2024-10-21 05:42:26

Spring框架中的aop的相关文章

spring框架中的AOP学习之(一)

一.AOP术语 1.通知(advice):定义了切面何时(@Before, @After, @AfterThrowing ,@AfterReturning,@Around )使用 2.连接点(join point):在应用执行过程中能够被插入切面的一个点. 3.切点(pointcut):对连接点中的哪些连接点进行织入切面(切点是指匹配到的某些连接点) 4.切面(aspect):是通知加切点的给合 5.引入(introduction):允许我们向现有的类添加新的方法和属性(对已有的类引入新的接口,

细说shiro之五:在spring框架中集成shiro

官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${version.shiro}</version> </dependency&g

再析在spring框架中解决多数据源的问题

在前面我写了<如何在spring框架中解决多数据源的问题>,通过设计模式中的Decorator模式在spring框架中解决多数据源的问题,得到了许多网友的关注.在与网友探讨该问题的过程中,我发现我的方案并不完善,它只解决了一部分问题. 总结多数据源的问题,其实它需要分为以下三种情况:各个数据源的数据结构不同.各个数据源的数据结构相同.各个数据源的数据结构部分相同又有部分不同.对于第二种情况,各个数据源的数据结构相同,我们使用一个sessionFactory,而在sessionFactory中通

Spring Boot中使用AOP统一处理Web请求日志

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通过对既有程序定义一个切入点,然后在其前后切入不同的执行内容,比如常见的有:打开数据库连接/关闭数据库连接.打开事务/关闭事务.记录日志等.基于AOP不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率.

转-Spring Framework中的AOP之around通知

Spring Framework中的AOP之around通知 http://blog.csdn.net/xiaoliang_xie/article/details/7049183 标签: springaop设计模式beanintegerclass 2011-12-07 11:39 6108人阅读 评论(0) 收藏 举报 在第一部分,您看到了如何使用Spring AOP来实现跟踪和记录方面.跟踪和记录都是"消极"方面,因为它们的出现并不会对应用程序的其他行为产生影响.它们都使用了消极的b

Spring框架中2种生成代理对象的方法

Spring框架中2种生成代理对象的方法 Jdk Proxy基于接口生成代理对象,只能赋值给接口的引用(默认使用jdk). Spring进一步封装 CGLIB,基于实现类生成代理对象,既可以赋值给接口的引用,也可以赋值给实现类的引用 JDK提供的Proxy,和spring进一步封装的CGLIB.二者生成的代理没有任何区别,生成的都是代理对象.只是生产方式不同,前者是基于接口生成代理,后者基于实现类生成代理对象 如何切换spring框架中默认生成代理的方式 <aop:config proxy-ta

设计模式在 Spring 框架中的良好应用

在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计理念 说说 Spring 框架中如何实现设计模式 假设我是面试官问起了你这些面试题,你该如何回答呢,请先思考一分钟. 好的,我们开始进入正题.设计模式实践里面提供了许多经久不衰的解决方案和最佳方案.这里,GOF 设计模式主要分为三大类:创建模式.结构模式和行为模式.创建模式对于创建对象实例非常有用.结构模式通过处理类或对象的组合来作用于企业级应用的设计结构,从而降低了应用的复杂性,提

FAQ系列 | Spring框架中调用存储过程失败

Spring框架中,调用存储过程同时还需要show create procedure权限,对于普通用户而言,还要授予 select on mysql.proc 权限才能正常 --------------------------------------分割线-------------------------------------- 知数堂 (http://zhishuedu.com)培训是由资深MySQL专家叶金荣.吴炳锡联合推出的专业优质培训品牌,主要有MySQL DBA实战优化和Python

Spring框架中利用注解进行自动装配的环境配置步骤和常见问题

第1步:配置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.spring