1. 程式人生 > >使用maven完成spring aop的xml配置

使用maven完成spring aop的xml配置

首先確定本地maven環境配置ok,並與eclipse整合.

NEW->Other->Maven->Maven Project

接下來就是maven的groupid,artifact id,version的填寫

groupid:所在專案組的名字,一般是公司url倒置+專案組名

artifactid:簡單來說就是專案名

version:版本號可以用預設的

接下來一路按next

生成專案後可以發現專案內容不全,造成這樣的原因就是因為在構建maven專案後,預設的jdk是1.5版本的,而你自己的jdk並不是1.5版本的,所以我們要做兩件事

1,補充結構,右擊專案->Properties->Order and Export,自行補充缺乏的目錄.

src/main/java:所有的介面和實現類均放置在這裡.

src/main/resources:所有的配置檔案均放置在這裡

src/main/test:所有的測試類,測試單元均放置在這裡

2,修改jdk版本,如果現在寫一個介面,再實現這個介面,重寫它的某個方法,可以發現@Override失效,這就是因為jdk1.5還不能支援重寫抽象類方法的重寫標註.

解決方法:右擊專案->Properties->Java Build Path->Compiler level修改成自己的jdk版本

最後refresh專案

在完成以上操作後,配置pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.fengsigaoju</groupId>
  <artifactId>spring-test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>spring-test</name>
  <url>http://maven.apache.org</url>
  <properties>
       <spring-version>3.2.4.RELEASE</spring-version>
  </properties>
  <dependencies>
   <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${spring-version}</version>
    </dependency>
    <dependency>
 <groupId>org.aspectj</groupId>
 <artifactId>aspectjweaver</artifactId>
 <version>1.6.8</version>
</dependency>
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>
  </dependencies>
  <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.8</version>
<configuration>
<downloadSources>true</downloadSources>
</configuration>
</plugin>
</plugins>
</build>
</project>
每一個dependency中就是一個需要的jar包,具體下載到本地是jar還是war,可以在Packaging中配置

在src/main/java新建一個包為com.hello.aop

新建兩個類

AfterSay.java

package com.hello.aop;

public class AfterSay {
  public void aftersay(){
	  System.out.println("說之後");
  }
}

BeforeSay.java

package com.hello.aop;

public class BeforeSay {
 public void beforesay(){
	 System.out.println("說之前");
 }
}

新建com.hello.demo

Say介面:

package com.hello.demo;

public interface Say {
 void say();
}

SayHello.java:

package com.hello.demo;

public class SayHello implements Say {
    private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public void say() {
	System.out.println("hello,"+name);
   }
	
}
在src/main/resources上新增application.xml(有就不需要了)new ->file->application.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        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">
 <bean id="say" class="com.hello.demo.SayHello">
 <property name="name" value="fengsigaoju"></property>
 </bean>
 <bean id="bf" class="com.hello.aop.BeforeSay">
 </bean>
<bean id="af" class="com.hello.aop.AfterSay">
</bean>

<aop:config>
   <aop:aspect ref="bf"><!-- 具體哪一個切入類 -->
      <aop:before method="beforesay" pointcut="execution(* com.hello.demo.SayHello.say(..))"></aop:before><!-- method為類的某個方法,ref是哪一個類,pointcut是執行到那邊增強(即切入點的表示式,呼叫該方法增強 -->
   </aop:aspect>
   <aop:aspect ref="af">
   <aop:after method="aftersay" pointcut="execution(* com.hello.demo.SayHello.say(..))"></aop:after><!-- 具體 -->
   </aop:aspect>
</aop:config>
</beans> 

在src/test/java中新建包com.hello.test

新建Test.java

package com.hello.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.hello.demo.Say;
public class Test {
	public static void main(String[] args) {
	ApplicationContext context= new ClassPathXmlApplicationContext("application.xml");
	 Say say =(Say)context.getBean("say");
	 say.say();
	}
}

執行可以獲得結果

最終專案結構:

說先切入點的表示式,最嚴格寫法:

pointcut="execution (public void execution (public  void com.hello.demo.SayHello.say(..))"

public可以省略

pointcut="execution(public void execution (void com.hello.demo.SayHello.say(..))"

void 表示函式返回值,必須與該函式對應,一般可以用*匹配所有型別
pointcut="execution(public void execution (* com.hello.demo.SayHello.say(..))"

省略某個包(比如增強某個包下面所有的包)
pointcut="execution(public void execution (* com.*.demo.SayHello.say(..))"
指的是增強com.包下面所有的包裡面的demo.SayHello.say方法

但是上面一種方式只能省略一層包,要省略所有的可以用*..*

pointcut="execution(public void execution (* *..*.demo.SayHello.say())"

甚至可以像模糊查詢一樣省略某個包,某個類的部分名字
 pointcut="execution(* com.hello.*emo.SayHello.say(..))"
可以匹配到demo

最後say裡面是引數,一般直接寫..表示匹配所有引數

對於部分對於一個切面有多個操作的,為了避免大量的寫pointcut="exectuin...."這種句型,可以先描寫切入點,再進行引用切入點

具體寫法可以修改配置檔案如下:

<aop:config>
   <aop:pointcut id="pointcut" expression="execution (* com.hello.demo.SayHello.say(..))"/><!-- 一定要放在一開始 -->
   <aop:aspect ref="bf">
   <aop:before method="beforesay" pointcut-ref="pointcut"/>
   </aop:aspect>
   <aop:aspect ref="af">
   <aop:after method="aftersay" pointcut-ref="pointcut"/>
   </aop:aspect>
</aop:config>