国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一文吃透 Spring 中的 AOP 編程

這篇具有很好參考價(jià)值的文章主要介紹了一文吃透 Spring 中的 AOP 編程。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

spring動(dòng)態(tài)注入aop,SSM 框架從入門到精通,spring,java,mybatis

?作者簡(jiǎn)介:2022年博客新星 第八。熱愛(ài)國(guó)學(xué)的Java后端開(kāi)發(fā)者,修心和技術(shù)同步精進(jìn)。
??個(gè)人主頁(yè):Java Fans的博客
??個(gè)人信條:不遷怒,不貳過(guò)。小知識(shí),大智慧。
??當(dāng)前專欄:SSM 框架從入門到精通
?特色專欄:國(guó)學(xué)周更-心性養(yǎng)成之路
??本文內(nèi)容:一文吃透 Spring 中的 AOP 編程


spring動(dòng)態(tài)注入aop,SSM 框架從入門到精通,spring,java,mybatis

AOP 概述

AOPAspect Oriented Programming 的縮寫,是面向切面編程,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOPOOP 的延續(xù),是軟件開(kāi)發(fā)中的一個(gè)熱點(diǎn),也是 Spring 框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型

AOP 可以分離業(yè)務(wù)代碼和關(guān)注點(diǎn)代碼(重復(fù)代碼),在執(zhí)行業(yè)務(wù)代碼時(shí),動(dòng)態(tài)的注入關(guān)注點(diǎn)代碼。切面就是關(guān)注點(diǎn)代碼形成的類。Spring AOP 中的動(dòng)態(tài)代理主要有兩種方式,JDK 動(dòng)態(tài)代理和 CGLIB 動(dòng)態(tài)代理。JDK 動(dòng)態(tài)代理通過(guò)反射來(lái)接收被代理的類,并且要求被代理的類必須實(shí)現(xiàn)一個(gè)接口

spring動(dòng)態(tài)注入aop,SSM 框架從入門到精通,spring,java,mybatis

AOP 實(shí)現(xiàn)分類

AOP 要達(dá)到的效果是,保證開(kāi)發(fā)者不修改源代碼的前提下,去為系統(tǒng)中的業(yè)務(wù)組件添加某種通用功能,按照 AOP 框架修改源代碼的時(shí)機(jī),可以將其分為兩類:

  • 靜態(tài) AOP 實(shí)現(xiàn), AOP 框架在編譯階段對(duì)程序源代碼進(jìn)行修改,生成了靜態(tài)的 AOP 代理類(生成的 *.class 文件已經(jīng)被改掉了,需要使用特定的編譯器),比如 AspectJ。
  • 動(dòng)態(tài) AOP 實(shí)現(xiàn), AOP 框架在運(yùn)行階段對(duì)動(dòng)態(tài)生成代理對(duì)象(在內(nèi)存中以 JDK 動(dòng)態(tài)代理,或 CGlib 動(dòng)態(tài)地生成 AOP 代理類),如 SpringAOP

AOP 術(shù)語(yǔ)

  • 連接點(diǎn)(JointPoint)與切入點(diǎn)匹配的執(zhí)行點(diǎn),在程序整個(gè)執(zhí)行流程中,可以織入切面的位置,方法的執(zhí)行前后,異常拋出的位置

  • 切點(diǎn)(PointCut)在程序執(zhí)行流程中,真正織入切面的方法。

  • 切面(ASPECT)切點(diǎn)+通知就是切面

  • 通知(Advice)切面必須要完成的工作,也叫增強(qiáng)。即,它是類中的一個(gè)方法,方法中編寫織入的代碼。
    前置通知 后置通知
    環(huán)繞通知 異常通知
    最終通知

  • 目標(biāo)對(duì)象(Target)被織入通知的對(duì)象

  • 代理對(duì)象(Proxy)目標(biāo)對(duì)象被織入通知之后創(chuàng)建的新對(duì)象

通知的類型

Spring 方面可以使用下面提到的五種通知工作:

