java框架之spring(四)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010044440/article/details/79408374

AOP 面向切面编程

AOP 即 Aspect Oriented Program 面向切面编程 
首先,在面向切面编程的思想里面,把功能分为核心业务功能周边功能。 

所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 

所谓的周边功能,比如性能统计,日志,事务管理等等 
周边功能在Spring的面向切面编程AOP思想里,即被定义为切面 
在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发 
然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP


为了支持AOP,需要用到一些额外的JAR包。 这些额外的JAR包放在项目的lib目录下。 
至于多了哪些,记不太清楚了。。。。 都导入吧。。。。


思路图

1. 功能分两大类,辅助功能和核心业务功能
2. 辅助功能和核心业务功能彼此独立进行开发
3. 比如登陆功能,即便是没有性能统计和日志输出,也可以正常运行
4. 如果有需要,就把"日志输出" 功能和 "登陆" 功能 编织在一起,这样登陆的时候,就可以看到日志输出了
5. 辅助功能,又叫做切面,这种能够选择性的,低耦合的把切面和核心业务功能结合在一起的编程思想,就叫做切面编程


接下去继续在上个项目中进行改造

1、准备业务类 ProductService

package com.hjsy.service;

public class ProductService {
	public void doSomeService(){
        System.out.println("doSomeService");
    }
}
2、 在引入切面之前,调用该业务类
package spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.hjsy.pojo.Category;
import com.hjsy.pojo.Product;
import com.hjsy.service.ProductService;

public class TestSpring {
	public static void main(String[] args) {
		ApplicationContext context1 = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });;
		ProductService s = (ProductService) context1.getBean("hjsy2");
        	s.doSomeService();
	}
}
3、运行输出结果


4、准备日志切面 LoggerAspect

该日志切面的功能是 在调用核心功能之前和之后分别打印日志。

package com.hjsy.aspect;

import org.aspectj.lang.ProceedingJoinPoint;

public class LoggerAspect {
	public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("start log:" + joinPoint.getSignature().getName());
        Object object = joinPoint.proceed();
        System.out.println("end log:" + joinPoint.getSignature().getName());
        return object;
    }
}

Object object = joinPoint.proceed(); 就是将来与某个核心功能编织之后,用于执行核心功能的代码

5、修改applicationContext.xml文件

(1)添加

<bean name="hjsy2" class="com.hjsy.service.ProductService">
</bean>
(2) 声明业务对象
 <bean id="loggerAspect" class="com.hjsy.aspect.LoggerAspect"/>
(3) 声明日志切面
<aop:pointcut id="loggerCutpoint"
            expression=
            "execution(* com.hjsy.service.ProductService.*(..)) "/>
(4) 指定核心业务功能
<aop:aspect id="logAspect" ref="loggerAspect">
	<aop:around pointcut-ref="loggerCutpoint" method="log"/>
</aop:aspect>
(5) 指定辅助功能
然后通过aop:config把业务对象与辅助功能编织在一起。
execution(* com.hjsy.service.ProductService.*(..)) 
这表示对满足如下条件的方法调用,进行切面操作:
*  返回任意类型
com.hjsy.service.ProductService.*  包名以 com.hjsy.service.ProductService 开头的类的任意方法

(..) 参数是任意数量和类型

<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
   http://www.springframework.org/schema/context     
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">
   <bean name="hjsy" class="com.hjsy.pojo.Category">  
        <property name="name" value="花季岁月" />  
    </bean>  
    <bean name="hjsy1" class="com.hjsy.pojo.Product">  
        <property name="name" value="花季岁月1" />  
        <property name="category" ref="hjsy" /> 
    </bean>  
    <bean name="hjsy2" class="com.hjsy.service.ProductService">
    </bean>
    <bean id="loggerAspect" class="com.hjsy.aspect.LoggerAspect"/>
    <aop:config>
        <aop:pointcut id="loggerCutpoint"
            expression=
            "execution(* com.hjsy.service.ProductService.*(..)) "/>
        <aop:aspect id="logAspect" ref="loggerAspect">
            <aop:around pointcut-ref="loggerCutpoint" method="log"/>
        </aop:aspect>
    </aop:config>
</beans>


6、测试

TestSpring 代码没有发生任何变化,通过配置的方式,把切面和核心业务类编制在了一起。

运行测试,可以发现在编织之后,业务方法运行之前和之后分别会打印日志


源码:链接:https://pan.baidu.com/s/1nwWF4rn 密码:88qv

猜你喜欢

转载自blog.csdn.net/u010044440/article/details/79408374