国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring【AOP模塊】就是這么簡(jiǎn)單

whjin / 1335人閱讀

摘要:可以通過切入點(diǎn)表達(dá)式,指定攔截哪些類的哪些方法給指定的類在運(yùn)行的時(shí)候植入切面類代碼。

前言

到目前為止,已經(jīng)簡(jiǎn)單學(xué)習(xí)了Spring的Core模塊、....于是我們就開啟了Spring的AOP模塊了...在講解AOP模塊之前,首先我們來講解一下cglib代理、以及怎么手動(dòng)實(shí)現(xiàn)AOP編程

cglib代理

在講解cglib之前,首先我們來回顧一下靜態(tài)代理和動(dòng)態(tài)代理....我之前就寫過了靜態(tài)代理、動(dòng)態(tài)代理的博文:http://blog.csdn.net/hon_3y/article/details/70655966

由于靜態(tài)代理需要實(shí)現(xiàn)目標(biāo)對(duì)象的相同接口,那么可能會(huì)導(dǎo)致代理類會(huì)非常非常多....不好維護(hù)---->因此出現(xiàn)了動(dòng)態(tài)代理

動(dòng)態(tài)代理也有個(gè)約束:目標(biāo)對(duì)象一定是要有接口的,沒有接口就不能實(shí)現(xiàn)動(dòng)態(tài)代理.....----->因此出現(xiàn)了cglib代理

cglib代理也叫子類代理,從內(nèi)存中構(gòu)建出一個(gè)子類來擴(kuò)展目標(biāo)對(duì)象的功能!

CGLIB是一個(gè)強(qiáng)大的高性能的代碼生成包,它可以在運(yùn)行期擴(kuò)展Java類與實(shí)現(xiàn)Java接口。它廣泛的被許多AOP的框架使用,例如Spring AOP和dynaop,為他們提供方法的interception(攔截)。

編寫cglib代理

接下來我們就講講怎么寫cglib代理:

需要引入cglib – jar文件, 但是spring的核心包中已經(jīng)包括了cglib功能,所以直接引入spring-core-3.2.5.jar即可。

引入功能包后,就可以在內(nèi)存中動(dòng)態(tài)構(gòu)建子類

代理的類不能為final,否則報(bào)錯(cuò)【在內(nèi)存中構(gòu)建子類來做擴(kuò)展,當(dāng)然不能為final,有final就不能繼承了】

目標(biāo)對(duì)象的方法如果為final/static, 那么就不會(huì)被攔截,即不會(huì)執(zhí)行目標(biāo)對(duì)象額外的業(yè)務(wù)方法。

//需要實(shí)現(xiàn)MethodInterceptor接口
public class ProxyFactory implements MethodInterceptor{
    
    // 維護(hù)目標(biāo)對(duì)象
    private Object target;
    public ProxyFactory(Object target){
        this.target = target;
    }
    
    // 給目標(biāo)對(duì)象創(chuàng)建代理對(duì)象
    public Object getProxyInstance(){
        //1. 工具類
        Enhancer en = new Enhancer();
        //2. 設(shè)置父類
        en.setSuperclass(target.getClass());
        //3. 設(shè)置回調(diào)函數(shù)
        en.setCallback(this);
        //4. 創(chuàng)建子類(代理對(duì)象)
        return en.create();
    }
    

    @Override
    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        
        System.out.println("開始事務(wù).....");
        
        // 執(zhí)行目標(biāo)對(duì)象的方法
        Object returnValue = method.invoke(target, args);
        
        System.out.println("提交事務(wù).....");
        
        return returnValue;
    }

}

測(cè)試:

public class App {

    public static void main(String[] args) {

        UserDao userDao = new UserDao();

        UserDao factory = (UserDao) new ProxyFactory(userDao).getProxyInstance();

        factory.save();
    }
}

使用cglib就是為了彌補(bǔ)動(dòng)態(tài)代理的不足【動(dòng)態(tài)代理的目標(biāo)對(duì)象一定要實(shí)現(xiàn)接口】

手動(dòng)實(shí)現(xiàn)AOP編程

AOP 面向切面的編程:

