Spring AOP基于xml配置实例

目录层级:

AOP相关的几个类就是com.aop.xmltype这个报下的4个类。

ICalculatorxml.java

package com.aop.xmltype;

/**
 * 加减乘除接口,用于AOP测试
 *
 * @author Wei
 *
 */
public interface ICalculatorxml {
	/**
	 * 加法
	 *
	 * @param a
	 * @param b
	 * @return a+b
	 */
	public int doAdd(int a, int b);

	/**
	 * 减法
	 *
	 * @param a
	 * @param b
	 * @return a-b
	 */
	public int doSub(int a, int b);

	/**
	 * 乘法
	 *
	 * @param a
	 * @param b
	 * @return a*b
	 */
	public int doMul(int a, int b);

	/**
	 * 除法
	 *
	 * @param a
	 * @param b
	 * @return a/b
	 */
	public int doDiv(int a, int b);

	/**
	 * 求绝对值
	 *
	 * @param a
	 * @param b
	 * @return |a-b|
	 */
	public int doAbs(int a, int b);
}

  

CalculatorImplxml.java

package com.aop.xmltype;

public class CalculatorImplxml implements ICalculatorxml {

	/*
	 * { System.out.println("CalculatorImpl...{} ..."); }
	 */

	@Override
	public int doAdd(int a, int b) {
		int rtn = a + b;
		System.out.println(a + "+" + b + "=" + rtn);
		return rtn;
	}

	@Override
	public int doSub(int a, int b) {
		// TODO Auto-generated method stub
		return a - b;
	}

	@Override
	public int doMul(int a, int b) {
		// TODO Auto-generated method stub
		return a * b;
	}

	@Override
	public int doDiv(int a, int b) {
		if (b == 0) {
			return -1;
		}
		return a / b;
	}

	@Override
	public int doAbs(int a, int b) {
		return Math.abs(a - b);
	}

}

  

MyAspectxml.java

package com.aop.xmltype;

public class MyAspectxml {

	public void logBefore() {
		// String className = j.getClass().getName();
		System.out.println("MyAspectxml logBefore(),开始计算...,");
	}

	public void logAfter() {
		System.out.println("已经计算结束...");
	}
}

  

MyAOPTest.java

package com.aop.xmltype;

import org.junit.Test;

import com.util.Pub;

public class MyAOPTest {

	ICalculatorxml cal;

	@Test
	public void testAop() {
		cal = new CalculatorImplxml();
		cal.doAdd(13, 99);
	}

	public static void main(String[] args) {

		ICalculatorxml cal  = (ICalculatorxml) Pub.getBeanCtx().getBean("calImplxml");
		System.out.println("-----------------分割符号----------\n\n\n\n");
		cal.doAdd(13, 99);
	}
}

  

执行结果:

AOP相关部分的配置,完整的xml配置在最后。

bean.xml

 1 <!-- 切点的bean -->
 2     <bean class="com.aop.xmltype.CalculatorImplxml" id="calImplxml"></bean>
 3     <!-- 切面的bean -->
 4     <bean class="com.aop.xmltype.MyAspectxml" id="myaspxml"></bean>
 5     <!-- aop xmlType,用xml的形式配置AOP前置通知 -->
 6     <aop:config>
 7         <!--aop:pointcut 其实放在这儿也可以 -->
 8         <!-- <aop:pointcut expression="execution (* com.aop.xmltype.CalculatorImplxml.*(..))"
 9             id="pointcut1" /> -->
10
11         <!-- 配置切面和通知 ,aop:aspect标签需要通过ref指定配置好的bean,id随便配置或者不配置,id的值可以随意起 -->
12         <aop:aspect id="myaspxml" ref="myaspxml" order="2">
13             <!-- 配置切点,即 要被记日记的对象, aop:pointcut 放在这儿也可以 ,切点不需要根对应的bean相关联,
14              只要expression指定的方法所在的类被Spring扫描得到就行,即只要所在的类配置了bean就可以 -->
15             <aop:pointcut expression="execution (* com.aop.xmltype.CalculatorImplxml.*(..))"
16                 id="pointcut1" />
17             <!-- 切面里的具体的用于记录的方法就是一个通知,需要用通过pointcut-ref来指定具体的切点, -->
18             <aop:before method="logBefore" pointcut-ref="pointcut1" />
19             <aop:after method="logAfter" pointcut-ref="pointcut1" />
20
21         </aop:aspect>
22
23     </aop:config>

