使用maven完成spring aop的xml配置
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
每一個dependency中就是一個需要的jar包,具體下載到本地是jar還是war,可以在Packaging中配置<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>
在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>