AOP可以實(shí)現(xiàn)“業(yè)務(wù)代碼”與“關(guān)注點(diǎn)代碼”分離

下面我們來看一段代碼:

// 保存一個(gè)用戶
public void add(User user) { 
        Session session = null; 
        Transaction trans = null; 
        try { 
            session = HibernateSessionFactoryUtils.getSession();   // 【關(guān)注點(diǎn)代碼】
            trans = session.beginTransaction();    // 【關(guān)注點(diǎn)代碼】
             
            session.save(user);     // 核心業(yè)務(wù)代碼
             
            trans.commit();     //…【關(guān)注點(diǎn)代碼】

        } catch (Exception e) {     
            e.printStackTrace(); 
            if(trans != null){ 
                trans.rollback();   //..【關(guān)注點(diǎn)代碼】

            } 
        } finally{ 
            HibernateSessionFactoryUtils.closeSession(session);   ////..【關(guān)注點(diǎn)代碼】

        } 
   } 

關(guān)注點(diǎn)代碼,就是指重復(fù)執(zhí)行的代碼。

業(yè)務(wù)代碼與關(guān)注點(diǎn)代碼分離,好處?

關(guān)注點(diǎn)代碼寫一次即可

開發(fā)者只需要關(guān)注核心業(yè)務(wù)

運(yùn)行時(shí)期,執(zhí)行核心業(yè)務(wù)代碼時(shí)候動(dòng)態(tài)植入關(guān)注點(diǎn)代碼; 【代理】

案例分析:

IUser接口

public interface IUser {

    void save();
}

我們一步一步來分析,首先我們的UserDao有一個(gè)save()方法,每次都要開啟事務(wù)和關(guān)閉事務(wù)

//@Component  -->任何地方都能用這個(gè)
@Repository  //-->這個(gè)在Dao層中使用
    public class UserDao {

    public void save() {

        System.out.println("開始事務(wù)");
        System.out.println("DB:保存用戶");
        System.out.println("關(guān)閉事務(wù)");

    }


}

在剛學(xué)習(xí)java基礎(chǔ)的時(shí)候,我們知道:如果某些功能經(jīng)常需要用到就封裝成方法:

//@Component  -->任何地方都能用這個(gè)
@Repository  //-->這個(gè)在Dao層中使用
    public class UserDao {

    public void save() {

        begin();
        System.out.println("DB:保存用戶");
        close();
        
    }

    public void begin() {
        System.out.println("開始事務(wù)");
    }
    public void close() {
        System.out.println("關(guān)閉事務(wù)");
    }
}

現(xiàn)在呢,我們可能有多個(gè)Dao,都需要有開啟事務(wù)和關(guān)閉事務(wù)的功能,現(xiàn)在只有UserDao中有這兩個(gè)方法,重用性還是不夠高。因此我們抽取出一個(gè)類出來

public class AOP {
    
    public void begin() {
        System.out.println("開始事務(wù)");
    }
    public void close() {
        System.out.println("關(guān)閉事務(wù)");
    }
}

在UserDao維護(hù)這個(gè)變量,要用的時(shí)候,調(diào)用方法就行了

@Repository  //-->這個(gè)在Dao層中使用
public class UserDao {


    AOP aop;

    public void save() {

        aop.begin();
        System.out.println("DB:保存用戶");
        aop.close();

    }
    
}

現(xiàn)在的開啟事務(wù)、關(guān)閉事務(wù)還是需要我在userDao中手動(dòng)調(diào)用。還是不夠優(yōu)雅。。我想要的效果:當(dāng)我在調(diào)用userDao的save()方法時(shí),動(dòng)態(tài)地開啟事務(wù)、關(guān)閉事務(wù)。因此,我們就用到了代理。當(dāng)然了,真正執(zhí)行方法的都是userDao、要干事的是AOP,因此在代理中需要維護(hù)他們的引用

public class ProxyFactory {
    //維護(hù)目標(biāo)對(duì)象
    private static Object target;

