浅谈Spring中的aop(面向切面编程)中的spring动态代理技术(无接口)


一、AOP是什么?

AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善,当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义纵向抽取的关系,但并不适合定义横向抽取的关系。
而AOP技术则恰恰利用一种称为“横向抽取”的技术,可以提高代码的重用性,以及可扩展和可维护性。

1.AOP的基本概念

1)Aspect(切面):通常是一个类,里面可以定义切入点和通知。
2) JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用。
3)Advice(通知):AOP在特定的切入点上执行的增强处理
4) Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式.
5) AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类

二、如何使用AOP

spring动态代理实现(无接口)

1.先写一个类,类中有定义一个add方法

public class UserDaoImpl2 {
    
    
	public int add(int a, int b) {
    
    
		System.out.println("调用UserDaoImpl2的add方法");
		return a + b;

	}

}

2.定义一个springHk的目标对象

package proxy;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class SpringHk implements MethodInterceptor {
    
    

	// 目标对象
	private Object target;

	/*
	 * invocation : 目标对象的目标方法
	 */
	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
    
    
		System.out.println("1.鉴权");
		// 调用目标方法
		Object result = invocation.proceed();
		System.out.println("1.日志留痕");
		return result;
	}

	public Object getTarget() {
    
    
		return target;
	}

	public void setTarget(Object target) {
    
    
		this.target = target;
	}

}

3.在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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
     <!--1.目标对象  --> 
       <bean id="userDao" class="dao.impl.UserDaoImpl2"></bean>
       <bean id="userDaoInter" class="dao.impl.UserDaoImpl"></bean>
      <!--2.黑客对象  -->
      <bean id="springHk" class="proxy.SpringHk"></bean> 
      
      <!--3.代理对象  -->
      <bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
      	<!--3.1目标对象  -->
      	<property  name="target" ref="userDao"></property>
      	<!-- 3.2 spring 黑客对象 -->
      	<property name="interceptorNames">
	       <array>
	           <value>springHk</value>
	       </array>
	   </property>
	  </bean>
</beans>

4.在test包中编写单元测试

package com.zyc.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import dao.impl.UserDaoImpl;
import dao.impl.UserDaoImpl2;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-beans.xml")
public class SpringHkTest {
    
    

	@Autowired
	@Qualifier("userDaoProxy")
	private UserDaoImpl2 userDaoImpl2;
	private UserDaoImpl userDaoImpl;

	@Test
	public void test01() {
    
    
		System.out.println(userDaoImpl2.add(3, 5));
	}

	@Test
	public void test02() {
    
    
		System.out.println(userDaoImpl.add(4, 5));
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_47723535/article/details/108859661