通知 描述
前置通知 在一個(gè)方法執(zhí)行之前,執(zhí)行通知。
最終通知 在一個(gè)方法執(zhí)行之后,不考慮其結(jié)果,執(zhí)行通知。
后置通知 在一個(gè)方法執(zhí)行之后,只有在方法成功完成時(shí),才能執(zhí)行通知。
異常通知 在一個(gè)方法執(zhí)行之后,只有在方法退出拋出異常時(shí),才能執(zhí)行通知。
環(huán)繞通知 在一個(gè)方法調(diào)用之前和之后,執(zhí)行通知。

基于 Aspectj 實(shí)現(xiàn) AOP 操作

基于 Aspectj 實(shí)現(xiàn) AOP 操作,經(jīng)歷了下面三個(gè)版本的變化,注解版是我們最常用的。

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

作用:聲明對(duì)哪個(gè)類中的哪個(gè)方法進(jìn)行增強(qiáng)

語(yǔ)法:

execution([訪問(wèn)權(quán)限修飾符] 返回值 [ 類的全路徑名 ] 方法名 (參數(shù)列表)[異常])

  • 訪問(wèn)權(quán)限修飾符:

    可選項(xiàng),不寫就是四個(gè)權(quán)限都包含

    寫public就表示只包括公開(kāi)的方法

  • 返回值類型

    必填項(xiàng) * 標(biāo)識(shí)返回值任意

  • 全限定類名

    可選項(xiàng),兩個(gè)點(diǎn) … 表示當(dāng)前包以及子包下的所有類,省略表示所有類

  • 方法名

    必填項(xiàng) * 表示所有的方法 set*表示所有的set方法

  • 形參列表

    必填項(xiàng)

    ()表示沒(méi)有參數(shù)的方法

    (…)參數(shù)類型和參數(shù)個(gè)數(shù)隨意的方法

    (*)只有一個(gè)參數(shù)的方法

    (*,String) 第一個(gè)參數(shù)類型隨意,第二個(gè)參數(shù)String類型

  • 異常信息

    可選項(xiàng) 省略時(shí)標(biāo)識(shí)任何異常信息

spring動(dòng)態(tài)注入aop,SSM 框架從入門到精通,spring,java,mybatis

第一版:基于xml(aop:config)配置文件

使用 Spring AOP 接口方式實(shí)現(xiàn) AOP, 可以通過(guò)自定義通知來(lái)供 Spring AOP 識(shí)別對(duì)應(yīng)實(shí)現(xiàn)的接口是:

  1. 前置通知:MethodBeforeAdvice
  2. 返回通知:AfterReturningAdvice
  3. 異常通知:ThrowsAdvice
  4. 環(huán)繞通知:MethodInterceptor

實(shí)現(xiàn)步驟:

1、定義業(yè)務(wù)接口

/**
 * 使用接口方式實(shí)現(xiàn)AOP, 默認(rèn)通過(guò)JDK的動(dòng)態(tài)代理來(lái)實(shí)現(xiàn). 非接口方式, 使用的是cglib實(shí)現(xiàn)動(dòng)態(tài)代理
 */

package cn.kgc.spring05.entity;

public interface Teacher {
    String teachOnLine(String course);
    String teachOffLine(Integer course);
}

2、定義實(shí)現(xiàn)類

package cn.kgc.spring05.entity;

public class TeacherA implements Teacher{
    @Override
    public String teachOnLine(String course) {
        System.out.println("TeacherA開(kāi)始"+course+"課程線上教學(xué)");
        if(course.equals("java")){
            throw new RuntimeException("入門到放棄!");
        }
        return course+"課程線上教學(xué)";
    }

    @Override
    public String teachOffLine(Integer course) {
        System.out.println("TeacherA開(kāi)始"+course+"課程線下教學(xué)");
        return course+"課程線下教學(xué)";
    }
}

3、實(shí)現(xiàn)接口定義通知類

前置通知類

package cn.kgc.spring05.advice;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

//前置通知
public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("------------spring aop 前置通知------------");
    }
}

后置通知類

package cn.kgc.spring05.advice;

import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;

public class MyAfterReturnAdvice implements AfterReturningAdvice {
    @Override
    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
        System.out.println("------------spring aop 后置通知------------");
    }
}