    //維護(hù)關(guān)鍵點(diǎn)代碼的類
    private static AOP aop;
    public static Object getProxyInstance(Object target_, AOP aop_) {

        //目標(biāo)對(duì)象和關(guān)鍵點(diǎn)代碼的類都是通過外界傳遞進(jìn)來
        target = target_;
        aop = aop_;

        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                        aop.begin();
                        Object returnValue = method.invoke(target, args);
                        aop.close();

                        return returnValue;
                    }
                }
        );
    }
}


工廠靜態(tài)方法:

把AOP加入IOC容器中



//把該對(duì)象加入到容器中
@Component
public class AOP {

    public void begin() {
        System.out.println("開始事務(wù)");
    }
    public void close() {
        System.out.println("關(guān)閉事務(wù)");
    }
}

把UserDao放入容器中

@Component
public class UserDao {

    public void save() {

        System.out.println("DB:保存用戶");

    }

}

在配置文件中開啟注解掃描,使用工廠靜態(tài)方法創(chuàng)建代理對(duì)象





    
        
        
    

    





測(cè)試,得到UserDao對(duì)象,調(diào)用方法

public class App {

    public static void main(String[] args) {

        ApplicationContext ac =
                new ClassPathXmlApplicationContext("aa/applicationContext.xml");


        IUser iUser = (IUser) ac.getBean("proxy");

        iUser.save();



    }
}

工廠非靜態(tài)方法

上面使用的是工廠靜態(tài)方法來創(chuàng)建代理類對(duì)象。我們也使用一下非靜態(tài)的工廠方法創(chuàng)建對(duì)象

package aa;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by ozc on 2017/5/11.
 */

public class ProxyFactory {

    public Object getProxyInstance(final Object target_, final AOP aop_) {

        //目標(biāo)對(duì)象和關(guān)鍵點(diǎn)代碼的類都是通過外界傳遞進(jìn)來

        return Proxy.newProxyInstance(
                target_.getClass().getClassLoader(),
                target_.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                        aop_.begin();
                        Object returnValue = method.invoke(target_, args);
                        aop_.close();

                        return returnValue;
                    }
                }
        );
    }
}

配置文件:先創(chuàng)建工廠,再創(chuàng)建代理類對(duì)象






    
    


    
    
        
        
    


    


AOP的概述

Aop: aspect object programming 面向切面編程

功能: 讓關(guān)注點(diǎn)代碼與業(yè)務(wù)代碼分離!

面向切面編程就是指: 對(duì)很多功能都有的重復(fù)的代碼抽取,再在運(yùn)行的時(shí)候往業(yè)務(wù)方法上動(dòng)態(tài)植入“切面類代碼”。

關(guān)注點(diǎn):

重復(fù)代碼就叫做關(guān)注點(diǎn)。

// 保存一個(gè)用戶
public void add(User user) { 
        Session session = null; 
        Transaction trans = null; 
        try { 
            session = HibernateSessionFactoryUtils.getSession();   // 【關(guān)注點(diǎn)代碼】
            trans = session.beginTransaction();    // 【關(guān)注點(diǎn)代碼】
             
            session.save(user);     // 核心業(yè)務(wù)代碼
             
            trans.commit();     //…【關(guān)注點(diǎn)代碼】

        } catch (Exception e) {     
            e.printStackTrace(); 
            if(trans != null){ 
                trans.rollback();   //..【關(guān)注點(diǎn)代碼】

            } 
        } finally{ 
            HibernateSessionFactoryUtils.closeSession(session);   ////..【關(guān)注點(diǎn)代碼】

        } 
   } 

切面:

關(guān)注點(diǎn)形成的類,就叫切面(類)!

public class AOP {

    public void begin() {
        System.out.println("開始事務(wù)");
    }
    public void close() {
        System.out.println("關(guān)閉事務(wù)");
    }
}

切入點(diǎn):

執(zhí)行目標(biāo)對(duì)象方法,動(dòng)態(tài)植入切面代碼。

可以通過切入點(diǎn)表達(dá)式指定攔截哪些類的哪些方法; 給指定的類在運(yùn)行的時(shí)候植入切面類代碼

切入點(diǎn)表達(dá)式:

指定哪些類的哪些方法被攔截

