Spring學習_day02_AOP,AspectJ,JdbcTemplate

本文爲博主辛苦總結,但願本身之後返回來看的時候理解更深入,也但願能夠起到幫助初學者的做用.

轉載請註明 出自 : luogg的博客園 謝謝配合!

Spring_day02

一.AOP面向切面編程

1.1 什麼是AOP

AOP就是面向切面編程,經過預編譯的方式和運行期動態代理實現程序功能的統一維護的技術.java

主要的功能是 : 日誌記錄,性能統計,安全控制,事務處理,異常處理等.mysql

1.2 AOP實現方式

一. 預編譯面試

  • AspectJ

二.運行期動態代理spring

  • JDK動態代理
  • CGLIB動態代理

1.3 Spring中的切面類型

  • 1.Advisor : spring中傳統切面,
    Advisor : 都是一個切點和一個通知組成
    Aspect : 多個切點和多個通知組成

Advisor : 表明通常切面,Advice自己就是一個切面,對目標類全部方法進行攔截(* 不帶有切點的切面.針對全部方法進行攔截)sql

PointcutAdvisor : 表明具備切點的切面,能夠指定攔截目標類哪些方法(帶有切點的切面,針對某個方法進行攔截)apache

1.4 Spring中AOP開發(針對全部方法加強)

  • 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("前置加強");
    }
}
  • 4.生成代理(經過配置生成代理)

1.5 Spring的AspectJ的AOP

AspectJ是一個面向切面的框架,它擴展了Java語言。AspectJ定義了AOP語法因此它有一個專門的編譯器用來生成遵照Java字節編碼規範的Class文件。框架

AspectJ是一個基於Java語言的AOP框架

Spring2.0之後新增了對AspectJ切點表達式支持

@AspectJ 是AspectJ1.5新增功能,經過JDK5註解技術,容許直接在Bean類中定義切面

新版本Spring框架,建議使用AspectJ方式來開發AOP

AspectJ表達式:

  • 語法:execution(表達式)
    execution( <訪問修飾符> ? <返回類型> <方法名> ( <參數> ) <異常> )

  • execution(「* cn.itcast.spring3.demo1.dao.*(..)」) ---只檢索當前包
  • execution(「* cn.itcast.spring3.demo1.dao..*(..)」) ---檢索包及當前包的子包.
  • execution(* cn.itcast.dao.GenericDAO+.*(..)) ---檢索GenericDAO及子類

AspectJ加強(註解):

  • @Before 前置通知,至關於BeforeAdvice,沒有辦法阻止目標方法的執行
/**
     * 前置加強
     */
    @Before("execution(* com.luogg.demo1.UserDao.add(..))")
    public void before(){
        System.out.println("前置加強===>");
    }
  • @AfterReturning 後置通知,至關於AfterReturningAdvice,能夠得到方法的返回值
/*
     * 後置加強
     */
    @AfterReturning(returning="returnVal",value="execution(* com.luogg.demo1.UserDao.delete(..))")
    public void after(Object returnVal){
        System.out.println("後置加強===>方法的返回值爲:" + returnVal);
    }
  • @Around 環繞通知,至關於MethodInterceptor,並且能夠阻止目標方法的執行,在前邊加個if判斷便可.
/*
     * 環繞加強
     */
    @Around(value="execution(* com.luogg.demo1.UserDao.find(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        System.out.println("環繞前加強");
        proceedingJoinPoint.proceed();
        System.out.println("環繞後加強");
    }
  • @AfterThrowing拋出通知,至關於ThrowAdvice
/**
     * 拋出異常
     */
    @AfterThrowing(value="execution(* com.luogg.demo1.UserDao.find(..))",throwing="e")
    public void err(Throwable e){
        System.out.println("出異常了"+e.getMessage());
    }
  • @After 最終final通知,無論是否異常,該通知都會執行
/*
     * 最終通知
     */
    @After("execution(* com.luogg.demo1.UserDao.find(..))")
    public void after(){
        System.out.println("最終通知");
    }
  • @DeclareParents 引介通知,至關於IntroductionInterceptor (不要求掌握)

基於註解

  • 第一步 : 引入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("查詢用戶");
    }
}
  • 第三步 : 使用AspectJ註解形式 定義切面,並定義前置加強
/**
 * 定義一個切面,就是切點和加強的結合
 * @author luogg
 *
 */
@Service("myAspect")
@Aspect     //定義切面
public class MyAspect {
    
    /**
     * 前置加強
     */
    @Before("execution(* com.luogg.demo1.UserDao.*(..))")
    public void before(){
        System.out.println("前置加強");
    }
}
  • 第四步 : 配置applicationContext.xml配置文件,開啓自動生成代理,並掃描bean
<!-- 開啓自動生成代理 -->
    <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("最終通知");
    }

面試:

  • Advisor和Aspect的區別?
  • Advisor:Spring傳統意義上的切面:支持一個切點和一個通知的組合.
  • Aspect:能夠支持多個切點和多個通知的組合.

1.6 Spring的JdbcTemplate

Spring對持久層技術的支持

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

二.Spring的JDBC模板

2.1 DBCP鏈接池

導入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>

2.2 C3P0鏈接池

導入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>

2.3 將參數設置到屬性文件jdbc.properties中

在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"/>

2.4 jdbcTemplate 的 CRUD 操做

相關文章
相關標籤/搜索