(5)手动实现AOP编程

1、面向对象、面向接口、面向切面编程

面向对象编程(OOP),是将现实的事物抽象为包含property和method的class,它是对面向过程编程的一种演变,能够实现代码的重用,它实现的是代码级别的抽象。

面向接口编程,它是以功能相近的方法组织到一个接口内,它实现的是功能级别的抽象。

面积切面编程,它实现业务功能和关注点的分离,它实现的是业务级别的抽象。

Difference Between AOP and OOP

http://www.differencebetween.com/difference-between-aop-and-vs-oop/

2、AOP的作用

AOP面向切面的编程,可以实现“业务代码”与“关注点代码”分离。

// 保存一个用户
public void add(User user) { 
	Session session = null; 
	Transaction trans = null; 
	try { 
		session = HibernateSessionFactoryUtils.getSession();   // 【关注点代码】
		trans = session.beginTransaction();    // 【关注点代码】
		 
		session.save(user);     // 核心业务代码
		 
		trans.commit();     //…【关注点代码】

	} catch (Exception e) {     
		e.printStackTrace(); 
		if(trans != null){ 
			trans.rollback();   //..【关注点代码】

		} 
	} finally{ 
		HibernateSessionFactoryUtils.closeSession(session);   ////..【关注点代码】

	} 
}

分析总结:

关注点代码,就是指重复执行的代码。

业务代码与关注点代码分离,好处?

--à关注点代码写一次即可;

--à开发者只需要关注核心业务;

--à运行时期,执行核心业务代码时候动态植入关注点代码;【代理】

3、AOP示例

3.1、示例一

applicationContext.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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd"
        default-autowire="byType">

	<!-- 开启注解扫描 -->
	<context:component-scan base-package="com.rk.hibernate.d_aop_basic"></context:component-scan>

</beans>

Aop.java

package com.rk.hibernate.d_aop_basic;

import org.springframework.stereotype.Component;

/**
 * 重复执行代码形成的一个AOP类 *
 */
@Component // 加入IOC容器
public class Aop
{
	// 重复执行的代码
	public void begin()
	{
		System.out.println("事务开启");
	}

	// 重复执行的代码
	public void end()
	{
		System.out.println("事务结束");
	}
}

IUserDao.java

package com.rk.hibernate.d_aop_basic;

//接口
public interface IUserDao
{
	void save();
}

UserDao.java

package com.rk.hibernate.d_aop_basic;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

/**
 * 目标对象
 */
@Component // 加入IOC容器
public class UserDao implements IUserDao
{
	@Resource 
	private Aop aop; //注意:这里并没有设置setter方法,但是也能成功
	@Override
	public void save()
	{
		aop.begin();
		System.out.println("-----核心业务:保存!!!------");
		aop.end();
	}
}

App.java

package com.rk.hibernate.d_aop_basic;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App
{
	private ApplicationContext ac = new ClassPathXmlApplicationContext("/com/rk/hibernate/d_aop_basic/applicationContext.xml");
	@Test
	public void test()
	{
		IUserDao dao = (IUserDao) ac.getBean("userDao");
		dao.save();
	}
}

3.2、示例二

applicationContext.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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd"
        default-autowire="byType">

	<!-- 开启注解扫描 -->
	<context:component-scan base-package="com.rk.hibernate.e_aop_basic"></context:component-scan>
	<!-- 调用工厂方法,返回UserDao的代理对象 -->
	<bean id="userDao_proxy" class="com.rk.hibernate.e_aop_basic.ProxyFactory" factory-method="newProxyInstance">
		<constructor-arg index="0" type="java.lang.Object" ref="userDao"></constructor-arg>
		<constructor-arg index="1" type="com.rk.hibernate.e_aop_basic.Aop" ref="aop"></constructor-arg>
	</bean>
</beans>

Aop.java

package com.rk.hibernate.e_aop_basic;

import org.springframework.stereotype.Component;

/**
 * 重复执行代码形成的一个AOP类 *
 */
@Component // 加入IOC容器
public class Aop
{
	// 重复执行的代码
	public void begin()
	{
		System.out.println("事务开启");
	}

	// 重复执行的代码
	public void end()
	{
		System.out.println("事务结束");
	}
}

IUserDao.java

package com.rk.hibernate.e_aop_basic;

//接口
public interface IUserDao
{
	void save();
}

UserDao.java

package com.rk.hibernate.e_aop_basic;

import org.springframework.stereotype.Component;

/**
 * 目标对象
 */
