java框架之spring(四)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值