<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 78, comments - 34, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    2010-01-26 傳智播客—spring

    Posted on 2010-01-26 22:49 長城 閱讀(376) 評論(0)  編輯  收藏

    這知識越學(xué)越簡單了。其實現(xiàn)在學(xué)習(xí)的Spring和之前學(xué)習(xí)的Hibernate等框架等,他們的實現(xiàn)都是我們之前學(xué)習(xí)的Java基礎(chǔ)和JavaWeb基礎(chǔ)。再加之做了幾個總結(jié)性的練習(xí),鞏固了基礎(chǔ)。所以現(xiàn)在學(xué)習(xí)起來就比較容易了。

    今日的課程內(nèi)容為兩部分:Spring中的AOP面向切面編程和Spring對JDBC的支持。

     

    一、Spring-AOP

    AOP面向切面編程(Aspect-Oriented Programming),是對傳統(tǒng)OOP的補充。AOP使用是使用動態(tài)代理實現(xiàn)的。動態(tài)代理我們已經(jīng)非常熟悉了。我也將逐漸的由實現(xiàn)原理轉(zhuǎn)向應(yīng)用,因為我們在學(xué)習(xí)JavaWEB基礎(chǔ)的時候,原理已經(jīng)學(xué)習(xí)過了。

    AspectJ是Java社區(qū)里最完整最流行的AOP框架,Spring2.X使用的正是這個框架。AspectJ已經(jīng)被廣泛應(yīng)用,她具有大好前程。

    AspectJ支持注解和XML配置。

    1.啟用AspectJ注解支持

    1).AspectJ需要兩個Jar包:spring-framework-2.5.6.SEC01\lib\aspectj\目錄下“aspectjrt.jar”和“aspectjweaver.jar”。

    2).在Bean配置文件中添加“<aop:aspectj-autoproxy/>

    2.使用AspectJ注解聲明切面

    AspectJ 支持 5 種類型的通知注解:

    1) @Before: 前置通知, 在方法執(zhí)行之前執(zhí)行。

    2) @After: 后置通知, 在方法執(zhí)行之后執(zhí)行 。

    3) @AfterRunning: 返回通知, 在方法返回結(jié)果之后執(zhí)行。

    4) @AfterThrowing: 異常通知, 在方法拋出異常之后。

    5) @Around: 環(huán)繞通知, 圍繞著方法執(zhí)行。

    我們來看個簡單的例子,算術(shù)計算器。

    1).定義一個接口:

    package cn.itcast.cc.spring.aspectj;

    public interface ArithmeticCalculator {

    void add(int i, int j);// 無返回值,用于測試

    void sub(int i, int j);// 無返回值,用于測試

    int mul(int i, int j);

    int div(int i, int j);

    }

    2).實現(xiàn)類:

    package cn.itcast.cc.spring.aspectj;

    import org.springframework.stereotype.Component;

    @Component(value="calc")

    public class ArithmeticCalculatorImpl implements ArithmeticCalculator {

    @Override

    public void add(int i, int j) {

    int result = i + j;

    System.out.println(result);

    }

    @Override

    public void sub(int i, int j) {

    int result = i - j;

    System.out.println(result);

    }

    @Override

    public int div(int i, int j) {

    int result = i / j;

    return result;

    }

    @Override

    public int mul(int i, int j) {

    int result = i * j;

    return result;

    }

    }

    3).AspectJ切面類:

    package cn.itcast.cc.spring.aspectj;

    import org.aspectj.lang.*;

    import org.aspectj.lang.annotation.*;

    import org.springframework.stereotype.Component;

    @Aspect // AspectJ切面Bean

    @Component // Bean

    public class ArithmeticCalculatorAspect {

    // 前置通知

    @Before(value = "execution (* cn.itcast.cc.spring.aspectj.ArithmeticCalculator.* (..))")

    public void beforeMethodLoggin(JoinPoint jp) {

    System.out.println("before " + jp.getSignature().getName());

    }

    // 后置通知

    @After(value = "execution (* cn.itcast.cc.spring.aspectj.ArithmeticCalculator.* (..))")

    public void afterMethodLoggin(JoinPoint jp) {

    System.out.println("after " + jp.getSignature().getName());

    }

    // 返回通知

    @AfterReturning(value = "pointCut()", returning = "result")

    public void afterMethodLogginReturn(JoinPoint jp, Object result) {

    System.out.println("after " + jp.getSignature().getName() + " return " + result);

    }

    // 異常通知

    @AfterThrowing(value = "pointCut()", throwing = "e")

    public void errorMethodLoggin(JoinPoint jp, Throwable e) {

    System.out.println("method " + jp.getSignature().getName()

    + " throwing " + e);

    }

    // 環(huán)繞通知,通過它可以實現(xiàn)上面所有的通知。

    @Around("execution (* cn.itcast.cc.spring.aspectj.ArithmeticCalculator.* (..))")

    public Object aroundMethodLoggin(ProceedingJoinPoint pjp) {

    System.out.println("around_before " + pjp.getSignature().getName());

    Object result = null;

    try {

    result = pjp.proceed();

    } catch (Throwable e) {

    e.printStackTrace();

    System.out.println("around_error " + pjp.getSignature().getName());

    }

    System.out.println("around_after " + pjp.getSignature().getName());

    System.out.println("around_after " + pjp.getSignature().getName()

    + " return " + result);

    return result;

    }

    // 重用切入點,其他“通知方法”可以引用此方法名稱“pointCut()”。

    @Pointcut(value = "execution (* cn.itcast.cc.spring.aspectj.ArithmeticCalculator.* (..))")

    public void pointCut() {

    }

    }

    4).Bean配置文件:

    <?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:context="http://www.springframework.org/schema/context"

    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

    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="cn.itcast.cc.spring.aspectj" />

    <aop:aspectj-autoproxy />

    </beans>

    5).測試類:

    package cn.itcast.cc.spring.aspectj;

    import org.springframework.context.ApplicationContext;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

    public class Main {

    public static void main(String[] args) {

    ApplicationContext ac = new ClassPathXmlApplicationContext("beans-aspect.xml");

    ArithmeticCalculator calc = (ArithmeticCalculator) ac.getBean("calc");

    calc.add(1, 2);

    // calc.sub(2, 1);

    // calc.mul(3, 3);

    // calc.div(10, 2);

    }

    }

    上面是較為常用的注解。

    2.使用XML文件聲明切面

    使用XML文件聲明切面沒有使用注解聲明切面直觀,簡單。

    1).刪除所有AspectJ注解

    2).xml配置文件內(nèi)容為:

    <?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:context="http://www.springframework.org/schema/context"

    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

    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="arithmeticCalculatorAspect" class="cn.itcast.cc.spring.xml.ArithmeticCalculatorAspect" />

    <bean id="arithmeticCalculatorImpl" class="cn.itcast.cc.spring.xml.ArithmeticCalculatorImpl" />

    <aop:config>

    <aop:pointcut

    expression="execution(* cn.itcast.cc.spring.xml.ArithmeticCalculator.* (..))"

    id="pointcut" />

    <aop:aspect order="1" ref="arithmeticCalculatorAspect">

    <aop:before method="beforeMethodLoggin" pointcut-ref="pointcut"/>

    <aop:after method="afterMethodLoggin" pointcut-ref="pointcut"/>

    <aop:after-returning method="afterMethodLogginReturn" returning="result" pointcut-ref="pointcut"/>

    <aop:after-throwing method="errorMethodLoggin" throwing="e" pointcut-ref="pointcut"/>

    <aop:around method="aroundMethodLoggin" pointcut-ref="pointcut"/>

    </aop:aspect>

    </aop:config>

    </beans>

    3.引入通知

    這是一個高級應(yīng)用。我們知道Java只能單繼承,使用這個引入通知就能實現(xiàn)多集成!這一點是我沒想到的,但想一想Java的反射機制和動態(tài)代理實現(xiàn)這一點并不難。

    我們?yōu)樯线叺挠嬎闫鳎瑪U展兩個應(yīng)用:計算最大值和最小值,他們分別是兩接口和對應(yīng)的實現(xiàn)類“MaxCalculator”(Impl)和“MinCalculator”(Impl)

    使用注解的方式實現(xiàn)引入通知,在ArithmeticCalculatorAspect.java中添加

    @DeclareParents(value="cn.itcast.cc.spring.aspectj.ArithmeticCalculator*",

    defaultImpl=MinCalculatorImpl.class)

    public MinCalculator minCalculator;

    @DeclareParents(value="cn.itcast.cc.spring.aspectj.ArithmeticCalculator*", defaultImpl=MaxCalculatorImpl.class)

    public MaxCalculator maxCalculator;

    使用XML文件實現(xiàn)引入通知:

    <aop:declare-parents types-matching="cn.itcast.cc.spring.xml.ArithmeticCalculator*" 

    implement-interface="cn.itcast.cc.spring.xml.MaxCalculator"

    default-impl="cn.itcast.cc.spring.xml.MaxCalculatorImpl"/>

    <aop:declare-parents types-matching="cn.itcast.cc.spring.xml.ArithmeticCalculator*" 

    implement-interface="cn.itcast.cc.spring.xml.MinCalculator"

    default-impl="cn.itcast.cc.spring.xml.MinCalculatorImpl"/>

    引入通知的使用:

    ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-xml.xml");

    Object obj = ctx.getBean("calc");

    ArithmeticCalculator arithmeticCalculator = (ArithmeticCalculator) obj;

    // 可以轉(zhuǎn)換

    MinCalculator minCalculator = (MinCalculator) obj;

    // 可以轉(zhuǎn)換

    MaxCalculator maxCalculator = (MaxCalculator) obj;

     

    二、Spring-JDBC

    JDBC中Spring中似乎比較常用,但使用起來非常簡單。

    1.引入數(shù)據(jù)源

    昨天介紹的使用外部Bean正是引入C3P0數(shù)據(jù)源的方法,在此我們就不重復(fù)了。

    2.使用方式

    我們使用spirng為我們提供的一個CURD操作類——JdbcTemplate,在xml配置文件中添加一個Bean:

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

    <property name="dataSource" ref="dataSource"/>

    </bean>

    在程序中使用:

    package cn.itcast.cc.spring.jdbc;

    import org.junit.Test;

    import org.springframework.context.ApplicationContext;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import org.springframework.jdbc.core.JdbcTemplate;

    public class JdbcTest {

    private ApplicationContext ac = new ClassPathXmlApplicationContext(

    "beans.xml");

    private JdbcTemplate jdbcTemplate = (JdbcTemplate) ac

    .getBean("jdbcTemplate");

    @Test

    public void testInsert() {

    String sql = "insert into customers(customer_name,home_address,mobile_phone) VALUES (?,?,?)";

    Object[] args = { "changcheng", "DaLian", "1398639955" };

    this.jdbcTemplate.update(sql, args);

    }

    }

    在此我只列出了insert的方法,其他方法可以查看Spring手冊,十分簡單。

    Spring還為我們提供了一個更簡單的CURD類——SimpleJdbcTemplate,它使用起來比JdbcTemplate簡單些,在此也不多做介紹了。

    整體上內(nèi)容比較簡單,目前還沒有將Spring實際應(yīng)用到項目中。明天是Spring的最后一天,接下來就是佟佟的教育辦公管理系統(tǒng)。我想會使用到Spring的,這個項目很重要,一定要搞好!


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久夜色精品国产亚洲av| 亚洲第一精品福利| 亚洲一区爱区精品无码| 国产精品久久亚洲不卡动漫| 少妇亚洲免费精品| 无码精品A∨在线观看免费| 国产av无码专区亚洲av果冻传媒| 午夜亚洲国产精品福利| 成年女人喷潮毛片免费播放| 久久久无码精品亚洲日韩京东传媒| 美女视频黄a视频全免费网站一区 美女视频黄a视频全免费网站色 | A在线观看免费网站大全| 久久99国产亚洲高清观看首页| 鲁啊鲁在线视频免费播放| 国产成人亚洲综合无码精品| 毛片a级毛片免费播放100| caoporn国产精品免费| 亚洲国模精品一区| 黄色一级毛片免费| 亚洲妇女水蜜桃av网网站| 国产成人精品免费视| 日木av无码专区亚洲av毛片| 91青青国产在线观看免费| 亚洲国产精品自在在线观看| 久久精品成人免费观看| 色噜噜AV亚洲色一区二区| 无限动漫网在线观看免费 | 免费观看成人毛片a片2008| 亚洲国产日产无码精品| 我们的2018在线观看免费高清| 一级毛片无遮挡免费全部| 国产91精品一区二区麻豆亚洲| 在线观看免费视频一区| 亚洲人成伊人成综合网久久久| 午夜爱爱免费视频| 精品在线免费视频| 久久精品国产亚洲AV忘忧草18| 午夜成年女人毛片免费观看| 亚洲国产精品日韩在线观看| 亚洲午夜国产精品无码老牛影视| 国产在线ts人妖免费视频|