Spring——(六)注解方式AOP

2018-11-05 08:23:00     

一、摘要

本篇博客使用上一篇博客的源代码,对上一篇博客进行改造:Spring——(四)AOP面向切面

  • 注解方式核心业务功能
  • 注解方式周边功能(切面)
  • 注解方式测试

二、注解方式AOP

1.使用@Component注解Student类@Component表示这是一个bean,由Spring进行管理。代码如下:

package service;

import org.springframework.stereotype.Component;

/**
 * @author bounds
 *	定义一个核心功能
 */
@Component("student")
public class Student {
	/**
	 * 赛跑
	 */
	public void run(String name){
		System.out.println(name+"参加100米赛跑。。。");
	}
}

2.@Aspect注解AsptectTest类表示这是一个切面@Around(value="execution(* service.Student.*(..))")表示对Student类中的所有方法定义为切面。代码如下:

package service;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
/**
 * @author bounds 定义一个切面
 */
@Component("aspect")
@Aspect
public class AspectTest {
	@Around(value="execution(* service.Student.*(..))")
	public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
		System.out.println("计时开始。。。");
		// 可替换被监视对象的形参,这是around最厉害的地方
		Object object = joinPoint.proceed(new Object[] { "Peter" });
		System.out.println("计时结束。。。");
		return object;
	}
}

3.修改xml文件,配置spring自动扫描器以及代理。代码如下:

<?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.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	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">
		
	<!-- 配置spring的扫描器就可以实现bean的自动载入 -->
	<context:component-scan base-package="service" />
	<!-- 自动为spring容器中那些配置@AspectJ切面的bean创建代理,织入切面 -->
	<aop:aspectj-autoproxy />
</beans>

4.使用JUnit运行测试,打印结果如下:

计时开始。。。
Peter参加100米赛跑。。。
计时结束。。。
  • 打印结果正常,注解方式AOP就是这么来的

三、注解方式测试

1.修改TestStudent测试类@RunWith(SpringJUnit4ClassRunner.class)
表示这是一个Spring的测试类@ContextConfiguration("../spring/application-config.xml")
定位Spring的配置文件@Autowired给这个测试类装配Student对象如下代码:

package test;

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

import service.Student;

/**
 * @author bounds 测试类
 */
@RunWith(SpringJUnit4ClassRunner.class) // 表示这是一个Spring的测试类
@ContextConfiguration("../spring/application-config.xml") // 定位Spring的配置文件
public class TestAOP {

	@Autowired
	Student student;

	@Test
	public void testOne() {
		student.run("Bounds");
	}
}

四、总结

  • xml文件中配置的代理<aop:aspectj-autoproxy />由Spring自动选择合适的代理:JDK动态代理或者Cglib代理

ps:本篇博客源码下载链接:https://pan.baidu.com/s/11pTtL1kZKLfiwzYwyLPAmg 密码:6qkd
Spring——(五)AOP面向切面

一、概念AOP 即Aspect Oriented Program面向切面编程在面向切面编程的思想里面,把功能分为核心业务功能和周边功能 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务。所谓的周边功能,比如性能统计,日志,事务管理等等周边功能在AOP思想里,定义为切面(Aspect)在面向切面编程AOP的思想里面,核心业务功能和周边功能分别独立开发然后把切面功能和核心业务功能 编织在一起,这就叫AOP二、Aspect的前置、最终通知新建SpringTest03项目,在service包下新建一个核心业务Student类注明其主要功能。代码如下:package service; /** * @author bounds * 定义一个核心功能 */ public class Student { /** * 赛跑 */ public void run(String name){ System.out.println(name+"参加100米赛跑。。。"); } } 2.继续在service包下新建一个切面Aspect类定义其主要功能,代码如下:package service; /** * @author bounds

Spring——(七)事务管理

一、摘要通过例子说明:去ATM机取1000块钱,大体有两个步骤:第一步输入密码金额,银行卡扣掉1000元钱;第二步从ATM出1000元钱。这两个步骤必须是要么都执行要么都不执行。如果银行卡扣除了1000块但是ATM出钱失败的话,你将会损失1000元;如果银行卡扣钱失败但是ATM却出了1000块,那么银行将损失1000元。如何保证这两个步骤不会出现一个出现异常了,而另一个执行成功呢?事务就是用来解决这样的问题。事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。 在企业级应用程序开发中,事务管理是必不可少的技术,用来确保数据的完整性和一致性。二、编程式事务处理实现转账1.配置pom.xml文件引入需要的jar包,新增如下代码: <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>

 发表评论