Spring框架:面向切面编程,切点等面试时常问的术语,aop: before,aop:aspect等标签
导航:
边看教程边记录的部分
面试时常用的术语
切点的理解(pointcut)
<aop: before>
<aop: after>
aop:after-throwing
aop:before等相关标签的面向切面的运用例子
aop:aspect等标签来模拟黑客抓,拦截用户更新数据的游戏数据包的例子
5、SPRINGCORE框架_面向切面编程.ppt
aop:aspect
单词:aspect方面

边看教程边记录的部分 START
在访问界面的时候,不可以直接的访问,要进行安全验证,确认是登录了的用户后才可以访问界面,没登录就想访问就是非法访问,就是没登录的就要跳到登录界面。

在访问界面的时候,不可以直接的访问,要进行安全验证,确认是登录了的用户后才可以访问界面,没登录就想访问就是非法访问,就是没登录的就要跳到登录界面。
其实我认为spring框架,面向切面编程等的作用就是“集中处理会常要修改的内容,比如一些数据,在配置文件用value赋值,要改数据时,改value等的值就可以”。切面是一种“类”。有时集中处理就效率更高了,省去找分散的部分。如果不用Spring框架等等,还可能遗漏处理。

其实我认为spring框架,面向切面编程等的作用就是“集中处理会常要修改的内容,比如一些数据,在配置文件用value赋值,要改数据时,改value等的值就可以”。切面是一种“类”。有时集中处理就效率更高了,省去找分散的部分。如果不用Spring框架等等,还可能遗漏处理。
如果是每个步骤都用日志文件打印,那么出问题后,看日志文件就可以更快地知道错在哪里。

面试时常用的术语。

切点的理解(pointcut)。



可以看出了如果有更多类似考试,创业等的方法调用,但是要对应地在调用这些方法等前或后调用鼓励方法,使用原始地调用方法地话就会要重复用代码调用鼓励的方法。
这时候spring框架的作用就体现出了:使用面向切面,配置文件配置后可以减少代码重复。
其实我发现和认为很多强大和先进的技术(比如一些框架)的话常用的作用之一就是:减少代码重复,像是是使用了“乘法结合律”。

这时候spring框架的作用就体现出了:使用面向切面,配置文件配置后可以减少代码重复。
其实我发现和认为很多强大和先进的技术(比如一些框架)的话常用的作用之一就是:减少代码重复,像是是使用了“乘法结合律”。



execution:执行


core:核心部分

配置文件中声明切面的方法(在事务提交处理等中切面会常用,且其关键作用,所以很重要):
<aop: before>等等是spring框架中的“通知”的一种。
个人理解:本质作用就是用对应的标签来控制成自己规定的“何时,何处”来调用一些自己创建的并且为method中的值的方法。
关于<aop: before>标签的代码的意思就是,在调用Student这个类中的exam方法之前(before),会调用在method中声明的encourage方法。

关于<aop: before>标签的代码的意思就是,在调用Student这个类中的exam方法之前(before),会调用在method中声明的encourage方法。
同理的话,关于<aop: after>标签的代码的意思就是在调用Student这个类中的createWork方法之后(after),会调用在method中声明的encourage方法。











边看教程边记录的部分 END
aop:before等相关标签的面向切面的运用例子 START


package com.SSHC.bean;
public class Student {
public void exam(){
System.out.println("正在考试,调用Student的exam方法。");
}
public void createWork(){
System.out.println("正在创业,调用Student的createWork方法。");
}
public void driverExam(){
System.out.println("驾照考试,调用Student的driverExam方法,"
+ "\n int i = 1 / 0的异常来模拟驾照考试失败。");
int i = 1 / 0;
}
}

package com.SSHC.bean;
public class Teacher {
public void encourage(){
System.out.println("奥里给,加油,"
+ "调用了Teacher类中的encourage鼓励方法 ");
}
}

package MainText;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.SSHC.bean.Game;
import com.SSHC.bean.Student;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext ctx =
new ClassPathXmlApplicationContext("applicationContext.xml");
Student s = (Student) ctx.getBean("s");
//模拟考试前鼓励:
s.exam();
//模拟创业失败后鼓励:
s.createWork();
//模拟考驾照科目三没过后给鼓励:
s.driverExam();
}
}

<?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 classpath:/org/springframework/beans/factory/xml/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop classpath:/org/springframework/aop/config/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx classpath:/org/springframework/transaction/config/spring-tx-3.0.xsd
http://www.springframework.org/schema/context classpath:/org/springframework/context/config/spring-context-3.0.xsd">
<bean id="s" class="com.SSHC.bean.Student"></bean>
<bean id="t" class="com.SSHC.bean.Teacher"></bean>
<bean id="game" class="com.SSHC.bean.Game"></bean>
<bean id="hk" class="com.SSHC.bean.Hacker"></bean>
<!-- 切面配置 -->
<aop:config>
<aop:aspect ref="t">
<aop:before pointcut="execution(* com.SSHC.bean.Student.exam(..))"
method="encourage"></aop:before>
<aop:after pointcut="execution(* com.SSHC.bean.Student.createWork(..))"
method="encourage"></aop:after>
<aop:after-throwing pointcut="execution(* com.SSHC.bean.Student.driverExam(..))"
method="encourage"></aop:after-throwing>
</aop:aspect>
<aop:aspect ref="hk">
<aop:before pointcut="execution(* com.SSHC.bean.Game.sendData(String)) and args(data)"
method="interData"></aop:before>
</aop:aspect>
</aop:config>
</beans>