4、XML 配置方式

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--托管通知-->
    <bean id="after" class="cn.kgc.spring05.advice.MyAfterReturnAdvice"></bean>
    <bean id="before" class="cn.kgc.spring05.advice.MyMethodBeforeAdvice"></bean>
    <bean id="teacherA" class="cn.kgc.spring05.entity.TeacherA"></bean>
    <!--AOP的配置-->
    <aop:config>
        <!--切點(diǎn)表達(dá)式-->
        <aop:pointcut id="pt" expression="execution(* *(..))"/>
        <aop:advisor advice-ref="before" pointcut-ref="pt"></aop:advisor>
        <aop:advisor advice-ref="after" pointcut-ref="pt"></aop:advisor>
    </aop:config>
</beans>

5、測(cè)試

package cn.kgc.spring05;

import cn.kgc.spring05.entity.Teacher;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * Unit test for simple App.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-config.xml")
public class AppTest
{
    @Autowired
    Teacher teacher;

    @Test
    public void teachOnLine() {
        System.out.println(teacher.getClass());
        String s = teacher.teachOnLine("java");
        System.out.println("s = " + s);
    }
}

6、運(yùn)行結(jié)果

spring動(dòng)態(tài)注入aop,SSM 框架從入門到精通,spring,java,mybatis

第二版:基于xml(aop:aspect)配置文件

基于 xml(aop:config) 配置文件的方式,增加幾個(gè)通知,就會(huì)創(chuàng)建幾個(gè)通知類,那我們能否將這些通知類寫在一個(gè)類中呢?下面就讓我來(lái)帶你們找到解決之法!

配置 AspectJ 標(biāo)簽解讀表

spring動(dòng)態(tài)注入aop,SSM 框架從入門到精通,spring,java,mybatis

實(shí)現(xiàn)步驟:

1、定義業(yè)務(wù)接口

/**
 * 使用接口方式實(shí)現(xiàn)AOP, 默認(rèn)通過(guò)JDK的動(dòng)態(tài)代理來(lái)實(shí)現(xiàn). 非接口方式, 使用的是cglib實(shí)現(xiàn)動(dòng)態(tài)代理
 */

package cn.kgc.spring05.entity;

public interface Teacher {
    String teachOnLine(String course);
    String teachOffLine(Integer course);
}

2、定義實(shí)現(xiàn)類

package cn.kgc.spring05.entity;

public class TeacherA implements Teacher{
    @Override
    public String teachOnLine(String course) {
        System.out.println("TeacherA開(kāi)始"+course+"課程線上教學(xué)");
        if(course.equals("java")){
            throw new RuntimeException("入門到放棄!");
        }
        return course+"課程線上教學(xué)";
    }

    @Override
    public String teachOffLine(Integer course) {
        System.out.println("TeacherA開(kāi)始"+course+"課程線下教學(xué)");
        return course+"課程線下教學(xué)";
    }
}

3、實(shí)現(xiàn)接口定義通知類

package cn.kgc.spring05.advice;

public class AllAdvice {
    public void before(){System.out.println("------------前置通知--------------");}

    public void afterReturning(){System.out.println("------------后置通知--------------");}

    public void afterThrowing(){System.out.println("------------異常通知--------------");}

    public void after(){System.out.println("------------最終通知--------------");}

    public void around(){System.out.println("------------環(huán)繞通知--------------");}
}

4、XML 配置方式

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--托管通知-->
    <bean id="all" class="cn.kgc.spring05.advice.AllAdvice"></bean>
    <bean id="teacherA" class="cn.kgc.spring05.entity.TeacherA"></bean>
    <!--AOP的配置-->
    <aop:config>
        <!--切點(diǎn)表達(dá)式-->
        <aop:pointcut id="pt" expression="execution(* *(String))"/>
        <aop:aspect ref="all">
            <aop:before method="before" pointcut-ref="pt"></aop:before>
            <aop:after-returning method="afterReturning" pointcut-ref="pt"></aop:after-returning>
            <aop:after-throwing method="afterThrowing" pointcut-ref="pt"></aop:after-throwing>
            <aop:after method="after" pointcut-ref="pt"></aop:after>
<!--            <aop:around method="around" pointcut-ref="pt"></aop:around>-->
        </aop:aspect>
    </aop:config>
</beans>

5、測(cè)試

package cn.kgc.spring05.advice;

import cn.kgc.spring05.entity.Teacher;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-config2.xml")
public class AllAdviceTest{

