Spring核心概念之AOP

一、AOP 的概念

AOP(Aspect Oriented Programming)的缩写,面向切面编程,主要作用就是对代码进行增强处理。

理解面向切面编程的含义:就是在不改变原有程序的基础上为代码增加新的功能。

实现面向切面编程需要了解两个概念:

>切入点:可以插入增强处理的方法,比如原对象的fun()方法。

>增强处理类型:在原对象fun()方法之前还是之后插入新功能。

二、Spring AOP简单应用

1.新建一个java项目

2.到官网下载Spring AOP和AspectJ框架所需要的jar包,并将下载所需的jar文件添加到项目中。

3.在项目中添加User实体类

package com.jbit.fsd.entity;

public class User {

	private int id;
	private String username;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}

}

4.添加数据访问层接口和实现类,并添加相应的方法

package com.jbit.fsd.dao;

import java.util.List;

import com.jbit.fsd.entity.User;
// 数据访问层接口
public interface UserDao {

	public List<User> getAll();

	public void addUser(User user);
}

实现类:

package com.jbit.fsd.dao.impl;

import java.util.ArrayList;
import java.util.List;

import com.jbit.fsd.dao.UserDao;
import com.jbit.fsd.entity.User;

public class UserDaoImpl implements UserDao {

	@Override
	public List<User> getAll() {
		//操作数据库读到所有数据
		List<User> list=new ArrayList<User>();
		list.add(new User());
		list.add(new User());
		list.add(new User());
		return list;
	}

	@Override
	public void addUser(User user) {
		System.out.println("添加成功");
	}

}

5.添加业务处理层接口和实现类

package com.jbit.fsd.service;

import java.util.List;

import com.jbit.fsd.dao.UserDao;
import com.jbit.fsd.entity.User;

public interface UserService {

	public List<User> getAll();

	public void addUser(User user);

}

实现类:

package com.jbit.fsd.service.impl;

import java.util.List;

import com.jbit.fsd.dao.UserDao;
import com.jbit.fsd.entity.User;
import com.jbit.fsd.service.UserService;

public class UserServiceImpl implements UserService{
	private UserDao dao;
	//通过spring注入进来
	public void setDao(UserDao dao) {
		this.dao = dao;
	}

	@Override
	public List<User> getAll() {
		System.out.println("正在执行添加用户的业务!");
		return dao.getAll();
	}

	@Override
	public void addUser(User user) {                System.out.println("正在执行添加用户的业务!");
		dao.addUser(user);
	}

}

6.添加AOP增强处理类

package com.jbit.fsd.aop;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class ServiceLoging {
	private Log log = LogFactory.getLog(this.getClass());

	public void beforeService(){
		log.info("aop方法被调用!");
	}
}

7.在src目录下新建applicationContext.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<!--
  - Application context definition for JPetStore‘s business layer.
  - Contains bean references to the transaction manager and to the DAOs in
  - dataAccessContext-local/jta.xml (see web.xml‘s "contextConfigLocation").
  -->
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
		<!-- 以面向接口思想编程实现解耦和 -->
	<bean id="userDao" class="com.jbit.fsd.dao.impl.UserDaoImpl">
	</bean>
	<bean id="userServiceImpl" class="com.jbit.fsd.service.impl.UserServiceImpl">
		<property name="dao" ref="userDao"></property>  <!-- 属性注入 -->
	</bean>
	<!-- 配置切面 -->
	<bean id="serviceLogging" class="com.jbit.fsd.aop.ServiceLoging"></bean>
	<aop:config>
		<!-- 配置切入点 -->
		<aop:pointcut expression="execution(public void  addUser(com.jbit.fsd.entity.User))" id="servicePointcut"/>
		<!-- 将切面和切入点编制在一起-->
		<aop:aspect ref="serviceLogging">
			<aop:before method="beforeService" pointcut-ref="servicePointcut"/>
		</aop:aspect>
	</aop:config>
</beans>

8.main方法测试:

package com.jbit.fsd.test;

import java.util.List;

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

import com.jbit.fsd.dao.UserDao;
import com.jbit.fsd.entity.User;
import com.jbit.fsd.printer.Printer;
import com.jbit.fsd.service.UserService;
import com.jbit.fsd.service.impl.UserServiceImpl;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		UserService dao=(UserService) ac.getBean("userServiceImpl");
		dao.addUser(new User());
	}

}

说明:

1.在.xml文件中需要添加aop命名空间,导入与aop配置相关的标签。