使用Spring AOP開發(fā)步驟

1) 先引入aop相關(guān)jar文件 (aspectj aop優(yōu)秀組件)

spring-aop-3.2.5.RELEASE.jar 【spring3.2源碼】

aopalliance.jar 【spring2.5源碼/lib/aopalliance】

aspectjweaver.jar 【spring2.5源碼/lib/aspectj】或【aspectj-1.8.2lib】

aspectjrt.jar 【spring2.5源碼/lib/aspectj】或【aspectj-1.8.2lib】

注意: 用到spring2.5版本的jar文件,如果用jdk1.7可能會(huì)有問題

需要升級(jí)aspectj組件,即使用aspectj-1.8.2版本中提供jar文件提供。

2) bean.xml中引入aop名稱空間

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

http://www.springframework.org/schema/context

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

引入jar包

引入4個(gè)jar包:

引入名稱空間


    
注解方式實(shí)現(xiàn)AOP編程

我們之前手動(dòng)的實(shí)現(xiàn)AOP編程是需要自己來編寫代理工廠的,現(xiàn)在有了Spring,就不需要我們自己寫代理工廠了。Spring內(nèi)部會(huì)幫我們創(chuàng)建代理工廠

也就是說,不用我們自己寫代理對(duì)象了。

因此,我們只要關(guān)心切面類、切入點(diǎn)、編寫切入表達(dá)式指定攔截什么方法就可以了!

還是以上一個(gè)例子為案例,使用Spring的注解方式來實(shí)現(xiàn)AOP編程

在配置文件中開啟AOP注解方式




    

    
    

代碼:

切面類

@Component
@Aspect//指定為切面類
public class AOP {


    //里面的值為切入點(diǎn)表達(dá)式
    @Before("execution(* aa.*.*(..))")
    public void begin() {
        System.out.println("開始事務(wù)");
    }


    @After("execution(* aa.*.*(..))")
    public void close() {
        System.out.println("關(guān)閉事務(wù)");
    }
}

UserDao實(shí)現(xiàn)了IUser接口

@Component
public class UserDao implements IUser {

    @Override
    public void save() {
        System.out.println("DB:保存用戶");
    }

}

IUser接口

public interface IUser {
    void save();
}

測(cè)試代碼:

public class App {

    public static void main(String[] args) {

        ApplicationContext ac =
                new ClassPathXmlApplicationContext("aa/applicationContext.xml");

        //這里得到的是代理對(duì)象....
        IUser iUser = (IUser) ac.getBean("userDao");

        System.out.println(iUser.getClass());

        iUser.save();
        
    }
}

目標(biāo)對(duì)象沒有接口

上面我們測(cè)試的是UserDao有IUser接口,內(nèi)部使用的是動(dòng)態(tài)代理...那么我們這次測(cè)試的是目標(biāo)對(duì)象沒有接口

OrderDao沒有實(shí)現(xiàn)接口

@Component
public class OrderDao {

    public void save() {

        System.out.println("我已經(jīng)進(jìn)貨了!!!");
        
    }
}

測(cè)試代碼:


public class App {

    public static void main(String[] args) {

        ApplicationContext ac =
                new ClassPathXmlApplicationContext("aa/applicationContext.xml");

        OrderDao orderDao = (OrderDao) ac.getBean("orderDao");

        System.out.println(orderDao.getClass());

        orderDao.save();

    }
}

優(yōu)化和AOP注解API API:

@Aspect 指定一個(gè)類為切面類

@Pointcut("execution( cn.itcast.e_aop_anno..*(..))") 指定切入點(diǎn)表達(dá)式

@Before("pointCut_()") 前置通知: 目標(biāo)方法之前執(zhí)行

@After("pointCut_()") 后置通知:目標(biāo)方法之后執(zhí)行(始終執(zhí)行)

@AfterReturning("pointCut_()") 返回后通知: 執(zhí)行方法結(jié)束前執(zhí)行(異常不執(zhí)行)

@AfterThrowing("pointCut_()") 異常通知: 出現(xiàn)異常時(shí)候執(zhí)行