aop:before等相关标签的面向切面的运用例子END
aop:aspect等标签来模拟黑客抓,拦截用户更新数据的游戏数据包的例子 START

package com.SSHC.bean;
public class Game {
//发送游戏数据包
public void sendData(String msg){
System.out.println("发送到服务器的数据是:" + msg);
}
}

package com.SSHC.bean;
public class Hacker {
//拦截数据
public void interData(String data){
System.out.println("拦截到的数据是:" + data);
}
}


package MainText;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.SSHC.bean.Game;
public class Demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext ctx =
new ClassPathXmlApplicationContext("applicationContext.xml");
//Student s = (Student) ctx.getBean("s");
//考试前鼓励
//s.exam();
//创业失败后鼓励
//s.createWork();
//考驾照科目三没过
//s.driverExam();
Game g = (Game) ctx.getBean("game");
g.sendData("对BOSS造成了1000点的伤害");
}
}

aop:aspect等标签来模拟黑客抓,拦截用户更新数据的游戏数据包的例子 END
5、SPRINGCORE框架_面向切面编程.ppt START












SPRINGCORE框架
面向切面编程
概念的引入
思考以下的几种情形:1、如何在javaweb项目中实现用户的安全验证。2、在javaweb中处理中文乱码问题。3、在系统工程中,对每步操作都产生日志记录。4、对每个service类中的方法调用前都启动一个事务,调用后提交或者回滚事务。在上面的情形中,分布于应用中多处的功能被称为横切关注点。通常,这些横切关注点从概念上是与应用的业务逻辑分离的,但是往往又直接嵌入到应用的业务逻辑中,面向切面编程(AOP)的目的就是将这些横切关注点与业务逻辑分离。
什么是面向切面编程
横切关注点可以理解为在工程需要多次使用的功能。如前面所述的4种情形,全部都是横切关注点。下图展示了一个多模块的应用,每个模块都有自己的核心功能,但是这些模块也需要一些辅助功能,例如安全验证和事务管理,这些辅助功能就是横切关注点,如果将每个横切关注点模块化为特殊类,则这些类就被称为切面。面向切面编程的好处:1、每个横切关注点现在被集中处理了,不会再分散到多处代码中。2、service类更加的简洁,因为它们现在只需要关注核心功能的代码,而辅助功能的代码被转移到切面中去了。
面向切面编程的术语
描述切面的常用术语有:通知(advice),切点(pointcut)和连接点(join point)。通知:定义了切面是什么以及何时使用,即描述了切面要完成的工作以及什么时候执行这个工作。spring中包含5种类型的通知。1、Before,在方法被调用之前调用通知。2、After,在方法被调用之后调用通知。3、After-returning,在方法成功执行之后调用通知。4、After-throwing,在方法抛出异常后调用通知。5、Around,通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。连接点:应用通知的时机被称为连接点。连接点可以是调用方法时、抛出异常时、甚至修改一个字段时。在spring中连接点总是方法调用时。切点:如果通知定义了切面的“什么”和“何时”,那么切点就定义了“何处”。也可以理解为被筛选后需要被通知的连接点。切面:即通知与切点的结合,即定义切面的全部内容:它是什么,在何时何处完成其功能。织入:将切面应用到目标对象来创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。
Spring中的AOP支持
Spring提供了4种AOP支持:●基于代理的经典AOP●@AspectJ注解驱动的切面●纯POJO切面●注入式AspectJ切面(适合Spring各版本)注意:Spring只支持方法连接点
AspectJ的切点表达式语言
在Spring AOP中,需要使用AspectJ的切点表达式语言来定义切点。下表列出了Spring AOP所支持的AspectJ切点指示器。
在配置文件中声明切面(一)
在Spring AOP的配置元素如下表
在配置文件中声明切面(二)
检查applicationContext.xml的beans标签中是否有以下的代码。
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
classpath:/org/springframework/aop/config/spring-aop-4.1.xsd
在配置文件中声明切面(三)
1、创建Teacher类和Student类。
在配置文件中声明切面(三)
2、在配置文件中声明切面。
为通知传递参数
有时候通知不仅仅是对方法的简单包装,还需要校验传递给方法的参数值,为通知传递参数就比较有用了。下面看看如何为通知传递参数。创建一个模拟黑客截取游戏数据包的程序。1、创建Game类和Hacker类。
为通知传递参数
2、配置application.xml文件。
3、进行测试。