2.AOP相关的配置在<aop:config>标签中,切入点的配置在<aop:pointcut>标签中。

3.execution是切入点的标识符,括号是切入点的表达式,配置需要增强的方法。

4.切入点表达式常用几种模糊匹配方式:

>public * addUser(com.able.entity.User),“*”表示配置所有类型的返回值。

>public void * (com.able.entity.User), "*"代表匹配所有的方法名。

>public void addUser(..),  " .. "表示匹配所有参数个数和类型。

> * com.able.service.*.*( . . ),  表示匹配com.able.service包下面所有类的所有方法。

> * com.able.service . . *(), 表示匹配com.able.service包以及子包下所有类的所有方法。

三、增强处理类型简介

1.前置增强处理

特点:在目标方法前织入增强处理。

<aop:before method="beforeService" poontcut-ref="servicePointcut"/>

如果想在这个方法中获得切入点的信息,使用如下方法:

package com.jbit.fsd.aop;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;

public class ServiceLoging {
	private Log log = LogFactory.getLog(this.getClass());

	public void beforeService(JoinPoint joinPoint){
		System.out.println("aop方法被调用");
		System.out.println("连接点对象:"+joinPoint.getTarget().getClass().getSimpleName());
		System.out.println("连接点方法:"+joinPoint.getSignature());
		System.out.println("连接点方法参数:"+joinPoint.getArgs()[0]);

	}
}

2.后置增强处理

特点:在目标方法正常执行(不出现异常)后织入增强处理。

<aop:after-returning method="afterReturning" pointcut-ref="servicePointcut"/>

如果需要获取返回值,添加returning="returnVal"

<aop:after-returning method="aft" pointcut-ref="ser" returning="returnVal"/>

public void afterService(Object returnVal){
		System.out.println(returnVal);
	}

3.异常增强处理

特点:在目标方法出现异常后织入增强处理。

<aop:after-throwing mehod=" " pointcut-ref=" " throwing ="ex"/>

如果需要获取异常对象才添加throwing="ex"

public void afterThrowing(Exception ex){
		System.out.println(ex.getMessage());
	}

4.最终增强处理

特点:不论方法是否抛异常,都会在目标方法最后织如增强处理,类似与finally。

<aop:after method="after" pointcut-ref="servicePointcut"/>

5.环绕增强处理

特点:在目标方法的前后都可以织入增强处理。

<aop:around method="" pointcut-ref="" />

public Boolean around(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("目标方法的参数:"+pjp.getArgs()[0]);
		Boolean b = null;
		if (true) {
			b = (Boolean) pjp.proceed(pjp.getArgs());
		}
		return b;

	}

四、使用AspectJ 简化AOP配置

Spring的AOP配置常有两种方式:

>通过schema形式实现简单AOP配置,也就是上面事例使用方法。

>使用annotation简化AOP配置。

AspectJ是一个面向切面的框架,AspectJ定义了AOP语法。

使用@AspectJ必须使用jdk5.0以上版本。

步骤:

1.编写业务类(与上面方法相同)。

2.编写切面类。

package com.jbit.ssh.aop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect    //1.通过注解标记一个切面
public class AspectTest {

	@Before("execution(* com.jbit.ssh.service..*.*(..))")//2.定义切点和增强类型(切点表达式)
	public void ba(){  //3.增强处理的fun   4.配置xml
		System.out.println("前置增强-------");
	}
	@After("execution(* com.jbit.ssh.service..*.*(..))")
	public void aa(){
		System.out.println("后置增强------");
	}
	/**
	 * @before表示前置增强
	 * @AfterReturning:表示后置增强处理
	 * @Around:表示环绕增强处理
	 * @AfterThrowing:表示异常增强处理
	 * @After:表示最终增强处理
	 */

}

3.编写配置文件实现AOP

<?xml version="1.0" encoding="UTF-8"?>

<!--
  - Application context definition for JPetStore‘s business layer.
  - Contains bean references to the transaction manager and to the DAOs in
  - dataAccessContext-local/jta.xml (see web.xml‘s "contextConfigLocation").
  -->
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:tx="http://www.springframework.org/schema/tx"
		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-2.5.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" >

	 <!--4.基于@AspectJ切面的驱动器 -->
	<aop:aspectj-autoproxy />
	<bean class="com.jbit.ssh.aop.AspectTest"></bean>
</beans>

  

时间: 2024-10-12 23:57:13

Spring核心概念之AOP的相关文章

十分钟完成 spring 核心概念扫盲