@Around("pointCut_()") 環(huán)繞通知: 環(huán)繞目標(biāo)方法執(zhí)行

測(cè)試:

    
    // 前置通知 : 在執(zhí)行目標(biāo)方法之前執(zhí)行
    @Before("pointCut_()")
    public void begin(){
        System.out.println("開始事務(wù)/異常");
    }
    
    // 后置/最終通知:在執(zhí)行目標(biāo)方法之后執(zhí)行  【無論是否出現(xiàn)異常最終都會(huì)執(zhí)行】
    @After("pointCut_()")
    public void after(){
        System.out.println("提交事務(wù)/關(guān)閉");
    }
    
    // 返回后通知: 在調(diào)用目標(biāo)方法結(jié)束后執(zhí)行 【出現(xiàn)異常不執(zhí)行】
    @AfterReturning("pointCut_()")
    public void afterReturning() {
        System.out.println("afterReturning()");
    }
    
    // 異常通知: 當(dāng)目標(biāo)方法執(zhí)行異常時(shí)候執(zhí)行此關(guān)注點(diǎn)代碼
    @AfterThrowing("pointCut_()")
    public void afterThrowing(){
        System.out.println("afterThrowing()");
    }
    
    // 環(huán)繞通知:環(huán)繞目標(biāo)方式執(zhí)行
    @Around("pointCut_()")
    public void around(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("環(huán)繞前....");
        pjp.proceed();  // 執(zhí)行目標(biāo)方法
        System.out.println("環(huán)繞后....");
    }
優(yōu)化

我們的代碼是這樣的:每次寫B(tài)efore、After等,都要重寫一次切入點(diǎn)表達(dá)式,這樣就不優(yōu)雅了。

    @Before("execution(* aa.*.*(..))")
    public void begin() {
        System.out.println("開始事務(wù)");
    }


    @After("execution(* aa.*.*(..))")
    public void close() {
        System.out.println("關(guān)閉事務(wù)");
    }

于是乎,我們要使用@Pointcut這個(gè)注解,來指定切入點(diǎn)表達(dá)式,在用到的地方中,直接引用就行了!

那么我們的代碼就可以改造成這樣了:

@Component
@Aspect//指定為切面類
public class AOP {


    // 指定切入點(diǎn)表達(dá)式,攔截哪個(gè)類的哪些方法
    @Pointcut("execution(* aa.*.*(..))")
    public void pt() {

    }

    @Before("pt()")
    public void begin() {
        System.out.println("開始事務(wù)");
    }


    @After("pt()")
    public void close() {
        System.out.println("關(guān)閉事務(wù)");
    }
}

XML方式實(shí)現(xiàn)AOP編程

首先,我們把所有的注解都去掉...

XML文件配置





    
    
    

    
    

    
    

        
        

        
        

            
            
            

        
    

    

測(cè)試:

public class App {

    @Test
    public  void test1() {

        ApplicationContext ac =
                new ClassPathXmlApplicationContext("aa/applicationContext.xml");

        OrderDao orderDao = (OrderDao) ac.getBean("orderDao");

        System.out.println(orderDao.getClass());

        orderDao.save();

    }

    @Test
    public  void test2() {

        ApplicationContext ac =
                new ClassPathXmlApplicationContext("aa/applicationContext.xml");

        IUser userDao = (IUser) ac.getBean("userDao");

        System.out.println(userDao.getClass());

        userDao.save();

    }
}

測(cè)試OrderDao

測(cè)試UserDao

切入點(diǎn)表達(dá)式

切入點(diǎn)表達(dá)式主要就是來配置攔截哪些類的哪些方法

查官方文檔

..我們?nèi)ノ臋n中找找它的語法...

