xml的方式配置AOP:Aspect Oriented Programming

在某些类中, 什么时机, 做什么事情
 切入点(point-cut): 在某些类中(Class<?>[] itfc = new Class<?>[] { IStudentService.class })
 通知: 什么时机, 做什么事情(InvocationHandler的invoke方法)
 切面: 切入点 + 通知
 织入(weaver): Proxy.newProxyInstance: 把切入点和通知施加到具体的业务逻辑上的过程

XML配置AOP步骤:
 1,准备了一个实现接口的bean, 还有一个事务的碎片化方法的类;
 2,把这两个类配置到Spring容器中;
 3,配置springAOP
  1)引入aop命名空间;
  2)配置AOP,格式如下
  <aop:config>
      <aop:point-cut expression=""  id="sample" />
      <aop:aspect ref="">
           <aop:before method="" pointcut-ref="sample">
           <aop:after-returning method="" pointcut-ref="sample">
           <aop:after-throwing method="" pointcut-ref="sample">
      </aop:aspect>
  </aop:config>
   1] aop:config: AOP配置
   2] aop:point-cut: AOP切入点
   3] aop:aspect: AOP切面配置
   4] aop:* 都是一个AOP切面

4,在接口文件中配置一个业务逻辑对象的接口,DI注入,并在test方法中直接调用该接口的具体业务逻辑

//接口:
package com.xk.spring.kp04_aop.aop.s01_xml;

public interface IStudentService {
    public void save(Student stu);
    public void update(Student stu);
}
//Dao 实现类(service) 实现业务逻辑
package com.xk.spring.kp04_aop.aop.s01_xml;

public class StudentServiceImpl implements IStudentService {
    @Override
    public void save(Student stu) {
        System.out.println("调用Dao的save方法....");
    }
    @Override
    public void update(Student stu) {
        System.out.println("调用Dao的update方法...");
        @SuppressWarnings("unused")
        int i = 10/0;
    }
}
//事物管理:将代码中的污染源抽出一个类,专门处理事物
package com.xk.spring.kp04_aop.aop.s01_xml;

public class TransactionManager {
    /**
     * 事物开始
     */
    public void begin(){
        System.out.println("TransactionManager.begin()");
    }
    /**
     * 事物提交
     */
    public void commit(){
        System.out.println("TransactionManager.commit()");
    }
    /**
     * 事物回滚
     */
    public void rollback(Throwable e){
        System.out.println("TransactionManager.rollback()");
        System.out.println("rollback()");
    }

    /**
     * 事物结束
     */
    public void finished(){
        System.out.println("TransactionManager.close()");
    }
}
//Bean
//将bean注入就是指将数据注入Spring
package com.xk.spring.kp04_aop.aop.s01_xml;

public class Student {
	private String name;
	private Integer age;

	public Student() {

	}

	public Student(String name, Integer age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
}

  

//测试类
package com.xk.spring.kp04_aop.aop.s01_xml;

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class AOPXMLTest {
    @Autowired
    IStudentService seriver;

    @Test
    public void testAOPXML() throws Exception {
        seriver.save(new Student("张三", 18));
        seriver.update(new Student("张4", 18));
    }
}
<!-- xml配置aop -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" 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.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop.xsd">