完整的beans.xml的配置如:

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <beans xmlns="http://www.springframework.org/schema/beans"
  3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  4     xmlns:aop="http://www.springframework.org/schema/aop"
  5
  6     xsi:schemaLocation="
  7     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
  8     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  9         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
 10     <bean id="moocAppctx" class="imooc_spring.test.aware.MoocApplicationContext"
 11         init-method="hhhh">
 12     </bean>
 13
 14     <!-- 引入db.properties -->
 15     <context:property-placeholder location="classpath:db.properties" />
 16
 17     <!-- 配置C3P0数据源 -->
 18     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
 19         <property name="jdbcUrl" value="${jdbc.url}"></property>
 20         <property name="driverClass" value="${jdbc.driverName}"></property>
 21         <property name="user" value="${jdbc.username}"></property>
 22         <property name="password" value="${jdbc.pwd}"></property>
 23     </bean>
 24
 25     <!-- 配置 Spring 的 org.springframework.jdbc.core.JdbcTemplate -->
 26     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
 27         <property name="dataSource" ref="dataSource"></property>
 28     </bean>
 29
 30     <bean id="moocBeanNameAware" class="imooc_spring.test.aware.MoocBeanNameAware"></bean>
 31
 32     <!-- 测试 SpEL: 可以为属性进行动态的赋值(了解) -->
 33     <bean id="girl" class="com.helloworld.User">
 34         <property name="userName" value="周迅"></property>
 35     </bean>
 36
 37     <!-- <bean id="boy" class="com.helloworld.User" init-method="init" destroy-method="destroy">
 38         <property name="userName" value="高胜远"></property> <property name="wifeName"
 39         value="#{girl.userName}"></property> </bean> -->
 40
 41     <bean id="girl2" class="com.helloworld.User2">
 42         <property name="userName" value="Talor Swift"></property>
 43     </bean>
 44
 45     <!-- autowired测试,自动装配测试 -->
 46     <bean id="people" class="test.spring.autowired.Person" scope="prototype"
 47         autowire="byName">
 48         <property name="name" value="小明"></property>
 49         <!-- <property name="cat" ref="cat222"></property> -->
 50         <!-- <property name="cat" ref="cat1"></property> -->
 51     </bean>
 52
 53     <bean id="cat" class="test.spring.autowired.Cat" scope="prototype">
 54         <property name="name" value="波斯猫"></property>
 55     </bean>
 56     <!-- <bean id="cat222" class="test.spring.autowired.Cat"> <property name="name"
 57         value="我是小喵喵"></property> </bean> -->
 58
 59
 60
 61     <bean id="people2" class="test.spring.autowired.Person" scope="prototype"
 62         autowire="byName">
 63         <property name="name" value="小明"></property>
 64         <property name="cat" ref="cat222"></property>
 65     </bean>
 66
 67     <bean id="cat222" class="test.spring.autowired.Cat" scope="prototype">
 68         <property name="name" value="波斯猫"></property>
 69     </bean>
 70
 71     <!--context:component-scan 指定 扫描的包 -->
 72     <!--可以通过 resource-pattern 指定扫描的资源, resource-pattern="myrepository/*.class"
 73         的含义: 只扫描 base-package 对应包下的 目录为 myrepository 的所有java Bean -->
 74     <!-- <context:component-scan base-package="imooc_spring.test.anotation"
 75         resource-pattern="myrepository/*.class"></context:component-scan> -->
 76
 77     <!-- context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"
 78         子节点指定排除哪些注解 context:include-filter type="annotation" 需要结合context:component-scan
 79         标签的 use-default-filters="false"来使用 context:exclude-filter type="assignable"
 80         这个expression指的是自己写的类,意思排除哪些类 expression="imooc_spring.test.anotation.TestObj" -->
 81     <context:component-scan base-package="imooc_spring.test.anotation">
 82         <!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"
 83             /> -->
 84
 85         <!-- <context:exclude-filter type="assignable" expression="imooc_spring.test.anotation.TestObj"
 86             /> -->
 87
 88
 89     </context:component-scan>
 90     <context:component-scan base-package="com.aop"></context:component-scan>
 91
 92     <!-- aop测试,需要引入aop命名空间 -->
 93     <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
 94
 95
 96
 97
 98     <!-- aop annotationType, -->
 99
