本文爲博主辛苦總結,但願本身之後返回來看的時候理解更深入,也但願能夠起到幫助初學者的做用.
轉載請註明 出自 : luogg的博客園 謝謝配合!
AOP就是面向切面編程,經過預編譯的方式和運行期動態代理實現程序功能的統一維護的技術.java
主要的功能是 : 日誌記錄,性能統計,安全控制,事務處理,異常處理等.mysql
一. 預編譯面試
二.運行期動態代理spring
Advisor : 表明通常切面,Advice自己就是一個切面,對目標類全部方法進行攔截(* 不帶有切點的切面.針對全部方法進行攔截)sql
PointcutAdvisor : 表明具備切點的切面,能夠指定攔截目標類哪些方法(帶有切點的切面,針對某個方法進行攔截)apache
1.導入相應的jar包
spring-aop-3.2.0.RELEASE.jar AOP聯盟的jar包
com.springsource.org.aopalliance-1.0.0.jar 依賴包編程
2.編寫被代理的對象:
CustomerDao 接口
CustomerDaoImpl 實現類安全
3.編寫加強的代碼app
public class MyBeforeAdvice implements MethodBeforeAdvice{ @Override /** * method:執行的方法 * args:方法的參數 * target:目標對象 */ public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("前置加強"); } }
AspectJ是一個面向切面的框架,它擴展了Java語言。AspectJ定義了AOP語法因此它有一個專門的編譯器用來生成遵照Java字節編碼規範的Class文件。框架
AspectJ是一個基於Java語言的AOP框架
Spring2.0之後新增了對AspectJ切點表達式支持
@AspectJ 是AspectJ1.5新增功能,經過JDK5註解技術,容許直接在Bean類中定義切面
新版本Spring框架,建議使用AspectJ方式來開發AOP
語法:execution(表達式)
execution( <訪問修飾符> ? <返回類型> <方法名> ( <參數> ) <異常> )
execution(* cn.itcast.dao.GenericDAO+.*(..)) ---檢索GenericDAO及子類
/** * 前置加強 */ @Before("execution(* com.luogg.demo1.UserDao.add(..))") public void before(){ System.out.println("前置加強===>"); }
/* * 後置加強 */ @AfterReturning(returning="returnVal",value="execution(* com.luogg.demo1.UserDao.delete(..))") public void after(Object returnVal){ System.out.println("後置加強===>方法的返回值爲:" + returnVal); }
/* * 環繞加強 */ @Around(value="execution(* com.luogg.demo1.UserDao.find(..))") public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{ System.out.println("環繞前加強"); proceedingJoinPoint.proceed(); System.out.println("環繞後加強"); }
/** * 拋出異常 */ @AfterThrowing(value="execution(* com.luogg.demo1.UserDao.find(..))",throwing="e") public void err(Throwable e){ System.out.println("出異常了"+e.getMessage()); }
/* * 最終通知 */ @After("execution(* com.luogg.demo1.UserDao.find(..))") public void after(){ System.out.println("最終通知"); }
第一步 : 引入jar包.
aspectj依賴aop環境.
spring-aspects-3.2.0.RELEASE.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
第二步 : 編寫被代理對象UserDao
/** * 編寫被代理對象 用戶dao層 * @author luogg * */ @Repository("userDao") public class UserDao { public void add(){ System.out.println("添加用戶"); } public void delete(){ System.out.println("刪除用戶"); } public void update(){ System.out.println("修改用戶"); } public void find(){ System.out.println("查詢用戶"); } }
/** * 定義一個切面,就是切點和加強的結合 * @author luogg * */ @Service("myAspect") @Aspect //定義切面 public class MyAspect { /** * 前置加強 */ @Before("execution(* com.luogg.demo1.UserDao.*(..))") public void before(){ System.out.println("前置加強"); } }
<!-- 開啓自動生成代理 --> <aop:aspectj-autoproxy/> <!-- 去掃描註解裝配的Bean --> <context:component-scan base-package="com.luogg.demo1"></context:component-scan>
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class SpringTest1 { @Autowired //@Qualifier("userDao") private UserDao userDao; @Test public void test1(){ userDao.add(); userDao.delete(); userDao.update(); userDao.find(); } }
輸出結果
添加用戶
前置加強
刪除用戶
前置加強
修改用戶
前置加強
查詢用戶
在註解中寫切點太麻煩了,直接贊成定義,而後經過類名.方法名調用贊成的切點.
@Pointcut("execution(* com.luogg.demo1.UserDao.find(..))") public void myPointCut(){} /* * 最終通知 */ @After("MyAspect.myPointCut()") public void after(){ System.out.println("最終通知"); }
面試:
JDBC : org.springframework.jdbc.core.JdbcTemplate
Hibernate3.0 : org.springframework.orm.hibernate3.HibernateTemplate
IBatis(MyBatis) : org.springframework.orm.ibatis.SqlMapClientTemplate
JPA : org.springframework.orm.jpa.JpaTemplate
導入jar包: * com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar * com.springsource.org.apache.commons.pool-1.5.3.jar <!-- 配置DBCP鏈接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///spring3_day02"/> <property name="username" value="root"/> <property name="password" value="123"/> </bean>
導入jar包: * com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar <!-- 配置c3p0鏈接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql:///spring3_day02"/> <property name="user" value="root"/> <property name="password" value="123"/> </bean>
在src下建立jdbc.properties
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql:///spring3_day02
jdbc.user = root
jdbc.password = 123
須要在applicationContext.xml 中使用屬性文件配置的內容. * 第一種寫法: <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties"></property> </bean> * 第二種寫法: <context:property-placeholder location="classpath:jdbc.properties"/>