    <bean id="service" class="com.xk.spring.kp04_aop.aop.s01_xml.StudentServiceImpl" />
    <bean id="manager" class="com.xk.spring.kp04_aop.aop.s01_xml.TransactionManager" />
    <aop:config>
        <!-- 需要导入两个依赖包 com.springsource.org.aopalliance-1.0.0.jar
                和com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
        -->
        <aop:pointcut
            expression="execution(* com.xk.spring.kp04_aop.aop.s01_xml.*Service.*(..))"
            id="stuService" />
        <aop:aspect ref="manager">
            <aop:before method="begin" pointcut-ref="stuService" />
            <!-- 回滚:在回滚的时候 throwing是要在TransactionManager类中配置的 参数"(throwable e)" -->
            <aop:after-throwing method="rollback"
                pointcut-ref="stuService" throwing="e" />
        </aop:aspect>
    </aop:config>
</beans>

<!-- 错误:Pointcut is not well-formed: expecting ‘name pattern‘ at character
    position 配置aop报错:原因是配置切点表达式的时候报错了, 星号后面没有加空格: <aop:config> <aop:pointcut
    id="transactionPointcut" expression="execution(* project.mybatis.service.*.*(..))"
    /> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="omsMTransactionAdvice"
    /> </aop:config> 其中,切入点表达式的使用规则: 1、execution(): 表达式主体。 2、第一个*号:表示返回类型,*号表示所有的类型。
    3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。
    4、第二个*号:表示类名,*号表示所有的类。 5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。 -->
时间: 2024-09-30 15:24:18

xml的方式配置AOP:Aspect Oriented Programming的相关文章

AOP Aspect Oriented Programming

原理AOP(Aspect Oriented Programming),也就是面向方面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP将应用系统分为两部分,核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的方面Crosscutting enterprise concerns,例如,所有大中型应用都要涉及到的持久化管理(Persistent).事务管理(Transaction Management).安全管理(Security).日志管理(Lo

Java实战之03Spring-03Spring的核心之AOP(Aspect Oriented Programming 面向切面编程)

三.Spring的核心之AOP(Aspect Oriented Programming 面向切面编程) 1.AOP概念及原理 1.1.什么是AOP OOP:Object Oriented Programming面向对象编程 AOP:Aspect Oriented Programming面向切面编程 1.2.代理 充分理解:间接 主要作用:拦截被代理对象执行的方法,同时对方法进行增强. 1.2.1.静态代理 特点:代理类是一个真实存在的类.装饰者模式就是静态代理的一种体现形式. 1.2.2.动态代

Spring面向切面编程(AOP,Aspect&#160;Oriented&#160;Programming)

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等.使用JDK的动态代理可以实现AOP. AOP通过代理的方式都程序动态统一添加功能 现在要给功能4增加一些额外的行为,如处理日志,处理权限等,可以使用代理实现.我们在功能4外面包装一个对象,假设叫A, model原来是直接调用功能4,

Aspect Oriented Programming using Interceptors within Castle Windsor and ABP Framework AOP

http://www.codeproject.com/Articles/1080517/Aspect-Oriented-Programming-using-Interceptors-wit Download sample application (or see the latest on Github) Contents Introduction What is Aspect Oriented Programming (AOP) and Method Interception? Manual W

Spring Aspect Oriented Programming

Spring Aspect Oriented ProgrammingSpring Aspect Oriented ProgrammingSpring Aspect Oriented ProgrammingSpring Aspect Oriented ProgrammingSpring Aspect Oriented ProgrammingSpring Aspect Oriented Programming http://www.djkk.com/blog/yvbf3319 http://www.

spring的AOP(Aspect Oriented Programming)面向切面编程

程序中需要有日志等需要,若在原本程序加代码会导致代码混乱,不宜维护,解决方法: 使用代理. 使用spring的AOP. spring的AOP注解方式使用: 1.加入jar包(com.springsource.org.aopalliance,sapectj.weaver,spring-aop) 2.创建一个切面类(Aspect) package com.zhiyou100.kfs.aspects; import org.aspectj.lang.JoinPoint; import org.aspe

关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-使用工厂创建代理(Using the ProxyFactoryObject to create AOP proxies)

本文翻译自Spring.NET官方文档Version 1.3.2. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他人提供帮助. 侵删. 如果你正在为你的业务模型使用IoC容器--这是个好主意--你将会想使用某个 Spring.NET's AOP特定的IFactoryObject 的实现(要记住,一个工厂的实例提供了一个间接层,使这个工厂能够创建不同类型的对象-5.3.9节,"通过使用其他类型和实例创建一个对象"). 一个基本的创建Spring.NET

Spring之AOP基本概念及通过注解方式配置AOP

为什么使用AOP 传统方法 AOP前前奏 首先考虑一个问题,假设我们要设计一个计算器,有如下两个需求: - 在程序运行期间追踪正在放生的活动 - 希望计算器只能处理正数的运算 通常我们会用如下代码进行实现: 定义一个接口: public interface ArithmeticCalculator { int add(int i, int j); int sub(int i, int j); int mul(int i, int j); int div(int i, int j); } 实现类(

22Spring基于配置文件的方式配置AOP

直接看代码: package com.cn.spring.aop.impl; //加减乘除的接口类 public interface ArithmeticCalculator { int add(int i, int j); int sub(int i, int j); int mul(int i, int j); int div(int i, int j); } package com.cn.spring.aop.impl; //实现类 public class ArithmeticCalcu