------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑-------------
aspectJ的xml版是開發中最常用的:
下面直接已案例入手,畢竟繁瑣的日子不多了
案例:兩個接口,倆個實作類,一個實作增強的普通類
ISomeService接口:
package cn.dawn.day20aspectjxml;
/**
* Created by Dawn on 2018/3/8.
*/
public interface ISomeService {
public void insert();
public void delete();
public void select();
public void update();
}
SomeServiceImpl類,上方類的實作類:
package cn.dawn.day20aspectjxml;
/**
* Created by Dawn on 2018/3/8.
*/
public class SomeServiceImpl implements ISomeService {
public void insert() {
System.out.println("insert ok");
}
public void delete() {
System.out.println("delete ok");
}
public void select() {
System.out.println("select ok");
}
public void update() {
System.out.println("update ok");
}
}
IBookService接口
package cn.dawn.day20aspectjxml;
/**
* Created by Dawn on 2018/3/12.
*/
public interface IBookService {
public void selectAllBooks();
}
BookServiceImpl類,上面那個接口的實作類
package cn.dawn.day20aspectjxml;
/**
* Created by Dawn on 2018/3/12.
*/
public class BookServiceImpl implements IBookService {
public void selectAllBooks() {
System.out.println("selectbooks ok");
int a=5/0;
System.out.println(a);
}
}
實作增強的普通類:
package cn.dawn.day20aspectjxml;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* Created by Dawn on 2018/3/12.
*/
public class MyAspectJ {
/*最後增強,無論是否出現異常都會執行*/
public void myAfter(){
System.out.println("最終增強");
}
/*後置增強*/
public void myAfterReturning(){
System.out.println("後置增強");
}
/*前置增強*/
public void myBefore(){
System.out.println("前置增強");
}
/*前置增強,這種寫法可以一會調用出切點表達式,在console列印出來:當然xml檔案中另外需要配置一道*/
public void myBefore1(JoinPoint jp){
System.out.println("前置通知方法jp = " + jp);
}
/*異常增強*/
public void myAfterThrowing(){
System.out.println("異常增強");
}
/*環繞增強*/
public void myAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("環繞增強前");
pjp.proceed();
System.out.println("環繞增強後");
}
}
xml中:
<?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: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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--要增強的對象-->
<bean id="service" class="cn.dawn.day20aspectjxml.SomeServiceImpl"></bean>
<bean id="bookservice" class="cn.dawn.day20aspectjxml.BookServiceImpl"></bean>
<!--增強的内容-->
<bean id="MyAspectJ" class="cn.dawn.day20aspectjxml.MyAspectJ"></bean>
<!--aspectjxml的自動代理-->
<aop:config>
<aop:pointcut id="mypointcut1" expression="execution(* *..day20aspectjxml.*.select(..))"></aop:pointcut>
<aop:pointcut id="mypointcut2" expression="execution(* *..day20aspectjxml.*.update(..))"></aop:pointcut>
<aop:pointcut id="mypointcut3" expression="execution(* *..day20aspectjxml.*.select*(..))"></aop:pointcut>
<aop:pointcut id="mypointcut4" expression="execution(* *..day20aspectjxml.*.delete(..))"></aop:pointcut>
<aop:aspect ref="MyAspectJ">
<aop:before method="myBefore" pointcut-ref="mypointcut2"></aop:before>
<aop:before method="myBefore1(org.aspectj.lang.JoinPoint)" pointcut-ref="mypointcut2"></aop:before>
<aop:after method="myAfter" pointcut-ref="mypointcut1"></aop:after>
<aop:around method="myAround(org.aspectj.lang.ProceedingJoinPoint)" pointcut-ref="mypointcut4"></aop:around>
<aop:after-throwing method="myAfterThrowing" pointcut-ref="mypointcut3"></aop:after-throwing>
<aop:after-returning method="myAfterReturning" pointcut-ref="mypointcut1"></aop:after-returning>
</aop:aspect>
</aop:config>
</beans>
這兒的method方法中加了(參數)會報紅,不需理會,一會執行沒有錯誤就行
寫法的格式就是這樣
單測:
package cn.dawn.day20aspectjxml;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by Dawn on 2018/3/3.
*/
public class test20180312 {
@Test
/*aop代理工廠bean異常增強*/
public void t01(){
ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext-day20aspectjxml.xml");
ISomeService service = (ISomeService) context.getBean("service");
IBookService bookservice = (IBookService) context.getBean("bookservice");
try {
bookservice.selectAllBooks();
}catch(Exception e){
e.printStackTrace();
}
System.out.println("================觀察==================");
service.update();
System.out.println("================觀察==================");
service.delete();
System.out.println("================觀察==================");
service.select();
System.out.println("================觀察==================");
}
}
繁瑣的東西結束了
我記得我的老師說過一句話,java核心,java能不死,能輝煌這麼多年的原因就是Spring,學會Spring可以賺3000,如果你搞java不會Spring,你連3000都賺不到
其中IOC(控制反轉)值1000,AOP(面向切面程式設計)值2000,至此,3000塊的東西講的差不多了,aop也結束了,
下面我還會繼續更新部落格,Spring的事物,JDBCTemplate,以及整合MyBatis,然後此Spring部分也就差不多完結了,以後有時間再補充更多關于Spring的知識點