100
101
102
103
104
105
106
107
108
109
110
111     <!-- 切点的bean -->
112     <bean class="com.aop.xmltype.CalculatorImplxml" id="calImplxml"></bean>
113     <!-- 切面的bean -->
114     <bean class="com.aop.xmltype.MyAspectxml" id="myaspxml"></bean>
115     <!-- aop xmlType,用xml的形式配置AOP前置通知 -->
116     <aop:config>
117         <!--aop:pointcut 其实放在这儿也可以 -->
118         <!-- <aop:pointcut expression="execution (* com.aop.xmltype.CalculatorImplxml.*(..))"
119             id="pointcut1" /> -->
120
121         <!-- 配置切面和通知 ,aop:aspect标签需要通过ref指定配置好的bean,id随便配置或者不配置,id的值可以随意起 -->
122         <aop:aspect id="myaspxml" ref="myaspxml" order="2">
123             <!-- 配置切点,即 要被记日记的对象, aop:pointcut 放在这儿也可以 ,切点不需要根对应的bean相关联,
124              只要expression指定的方法所在的类被Spring扫描得到就行,即只要所在的类配置了bean就可以 -->
125             <aop:pointcut expression="execution (* com.aop.xmltype.CalculatorImplxml.*(..))"
126                 id="pointcut1" />
127             <!-- 切面里的具体的用于记录的方法就是一个通知,需要用通过pointcut-ref来指定具体的切点, -->
128             <aop:before method="logBefore" pointcut-ref="pointcut1" />
129             <aop:after method="logAfter" pointcut-ref="pointcut1" />
130
131         </aop:aspect>
132
133     </aop:config>
134
135
136
137
138
139
140
141 </beans>

项目名为:imooc_spring.rar,在我的qq微云上。

点我获取项目。

时间: 2024-11-03 21:13:09

Spring AOP基于xml配置实例的相关文章

[刘阳Java]_Spring AOP基于XML配置介绍_第9讲

基于注解配置的Spring AOP固然简单,但是这节我们会给大家介绍基于XML配置的AOP是如何应用的.为什么这么说了,因为后面我们还会介绍到Spring对Dao操作的事务管理(基于AOP的XML文件方式来配置事务) 1. 基于XML文件方式来配置Spring的AOP,则我们需要的一些基本元素如下 <aop:config.../>,此标签很重要.它是在XML里配置AOP功能的核心标签 all aspect and advisor elements must be placed within a

spring aop的xml配置详解

在Spring配置文件中,所以AOP相关定义必须放在<aop:config>标签下,该标签下可以有<aop:pointcut>.<aop:advisor>.<aop:aspect>标签,配置顺序不可变. <aop:pointcut>:用来定义切入点,该切入点可以重用: <aop:advisor>:用来定义只有一个通知和一个切入点的切面: <aop:aspect>:用来定义切面,该切面可以包含多个切入点和通知,而且标签内部的

Spring AOP基于XML配置文件的管理方式

1.配置Bean <!-- 定义一个普通Bean实例,该Bean实例将被作为Aspect Bean --> <bean id="fourAdviceBean" class="org.crazyit.app.aspect.FourAdviceTest"/> <!-- 再定义一个普通Bean实例,该Bean实例将被作为Aspect Bean --> <bean id="secondAdviceBean" cl

Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较

本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring  AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一个简单的实现四则运算的计算器. 加入AOP功能:日志功能:检测参数中是否有负数的功能. 废话不多说了,直接上代码: (一)基于XML配置: 定义了一个接口类: package com.edu.aop; public interface ArithmeticCalculator { int add(i

SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对比注解方式的优缺点)

接上一篇 SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP,本篇我们主要是来学习使用配置XML实现AOP 本文采用强制的CGLB代理方式 SecurityHandler这个通知类可以换成安全性检测.日志管理等等. <span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18

Spring AOP基于注解的“零配置”方式

Spring AOP基于注解的“零配置”方式: Spring的beans.xml中 <!-- 指定自动搜索Bean组件.自动搜索切面类 --> <context:component-scan base-package="org.crazyit.app.service,org.crazyit.app.aspect"> <context:include-filter type="annotation" expression="or

spring相关—AOP编程—数学计算器情景示例讲解(包含注解配置AOP与XML配置AOP)

1.数学计算器 ①数学计算器接口[MathCalculator]            public void add(int i,int j);     public int sub(int i,int j);     public int multi(int i,int j);     public void divide(int i,int j);    ②提供简单实现:加减乘除运算[EasyImpl]    ③在简单实现的基础上让每一个计算方法都能够打印日志[LoginImpl]    

基于XML配置的Spring MVC

1.添加jar 2.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation

Spring IOC的初始化过程——基于XML配置(一)

前言:在面试过程中,Spring IOC的初始化过程,基本上属于必答题,笔者的亲身经历.因此本文基于Spring的源码对其IOC的初始化过程进行总结. 注:spring版本为4.3.0. 1.调试前准备 在spring源码中,添加如下内容(有关spring源码如何导入idea,请查询相关资料): 说明: ①User为简单bean,含有name和gender两个属性. ②User.xml为spring配置文件,仅仅对User进行简单的配置. ③SpringIoCDebug为测试类. 先看执行结果: