Spring实现AOP动态代理(1)

本文介绍如何使用 AspectJ 在 Spring 框架中实现动态代理,通过具体的代码示例展示如何定义切面、切入点及通知,并在运行时为指定方法添加前置通知。
Aspectj实现Spring中的动态代理。

1.首先我们新建设一个类和一个方法用来插入,就是所要插入的切面。

publicclassLogInterceptor {
     publicvoidbefore(){
           System.out.println("method start!");
     }
}

2.以及一个类方法用来被插入 就是在这个save方法前后加点代码。
@Component("u")
publicclassUserDaoImpimplementsUserDAO{
publicvoidsave(Useru) {
           System.out.println("User saved!");
     }
}
在这个save方法执行之前我们要插入before方法。

3.需要一个逻辑处理类,调用save方法

importorg.springframework.stereotype.Component;
importjavax.annotation.Resource;
@Component("userService")
publicclassUserService {
@Resource(name="u")
     publicvoidsetUserDAO(UserDAOuserDAO) {
           this.userDAO= userDAO;
     }

     publicvoidadd(Useruser){
           this.userDAO.save(user);
     }
}
简单起见 只添加必要的方法。
这个类获得 user对象调用save方法把对象添加进去。但是同时我们注意到这个对象也是一个component,也就是说这一个bean 在初始化的时候会把这个类对象化放入bean容器。

4.配置文件bean.xml 是这样的
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
     <context:annotation-config/>
     <context:component-scanbase-package="com.harvey"/>
     
     <aop:aspectj-autoproxy/>
</beans>

橘黄色的部分是我们需要的

5.在LogInterceptor 类前添加 @Aspact和@Component 
以及在需要插入的方法前 添加@Before。
@Aspact 是为了声明这个类是一个切面,他下面的方法将要被插入其他方法代码中。
@Component 是为了什么呢,Spring在对两个方法结合的时候要求都是bean对象,所以这里的切面类也需要被component。
换句话说,如果任意一个类方法 不是在bean对象里,也就不受spring管束,那么Spring就不能对那个方法进行动态代理。
@Before 是放置在方法前声明这个方法会用来放置在其他方法前面的,这个其他方法就是@Before里面所指向的方法。

@Before("execution(public void com.harvey.dao.impl.UserDaoImp.save(com.harvey.model.User))")
这句话的意思就是 在com.harvey.dao.impl.UserDaoImp.save
这个save方法前插入下面的方法before

完整的代码:
importorg.aspectj.lang.annotation.Aspect;
importorg.springframework.stereotype.Component;

@Aspect
@Component
publicclassLogInterceptor {
      @Before("execution(public void com.harvey.dao.impl.UserDaoImp.save(com.harvey.model.User))")
     publicvoidbefore(){
           System.out.println("method start!");
     }
}
 
再次完整的解释下:
第一行:声明一个切面 通过@Aspect 注视;
第二行:声明这也是一个bean 通过@Component
第三行:一个类叫LogInterceptor
第四行:声明@Before以下的这个方法要被插入在 public void com.harvey.dao.impl.UserDaoImp.save(com.harvey.model.User))
这个方法的前面。
第五行:一个叫before的方法。
第六行:方法内容,这里就简单一个输出。


6.最后我们实现测试类
publicclassUserServiceTest {
     @Test
     publicvoidtestAdd()throwsException{
           //BeanFactory
           ClassPathXmlApplicationContextbf= new ClassPathXmlApplicationContext("beans.xml");      
           UserServiceservice= (UserService)bf.getBean("userService"); 
              service.add(newUser());  
           bf.destroy();
     }
}
Nano-ESG数据资源库的构建基于2023年初至2024年秋季期间采集的逾84万条新闻文本,从中系统提炼出企业环境、社会及治理维度的信息。其构建流程首先依据特定术语在德语与英语新闻平台上检索,初步锁定与德国DAX 40成分股企业相关联的报道。随后借助嵌入技术对文本段落执行去重操作,以降低内容冗余。继而采用GLiNER这一跨语言零样本实体识别系统,排除与目标企业无关的文档。在此基础上,通过GPT-3.5与GPT-4o等大规模语言模型对文本进行双重筛选:一方面判定其与ESG议题的相关性,另一方面生成简明的内容概要。最终环节由GPT-4o模型完成,它对每篇文献进行ESG情感倾向(正面、中性或负面)的判定,并标注所涉及的ESG具体维度,从而形成具备时序特征的ESG情感与维度标注数据集。 该数据集适用于多类企业可持续性研究,例如ESG情感趋势分析、ESG维度细分类别研究,以及企业可持续性事件的时序演变追踪。研究者可利用数据集内提供的新闻摘要、情感标签与维度分类,深入考察企业在不同时期的环境、社会及治理表现。此外,借助Bertopic等主题建模方法,能够从数据中识别出与企业相关的核心ESG议题,并观察这些议题随时间的演进轨迹。该资源以其开放获取特性与连续的时间覆盖,为探究企业可持续性表现的动态变化提供了系统化的数据基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值