Spring開發核心之AOP的實現與切入點持久化
前言
AOP(Aspect Oriented Program 面向切面編程)的實現基於Java的代理機制, 下面介紹Spring Aop的術語
1:切面(aspect)
切面是對象操作過程中的截面 如圖19.1所示 切面是指圖中的平行四邊形
2:連接點(join point)
連接點是指對象操作過程中的某個階段點 實際上是對象的一個操作 如圖19.2所示
3:切入點(pointcut)
切入點是連接點的集合 如圖19.3 切面與程序流程的交叉點便是程序的切入點
4:通知(advice)
通知是某個切入點被橫切後,所采取的邏輯,也就是說 在切入點處攔截程序後,通過通知來執行切面
5:目標對象(target)
所有被通知的對象都是目標對象 被AOP所關註
6:織入(weaving)
織入是將切面功能應用到目標對象的過程 由代理工廠創建一個代理對象 這個代理可以為目標對象執行切面功能
7:引入(introduction)
對一個已編譯完類 在運行時期 動態地向這個類中加載屬性和方法
一、AOP的簡單實現
利用Spring AOP使日志輸出與方法分離 讓在調用目標方法之前執行日志輸出
public class Target{ public void execute(String name){ System.out.printIn("程序開始執行"+name); } }
通知可以攔截目標對象的execute方法 並執行日志輸出
public class LoggerExecute implements MethodInterceptor{ public Object invoke(MethodInvocation invocation) throws Throwable{ before(); invocation.proceed(); return null; } private void before(){ System.out.printIn("程序開始執行"); } }
創建代理從而使用AOP功能
public class Manger{ public static void main(String[] args){ Target target=new Target(); ProxyFactory di=new ProxyFactory(); di.addAdvice(new LoggerExecute()); di.setTarget(target); Target proxy=(Target)di.getProxy(); proxy.execute("AOP的簡單實現"); } }
二、Spring的切入點
1:靜態切入點
靜態意味著不變,無論在程序的任何位置調用 方法名都不會改變 配置文件如下
指定所有以getConn開頭的方法名都是切入點
<bean id="pointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice"> <ref bean="MyAdvisor"/> </property> <property name="patterns"> <list> <value>.*getConn*.</value> <value>.*closeConn*.</value> </list> </property> </bean>
2:動態切入點
動態切入點應用在相對變化的位置
深入靜態切入點
實際上Spring使使用boolean matches(Method,Class)方法來匹配切入點的
public boolean matches(Method method,Class targetClass){ return(method.getName().equals("execute")); }
深入切入點底層
Pointcut接口是切入點的定義接口 用它來規定可切入的連接點的屬性 通過對該接口的擴展可以處理其他類型的連接點 接口定義代碼如下
public interface Pointcut{ ClassFilter getClassFilter(); MethodMatcher getMethodMatcher(); }
使用ClassFilter接口來匹配目標類 代碼如下
public interface ClassFilter{ boolean matches(Class class); }
使用MethodMatcher接口來匹配目標類的方法或方法的參數
public interface MethodMatcher{ boolean matches(Method m,Class targetClass); boolean isRuntime(); boolean matches(Method m,Class targetClass,Object[]args); }
isRuntime方法返回false則執行靜態切入點 true則執行動態切入點
三、Aspect對AOP的支持
Aspect是對系統中的對象操作過程中截面邏輯進行模塊化封裝的AOP概念實體,在通常情況下,Aspect可以包含多個切入點和通知
Advisor就是Spring中的Aspect 是切入點的配置器 結構如下
1:DefaultPointcutAdvisor切入點配置器
它可以把一個通知配給一個切入點 使用之前 首先要創建一個切入點和通知
首先創建一個通知
public TestAdvice implements MethodInterceptor{ public Object invoke(MethodInvocation mi)thorws Throwable{ Object Val=mi.proceed(); return Val; } }
創建自定義切入點 重寫matches和getclassfilter方法
public class TestStaticPointcut extends StaticMethodMatcherPointcut{ public boolean matches(Method method Class targetClass){ return("targetMethod".equals(method.getName()); } public ClassFilter getClassFilter(){ return new ClassFilter() { public boolean matches(Class clazz){ return(clazz==targetClass.class); } }; } }
分別創建一個通知和切入點實例
Pointcut pointcut=new TestStaticPointcut(); Advice advice=new TestAdvice();
2:NameMatchMethodPointcutAdvisor 切入點配置器
使用它可以更簡潔的將方法名設定為切入點
NameMatchMethodPointcutAdvisor advice=new NameMatchMethodPointcutAdvisor(new TestAdvice()); advice.addMethodName("targetMethod1name"); ...
四、Spring持久化
1:DAO模式
DAO代表數據訪問對象(Data Access Object) 它描述瞭一個應用中的DAO角色 它提供瞭讀寫數據庫中數據的一種方法,把這個功能通過接口提供對外服務 使得解耦合,對於整個系統性能有巨大的提升
Spring DAO抽象提供瞭以下幾類
1:JdbcDaoSupport JDBC DAO抽象類 開發者需要為他設置數據源 通過子類 開發者能夠獲得JdbcTmeplate來訪問數據庫
2:HibernateDaoSupport 通過其子類 開發者能夠獲得Hibernate實現
3:JdoDaoSupport 通過其子類 開發者能夠獲得JdoTemplate
事務應用的管理
1:編程式事務管理
在Spring中主要有兩種編程式事務的實現方法 分別使用PlatfromTransactionManager接口的事務管理器或者TransactionTemplate實現 但是推薦使用Transaction Template實現方式 因為它符合Spring的模板模式
2:聲明式事務管理
Spring的聲明式事務管理不涉及組建依賴關系 它通過AOP實現事務管理 Spring本身就是一個容器 相對於EJB容器而言 Spring顯得更為輕量級
在Spring中常用TransactionProxyFactoryBean完成聲明式管理
應用JdbcTemplate操作數據庫
JdbcTemplate類式Spring的核心類之一 它在內部類已經處理完瞭數據庫資源的創建和銷毀 隻需在代碼中提供sql語句即可
配置JdbcTemplate和數據源
<!--配置JdbcTemplate> <bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref local="dataSource"/> </property> </bean>
獲取JdbcTemplate對象 並利用它的update方法執行數據庫的添加操作
DriverManagerSource ds=null; JdbcTemplate jtl=null; Resource resource=new ClassPathResource("applicationContext.xml"); BeanFactory factory=new XmlBeanFactory(resource); jtl=(JdbcTemplate)factory.getBean("jdbcTemplate"); String sql="insert into table()values()"; jtl.update(sql);
與Hibernate整合
Spring整合瞭對Hibernate的設定 Spring中提供瞭HibernateTemplate類和HibernateDaoSupport類以及相應的子類 使用戶時可以簡化程序編寫的資源
到此這篇關於Spring開發核心之AOP的實現與切入點持久化的文章就介紹到這瞭,更多相關Spring AOP 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java Spring AOP之PointCut案例詳解
- Java面試題沖刺第八天–Spring框架2
- 詳細解讀Java Spring AOP
- AOP之事務管理<aop:advisor>的兩種配置方式
- Spring-AOP 靜態普通方法名匹配切面操作