@Component // 加入IOC容器
public class UserDao implements IUserDao
{
	@Override
	public void save()
	{
		System.out.println("-----核心业务:保存!!!------");
	}
}

ProxyFactory.java

package com.rk.hibernate.e_aop_basic;

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

/**
 * 代理工厂 *
 */
public class ProxyFactory
{
	public static Object newProxyInstance(final Object target,final Aop aop)
	{
		// 生成代理对象的方法
		return Proxy.newProxyInstance(
										target.getClass().getClassLoader(), 
										target.getClass().getInterfaces(), 
										new InvocationHandler()
										{

											@Override
											public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
											{
												aop.begin();// 执行重复代码
												Object result = method.invoke(target, args);// 执行目标对象的方法
												aop.end();// 执行重复代码
												return result;
											}
										});
	}
}

App.java

package com.rk.hibernate.e_aop_basic;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App
{
	private ApplicationContext ac = new ClassPathXmlApplicationContext("/com/rk/hibernate/e_aop_basic/applicationContext.xml");
	@Test
	public void test()
	{
		IUserDao dao = (IUserDao) ac.getBean("userDao_proxy");
		dao.save();
	}
}
时间: 2024-10-18 18:32:49

(5)手动实现AOP编程的相关文章

Spring学习-4-手动实现AOP编程

AOP面向切面编程 AOP可以实现“业务代码”和“关注点代码”完全分离 @Override public List<Message> findAllMessage() { Session session = null; //关注点代码 Transaction tx = null; try{ session = HibernateUtils.getSession(); tx = session.beginTransaction(); //关注点代码 Query q = session.creat

聊聊Javascript中的AOP编程

Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Monkey patch这个词来源于 guerrilla patch,意为在运行中悄悄的改变代码,而 guerrilla 这个词与 gorilla 同音,而后者意又与monkey相近(前者为“猩猩”的意思),最后就演变为了monkey patch. 如果你没有听说过duck punch,但你或许听说过du

聊Javascript中的AOP编程

我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Monkey patch这个词来源于 guerrilla patch,意为在运行中悄悄的改变代码,而 guerrilla这个词与 gorilla 同音,而后者意又与monkey相近(前者为“猩猩”的意思),最后就演变为了monkey patch. 如果你没有听说过duck punch,但你或许听说过duck typing.举一

spring 手工实现AOP编程

AOP概述: AOP,aspect object programming 面向切面编程 功能:让关注点代码与业务代码分离! 关注点:重复代码就叫做关注点. 切面:关注点形成的类,就叫做切面(类)! 面向切面编程,就是指 对很过功能都有的重复性代码抽取,再在运行的时候往业务方法上动态的植入"切面类代码" 切入点:执行目标对象方法,动态植入切面代码. 可以通过切入点表达式,指定拦截那些类的方法,给指定的类在运行的时候植入切面类代码. 手工方式实现AOP编程(这里我们采用动态代理的方式,并且

使用spring方式来实现aop编程

1:什么是aop? Aspect Oriented Programming 面向切面编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 面向对

spring 注解&amp;XML实现AOP编程

注解方式实现AOP编程 注解方式步骤: 1) 先引入aop相关jar文件           (aspectj  aop优秀组件) spring-aop-3.2.5.RELEASE.jar    [spring3.2源码] aopalliance.jar                 [spring2.5源码/lib/aopalliance] aspectjweaver.jar               [spring2.5源码/lib/aspectj]或[aspectj-1.8.2\lib

黑马程序员--Java高新(10)_动态代理和AOP编程

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一, 动态的核心 动态代理的两个核心,Proxy 和 InvocationHandler,都是Java.lang.reflect包下的接口类;由此也可以看出动态代理是反射的高级应用! 代理与反射的关系如何体现?从代理的建立过程的构建方法及其参数可见一斑: 1,代理最核心的Handler的唯一方法invoke()的核心参数Method method,是一个Class类型,并且在代理调用时,inv

struct2.1笔记03:AOP编程和拦截器概念的简介

1.AOP编程 AOP编程,也叫面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面(方面)编程. 可以通过预编译方式和运行期动态代理实现在不修改源代码的情况

spring相关—AOP编程简介

1 AOP概述 ●AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统 OOP(Object-Oriented Programming,面向对象编程)的补充. 作用:本质上来说是一种简化代码的方式     继承机制     封装方法     动态代理     -- ●AOP编程操作的主要对象是切面(aspect),而切面模块化横切关注点. ●在应用AOP编程时,仍然需要定义公共功能,但可以明确的定义这个功能应用在哪里,以什么方式应用,并且不必