在文檔中搜索:execution(

語法解析

那么它的語法是這樣子的:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

符號(hào)講解:

?號(hào)代表0或1,可以不寫

“*”號(hào)代表任意類型,0或多

方法參數(shù)為..表示為可變參數(shù)

參數(shù)講解:

modifiers-pattern?【修飾的類型,可以不寫】

ret-type-pattern【方法返回值類型,必寫】

declaring-type-pattern?【方法聲明的類型,可以不寫】

name-pattern(param-pattern)【要匹配的名稱,括號(hào)里面是方法的參數(shù)】

throws-pattern?【方法拋出的異常類型,可以不寫】

官方也有給出一些例子給我們理解:

測(cè)試代碼
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號(hào):Java3y

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68787.html

相關(guān)文章

  • Spring AOP就是這么簡(jiǎn)單

    摘要:是一種特殊的增強(qiáng)切面切面由切點(diǎn)和增強(qiáng)通知組成,它既包括了橫切邏輯的定義也包括了連接點(diǎn)的定義。實(shí)際上,一個(gè)的實(shí)現(xiàn)被拆分到多個(gè)類中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因?yàn)槲覀円? 前言 只有光頭才能變強(qiáng) 上一篇已經(jīng)講解了Spring IOC知識(shí)點(diǎn)一網(wǎng)打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經(jīng)寫過一篇關(guān)于AOP的文章了,那篇把比較重要的知...

    Jacendfeng 評(píng)論0 收藏0
  • Spring還可以這么學(xué)--AOP

    摘要:還可以這么學(xué)上一篇文章還可以這么學(xué)控制反轉(zhuǎn)依賴注入理解什么是,即面向切面編程,可以說是,面向?qū)ο缶幊痰难a(bǔ)充和完善。 Spring還可以這么學(xué)--AOP 上一篇文章Spring還可以這么學(xué)--IoC(控制反轉(zhuǎn)) / DI(依賴注入)理解 1. 什么是AOP? AOP(Aspect Oriented Programming),即面向切面編程,可以說是OOP(Object Oriented ...

    chinafgj 評(píng)論0 收藏0
  • Spring框架之我見(三)——IOC、AOP

    摘要:模塊負(fù)責(zé)的所有面向切面的功能。總結(jié)的統(tǒng)一管理,降低了對(duì)象之間的耦合對(duì)主流的框架提供了很好的集成支持提供眾多組件,事務(wù)管理,等具有高度可開放性,開發(fā)者可以自由選擇部分或全部主要使用工廠模式和代理模式。 聊完了Spring框架中最重要的兩種設(shè)計(jì)模式,我們來看一下Spring框架的模塊和結(jié)構(gòu)圖。 Spring框架的結(jié)構(gòu) 下圖是Spring官方給出的Spring框架的結(jié)構(gòu)圖。 showImg(...

    khs1994 評(píng)論0 收藏0
  • Spring AOP 源碼分析系列文章導(dǎo)讀

    摘要:在寫完容器源碼分析系列文章中的最后一篇后,沒敢懈怠,趁熱打鐵,花了天時(shí)間閱讀了方面的源碼。從今天開始,我將對(duì)部分的源碼分析系列文章進(jìn)行更新。全稱是,即面向切面的編程,是一種開發(fā)理念。在中,切面只是一個(gè)概念,并沒有一個(gè)具體的接口或類與此對(duì)應(yīng)。 1. 簡(jiǎn)介 前一段時(shí)間,我學(xué)習(xí)了 Spring IOC 容器方面的源碼,并寫了數(shù)篇文章對(duì)此進(jìn)行講解。在寫完 Spring IOC 容器源碼分析系列...

    張春雷 評(píng)論0 收藏0
  • Spring【DAO模塊就是這么簡(jiǎn)單

    摘要:連接對(duì)象執(zhí)行命令對(duì)象執(zhí)行關(guān)閉值得注意的是,對(duì)數(shù)據(jù)庫連接池是有很好的支持的。給我們提供了事務(wù)的管理器類,事務(wù)管理器類又分為兩種,因?yàn)榈氖聞?wù)和的事務(wù)是不一樣的。 前言 上一篇Spring博文主要講解了如何使用Spring來實(shí)現(xiàn)AOP編程,本博文主要講解Spring的DAO模塊對(duì)JDBC的支持,以及Spring對(duì)事務(wù)的控制... 對(duì)于JDBC而言,我們肯定不會(huì)陌生,我們?cè)诔鯇W(xué)的時(shí)候肯定寫過非...

    NSFish 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<