真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringAOP中如何實(shí)現(xiàn)自動(dòng)代理-創(chuàng)新互聯(lián)

小編給大家分享一下Spring AOP中如何實(shí)現(xiàn)自動(dòng)代理,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),成都做網(wǎng)站公司-創(chuàng)新互聯(lián)公司已向上1000家企業(yè)提供了,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)絡(luò)營(yíng)銷等服務(wù)!設(shè)計(jì)與技術(shù)結(jié)合,多年網(wǎng)站推廣經(jīng)驗(yàn),合理的價(jià)格為您打造企業(yè)品質(zhì)網(wǎng)站。

這里的自動(dòng)代理,我講的是自動(dòng)代理bean對(duì)象,其實(shí)就是在xml中讓我們不用配置代理工廠,也就是不用配置class為org.springframework.aop.framework.ProxyFactoryBean的bean。

總結(jié)了一下自己目前所學(xué)的知識(shí)。

發(fā)現(xiàn)有三種方式實(shí)現(xiàn)自動(dòng)代理

用Spring一個(gè)自動(dòng)代理類DefaultAdvisorAutoProxyCreator:

例如:

原來(lái)不用自動(dòng)代理的配置文件如下:



  
  
  
  
    
    
      
        .*run.*
      
    
    
    
      
    
  
  
  
    
    
    
    
      
        advisor
      
    
  

現(xiàn)在改用自動(dòng)代理,如下配置:



  
  
  
    
    
      
        .*run.*
      
    
    
    
      
    
  
 
  
  

測(cè)試方法

@Test//自動(dòng)代理
  public void demo4(){
    ApplicationContext ctx = new ClassPathXmlApplicationContext("cn/hncu/xmlImpl/4.xml");
    //我們直接在這里獲取Person對(duì)象就可以了,因?yàn)樵谧铋_(kāi)始xml文件newPerson對(duì)象后,Spring就已經(jīng)幫我們代理了!
    Person p =ctx.getBean(Person.class);
    p.run();
    p.say();
  }

相對(duì)于前面,也就是把代理工廠部分換成自動(dòng)代理了。

演示結(jié)果:

Spring AOP中如何實(shí)現(xiàn)自動(dòng)代理

自己寫(xiě)一個(gè)自動(dòng)代理底層實(shí)現(xiàn):

我們也可以寫(xiě)一個(gè)類,來(lái)實(shí)現(xiàn)DefaultAdvisorAutoProxyCreator自動(dòng)代理的功能!

首先,我們需要實(shí)現(xiàn)一個(gè)接口,也就是BeanPostProcessor接口。

BeanPostProcessor接口作用是:如果我們需要在Spring容器完成Bean的實(shí)例化、配置和其他的初始化前后添加一些自己的邏輯處理,我們就可以定義一個(gè)或者多個(gè)BeanPostProcessor接口的實(shí)現(xiàn),然后注冊(cè)到容器中。

而我們想要在原型對(duì)象bean被創(chuàng)建之后就代理了,就必須在原來(lái)的容器中拿到原來(lái)的原型對(duì)象,需要拿到原來(lái)spring容器中的切面對(duì)象,這個(gè)時(shí)候,我們就需要原來(lái)的容器,這個(gè)時(shí)候就需要另一個(gè)接口,也就是ApplicationContextAware接口!

通過(guò)這2個(gè)接口,我們就可以實(shí)現(xiàn)自動(dòng)代理了。

package cn.hncu.xmlImpl;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class MyAutoProxy implements BeanPostProcessor,ApplicationContextAware{
  private ApplicationContext applicationContext=null;
  //bean創(chuàng)建之前調(diào)用
  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName)
      throws BeansException {
    return bean;//在這里,我們直接放行
  }
  //bean創(chuàng)建之后調(diào)用
  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName)
      throws BeansException {
    ProxyFactoryBean factory = new ProxyFactoryBean();
    //把原型對(duì)象放入代理工廠
    factory.setTarget(bean);
    //在這里
    Advisor adv = applicationContext.getBean(Advisor.class);
    factory.addAdvisor(adv);
    //返回被代理后的對(duì)象
    return factory.getObject();
  }
  //拿到原來(lái)的spring中的容器
  @Override
  public void setApplicationContext(ApplicationContext applicationContext)
      throws BeansException {
    this.applicationContext=applicationContext;
  }
}

5.xml



  
 
  
  
    
    
      
        .*run.*
      
    
    
    
      
    
  
 
 
  
  

測(cè)試方法:

@Test//自己實(shí)現(xiàn)的自動(dòng)代理
  public void demo5(){
    ApplicationContext ctx = new ClassPathXmlApplicationContext("cn/hncu/xmlImpl/5.xml");
    Person p =ctx.getBean(Person.class);
    p.run();
    p.say();
  }

測(cè)試結(jié)果就不上圖了,和前面是一樣的。

其實(shí)很多時(shí)候,我們?nèi)绻约喝ゾ氁幌碌讓樱瑢?duì)上層的框架更好理解。

還有一種方法。

使用aop標(biāo)簽配自動(dòng)代理

需要在beans加一個(gè)命名空間

xmlns:aop=https://www.springframework.org/schema/aop

還需要配xsi:schemaLocation,為aop加一個(gè)網(wǎng)絡(luò)地址。

https://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop-4.3.xsd

我們需要一個(gè)aspectjweaver-jar包:

xml配置文件:



  
  
 
  
  
 
  
  
    
    
      
        .*run.*
      
    
    
    
      
    
  
 

測(cè)試方法:

@Test//自動(dòng)代理
  public void demo6(){
    ApplicationContext ctx = new ClassPathXmlApplicationContext("cn/hncu/xmlImpl/6.xml");
    Person p =ctx.getBean(Person.class);
    p.run();
    p.say();
  }

測(cè)試結(jié)果:

Spring AOP中如何實(shí)現(xiàn)自動(dòng)代理

以上是“Spring AOP中如何實(shí)現(xiàn)自動(dòng)代理”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


網(wǎng)站標(biāo)題:SpringAOP中如何實(shí)現(xiàn)自動(dòng)代理-創(chuàng)新互聯(lián)
本文路徑:http://weahome.cn/article/isspj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部