    @Autowired
    Teacher teacher;

    @Test
    public void test01() {
        System.out.println(teacher.getClass());
        String s = teacher.teachOnLine("java");
        System.out.println("s = " + s);
    }
}

6、運(yùn)行結(jié)果

spring動(dòng)態(tài)注入aop,SSM 框架從入門到精通,spring,java,mybatis

第三版:基于注解實(shí)現(xiàn)通知

  • 常用 “通知” 注解如下:
    ?
    @Aspect 注解將此類定義為切面。
    @Before 注解用于將目標(biāo)方法配置為前置增強(qiáng)(前置通知)。
    @AfterReturning 注解用于將目標(biāo)方法配置為后置增強(qiáng)(后置通知)。
    @Around 定義環(huán)繞增強(qiáng)(環(huán)繞通知)
    @AfterThrowing 配置異常通知
    @After 也是后置通知,與 @AfterReturning 很相似,區(qū)別在于 @AfterReturning 在方法執(zhí)行完畢后進(jìn)行返回,可以有返回值。@After 沒(méi)有返回值。

實(shí)現(xiàn)步驟:

1、定義業(yè)務(wù)接口

/**
 * 使用接口方式實(shí)現(xiàn)AOP, 默認(rèn)通過(guò)JDK的動(dòng)態(tài)代理來(lái)實(shí)現(xiàn). 非接口方式, 使用的是cglib實(shí)現(xiàn)動(dòng)態(tài)代理
 */

package cn.kgc.spring05.entity;

public interface Teacher {
    String teachOnLine(String course);
    String teachOffLine(Integer course);
}

2、定義注解

package cn.kgc.spring05.advice;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoAdvice {
}

3、定義實(shí)現(xiàn)類

package cn.kgc.spring05.entity;

import cn.kgc.spring05.advice.AnnoAdvice;
import org.springframework.stereotype.Component;

@Component
public class TeacherA implements Teacher{
    @Override
    @AnnoAdvice
    public String teachOnLine(String course) {
        System.out.println("TeacherA開(kāi)始"+course+"課程線上教學(xué)");
        if(course.equals("java")){
            throw new RuntimeException("入門到放棄!");
        }
        return course+"課程線上教學(xué)";
    }

    @Override
    @AnnoAdvice
    public String teachOffLine(Integer course) {
        System.out.println("TeacherA開(kāi)始"+course+"課程線下教學(xué)");
        return course+"課程線下教學(xué)";
    }
}

4、實(shí)現(xiàn)接口定義切面類

首先在類上面添加 @Aspect 注解,將該類轉(zhuǎn)化為切面類,再在類中的各個(gè)方法上面使用各自的 “通知” 注解即可實(shí)現(xiàn)。

package cn.kgc.spring05.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AllAdvice {

    @Pointcut("@annotation(AnnoAdvice)")
    public void point(){}

    @Before("point()")
    public void before(){System.out.println("------------前置通知--------------");}

    @AfterReturning("point()")
    public void afterReturning(){System.out.println("------------后置通知--------------");}

    @AfterThrowing("point()")
    public void afterThrowing(){System.out.println("------------異常通知--------------");}

    @After("point()")
    public void after(){System.out.println("------------最終通知--------------");}

    @Around("point()")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint){

        Object proceed = null;
        try {
            System.out.println("----------spring aop 環(huán)繞 前通知-----------");
            proceed = joinPoint.proceed();
            System.out.println("----------spring aop 環(huán)繞 后通知-----------");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("----------spring aop 環(huán)繞 異常通知-----------");
        }finally {
            System.out.println("----------spring aop 環(huán)繞 最終通知-----------");
        }
        return proceed;
    }
}

5、XML 配置方式

開(kāi)啟包掃描和aspectj自動(dòng)代理

<?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/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--開(kāi)啟包掃描-->
    <context:component-scan base-package="cn.kgc.spring05"></context:component-scan>
    <!--開(kāi)啟aspectj自動(dòng)代理-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

6、測(cè)試

package cn.kgc.spring05.advice;

import cn.kgc.spring05.entity.Teacher;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-config3.xml")
public class AllAdviceTest{

    @Autowired
    Teacher teacher;