一.背景 springframework 从 2.5 版本发展至今,期间已经发生了非常多的修正及优化.最初认为 spring 框架是一个非常轻量级的东西,轻量到你几乎认识不到必须使用它的理由.. 然而它又是那么的通用,几乎所有的流行框架如 持久层的 hibernate.表示层的 struts 都能跟它进行整合.但最终的结果是 spring 能整合的东西越来越多,逐渐的替代了其他的框架. 就比如 现在最火的 springboot,从Web控制层到持久层,任务调度.AOP 都已经被 spring 体

第一章 spring核心概念

一.Spring作用:管理项目中各种业务Bean(service类.Dao类.Action类),实例化类,属性赋值 二.Spring IOC(Inversion of Control )控制反转,也被称为依赖注入(Dependency Injection[DI]),是面向对象编程 中的一种设计理念,用来减轻程序代码之间的耦合度. IOC原理:侧重原理 在业务代码中不使用我们之间司空见惯的关键字new来构建一个业务实例,而是在配置文件中.通过xml节点来告知容器如何对内存中构建的对应类型的对象名称

Spring核心概念

Spring IoC Spring IoC就是控制反转,也被称为依赖注入(Dependency Injection, DI),是面向对象编程中的一种设计理念,用来降低程序代码之间的耦合度. 依赖是什么: 依赖就是在代码中通过局部变量.方法参数.返回值等建立的对于其他对象的调用关系. 1 /** 2 * @content 接口 3 * @author Gawain 4 * @date 2017-8-15下午8:02:37 5 */ 6 public interface DependDemo { 7

Spring核心思想之AOP总结

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

Spring核心概念(二)

IOC/DI IOC(控制反转):对象(组件)的创建由代码中转移到外部容器(XML,注解) . DI(依赖注入):当类A需要使用类B时,那么我们需要为类A的属性赋值类B的对象. 这种现象我们称为依赖注入. 注意:IOC/DI指的是同一个东西,理解的角度不一样. 补充:组件化思想:分离关注点,使用接口,不再关注实现. AOP(面向切面编程) AOP:是一种通过预编译和运行期动态代理的方式实现在 不修改源代码的情况下给程序动态添加功能的技术. 原理: a.将复杂的需求分解出不同方面,将散布在系统中的

spring技术核心概念纪要

一.背景 springframework 从最初的2.5版本发展至今,期间已经发生了非常多的修正及优化.许多新特性及模块的出现,使得整个框架体系显得越趋庞大,同时也带来了学习及理解上的困难. 本文阐述了一些要点,并配合一些代码样例,这有助于快速理解 spring 框架. 二.spring架构 核心容器层 Core 模块 提供了框架的基本组成部分,包括 IoC 及依赖注入功能. Bean 模块 实现 Bean 管理,包括自动装配机制等功能: 其中BeanFactory是一个工厂模式的实现. Con

Spring核心学习-AOP(7) 织入和代理

前导:开始学习Spring核心思想,通过一个山寨精简版Spring代码结合学习. AdvisedSupport - 保存AOP配置 TargetSource - 保存被代理的数据 AopProxy - 对代理对象做代理,在调用目标方法前先调用它. JdkDynamicAopProxy - 使用JDK动态代理对接口做代理 ReflectiveMethodInvocation - 将反射的Method封装为Joinpoint MethodInterceptor - 对方法调用连接点实现包围通知的 A

Spring核心知识点

目录 Spring概述 依赖注入 Spring Beans Spring注解 Spring的对象访问 Spring面向切面编程 Spring MVC框架 Spring概述 1.什么是Spring? Spring是一个开源的Java EE开发框架.Spring框架的核心功能可以应用在任何Java应用程序中,但对Java EE平台上的Web应用程序有更好的扩展性.Spring框架的目标是使得Java EE应用程序的开发更加简捷,通过使用POJO为基础的编程模型促进良好的编程风格. 2.Spring有

Spring学习篇:AOP知识整理

AOP知识整理 AOP(Aspect-Oriented Programming):面向切面的编程.OOP(Object-Oriented Programming)面向对象的编程.对于OOP我们已经再熟悉不过了,对于AOP,可能我们会觉得是一种新特性,其实AOP是对OOP的一种补充,OOP面向的是纵向编程,继承.封装.多态是其三大特性,而AOP是面向横向的编程. 面向切面编程(AOP)通过提供另外一种思考程序结构的途经来弥补面向对象编程(OOP)的不足.在OOP中模块化的关键单元是类(classe