    @Test
    public void test01() {
        System.out.println(teacher.getClass());
        String s = teacher.teachOnLine("html");
        System.out.println("s = " + s);
    }
}

7、運(yùn)行效果

spring動(dòng)態(tài)注入aop,SSM 框架從入門到精通,spring,java,mybatis


??碼文不易,本篇文章就介紹到這里,如果想要學(xué)習(xí)更多Java系列知識(shí),點(diǎn)擊關(guān)注博主,博主帶你零基礎(chǔ)學(xué)習(xí)Java知識(shí)。與此同時(shí),對(duì)于日常生活有困擾的朋友,歡迎閱讀我的第四欄目:《國(guó)學(xué)周更—心性養(yǎng)成之路》,學(xué)習(xí)技術(shù)的同時(shí),我們也注重了心性的養(yǎng)成。

spring動(dòng)態(tài)注入aop,SSM 框架從入門到精通,spring,java,mybatis文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-789439.html

到了這里,關(guān)于一文吃透 Spring 中的 AOP 編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 一文道破將bean注入到Spring中的幾種方式

    一文道破將bean注入到Spring中的幾種方式

    前言: 前兩天有學(xué)妹問(wèn)我如何將bean注入到Spring中,雖問(wèn)題較簡(jiǎn)單,但還是寫此文以告之。 在Java的Spring框架中,將bean注入到容器中是核心概念之一,這是實(shí)現(xiàn)依賴注入的基礎(chǔ)。Spring提供了多種方式來(lái)將bean注入到容器中。 寫此文,同時(shí)也希望這篇文章能幫助到各位路過(guò)的大佬

    2024年04月15日
    瀏覽(31)
  • Spring AOP:面向切面編程在實(shí)際項(xiàng)目中的應(yīng)用

    Spring AOP:面向切面編程在實(shí)際項(xiàng)目中的應(yīng)用

    ???? 博主貓頭虎(????)帶您 Go to New World??? ?? 博客首頁(yè) ——????貓頭虎的博客?? ?? 《面試題大全專欄》 ?? 文章圖文并茂??生動(dòng)形象??簡(jiǎn)單易學(xué)!歡迎大家來(lái)踩踩~?? ?? 《IDEA開(kāi)發(fā)秘籍專欄》 ?? 學(xué)會(huì)IDEA常用操作,工作效率翻倍~?? ?? 《100天精通Golang(基礎(chǔ)

    2024年02月09日
    瀏覽(23)
  • Spring Boot 中的 AOP,到底是 JDK 動(dòng)態(tài)代理還是 Cglib 動(dòng)態(tài)代理

    Spring Boot 中的 AOP,到底是 JDK 動(dòng)態(tài)代理還是 Cglib 動(dòng)態(tài)代理

    大家都知道,AOP 底層是動(dòng)態(tài)代理,而 Java 中的動(dòng)態(tài)代理有兩種實(shí)現(xiàn)方式: 基于 JDK 的動(dòng)態(tài)代理 基于 Cglib 的動(dòng)態(tài)代理 這兩者最大的區(qū)別在于基于 JDK 的動(dòng)態(tài)代理需要被代理的對(duì)象有接口,而基于 Cglib 的動(dòng)態(tài)代理并不需要被代理對(duì)象有接口。 那么,Spring 中的 AOP 是怎么實(shí)現(xiàn)的

    2024年02月12日
    瀏覽(24)
  • 一文吃透Spring集成MyBatis

    一文吃透Spring集成MyBatis

    個(gè)人主頁(yè): 幾分醉意的CSDN博客_傳送門 spring能集成很多的框架,是spring一個(gè)優(yōu)勢(shì)功能。通過(guò)集成功能,讓開(kāi)發(fā)人員使用其他框架更方便。集成使用的是spring ioc 核心技術(shù)。 使用mybatis,需要?jiǎng)?chuàng)mybatis框架中的某些對(duì)象,使用這些對(duì)象,就能使用mybatis提供的功能了。 1.創(chuàng)建實(shí)體類

    2024年02月06日
    瀏覽(23)
  • 【Spring】一文帶你吃透IOC技術(shù)

    【Spring】一文帶你吃透IOC技術(shù)

    個(gè)人主頁(yè): 幾分醉意的CSDN博客_傳送門 loC,Inversion ofControl: 控制反轉(zhuǎn),是一個(gè)理論,一個(gè)指導(dǎo)思想。指導(dǎo)開(kāi)發(fā)人員如何使用對(duì)象,管理對(duì)象的。把對(duì)象的創(chuàng)建,屬性賦值,對(duì)象的聲明周期都交給代碼之外的容器管理。 loC分為控制和反轉(zhuǎn) ?? ● 控制: 對(duì)象創(chuàng)建,屬性賦值,對(duì)

    2023年04月08日
    瀏覽(57)
  • 【Spring】一文帶你吃透基于注解的DI技術(shù)

    【Spring】一文帶你吃透基于注解的DI技術(shù)

    個(gè)人主頁(yè): 幾分醉意的CSDN博客_傳送門 基于注解的DI:使用spring提供的注解,完成java對(duì)象創(chuàng)建,屬性賦值。 注解使用的核心步驟: 1.在源代碼加入注解,例如@Component。 2.在spring的配置文件,加入組件掃描器的標(biāo)簽。 @Component: 表示創(chuàng)建對(duì)象,對(duì)象放到容器中。 作用是 聲明組件

    2024年02月03日
    瀏覽(82)
  • 【2】Spring手寫模擬-依賴注入、初始化、AOP

    【2】Spring手寫模擬-依賴注入、初始化、AOP

    首先回顧一下我們之前的流程 ApplicationContext 構(gòu)造方法 獲取Spring配置類 @ComponetScan 注解,掃描包,獲取其路徑及其對(duì)應(yīng)的字節(jié)碼文件 逐個(gè)掃描字節(jié)碼文件 利用字節(jié)碼文件獲取類,查看是否包含 @Componet 注解,并獲取或者生成 BeanName 獲取 BeanDefinition ,包含其類和類型(單例,多

    2024年02月16日
    瀏覽(56)
  • 【Spring】javaBean、依賴注入、面向切面AOP、使用注解開(kāi)發(fā)

    【Spring】javaBean、依賴注入、面向切面AOP、使用注解開(kāi)發(fā)

    有一定規(guī)范的Java實(shí)體類,類內(nèi)提供了一些公共方法以便外界對(duì)該對(duì)象的內(nèi)部屬性進(jìn)行操作 所有屬性都是private,所有的屬性都可以通過(guò)get/set方法進(jìn)行訪問(wèn),同時(shí)還需要有一個(gè)無(wú)參構(gòu)造(默認(rèn)就有) 高內(nèi)聚,低耦合是現(xiàn)代軟件的開(kāi)發(fā)的設(shè)計(jì)模式 之前編寫的圖書管理系統(tǒng)具有高

    2024年02月08日
    瀏覽(57)
  • B057-spring增強(qiáng) 依賴注入 AOP 代理模式 創(chuàng)建Bean

    B057-spring增強(qiáng) 依賴注入 AOP 代理模式 創(chuàng)建Bean

    DI:依賴注入 環(huán)境準(zhǔn)備,即寫一個(gè)spring測(cè)試,見(jiàn)工程 構(gòu)造器注入 即使用構(gòu)造器來(lái)給Bean的對(duì)象的屬性賦值 MyBean OtherBean SpringTest-Context.xml SpringTest setter方法注入 即用setter方法給bean對(duì)象的屬性賦值 MyBean OtherBean SpringTest-Context.xml SpringTest AOP 概念 事務(wù)管理:比如可以抽取try catch的

    2024年02月12日
    瀏覽(24)
  • 動(dòng)態(tài)代理與Spring Aop

    動(dòng)態(tài)代理與Spring Aop

    JDK 動(dòng)態(tài)代理 使用JAVA反射包中的類和接口實(shí)現(xiàn)動(dòng)態(tài)代理的功能,JAVA.lang.reflect包;主要是三個(gè)類: InvocationHandler,Method,Proxy; CGLIB動(dòng)態(tài)代理,第三方工具類庫(kù),創(chuàng)建代理對(duì)象,cglib的原理是繼承,通過(guò)繼承目標(biāo)類,創(chuàng)建它的子類,在子類中重寫父類中同名的方法,實(shí)現(xiàn)功能的修改

    2024年02月11日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包