初学spring,对spring注解这块了解不是很多,现在注解替代了xml配置文件,原来的bean id 去哪里了呢?

//@Service//默认类名
@Service("rmb")//这就是bean的id。

直接注解的话,会默认类的名字作为bean的id。也可以在@Service(“RMB”)这是自定义bean id。这样就很直观了。

spring配置文件的没有想象那么简单,我在网上找了很多关于spring aop 的例子。基本都没有配置文件的头。这个头会引发很多错误。

下面我改了一下我在网上复制下来的例子。并把自己遇到问题写下来。这是一个基本的spring aop 例子

首先配置文件

<?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:tool="http://www.springframework.org/schema/tool" xmlns:context="http://www.springframework.org/schema/context"         xsi:schemaLocation="http://www.springframework.org/schema/beans             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd         http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd          http://www.springframework.org/schema/aop         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- 启用AspectJ对Annotation的支持 -->       <!-- 激活annotation功能 --><context:annotation-config /><!-- 激活aop功能 --><aop:aspectj-autoproxy/><!--<bean id="myInterceptor" class="com.tgb.aop.LogAspect"/> --><!-- 让spring 扫包下面对类,让注解生效 --><context:component-scan base-package="com.tgb.aop"scoped-proxy="targetClass">
</context:component-scan></beans>

这文件你可以自己命名,

下面是类

例子中是简单模拟使用钱,的切面例子

package com.tgb.aop;
public interface IPayService {String pay(long userId, long money);
}

这是接口,

创建主体

package com.tgb.aop;import org.springframework.stereotype.Service;//@Service//默认类名
@Service("rmb")//这就是bean的id。
public class RMBPayService implements IPayService {//private static final Logger LOGGER = LoggerFactory.getLogger(RMBPayService.class);@Overridepublic String pay(long userId, long money) {System.out.println("用户:" + userId + "使用人民币支付金额:" + money);return "ok";}
}

创建切面

package com.tgb.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.org.eclipse.jdt.internal.compiler.batch.Main.Logger;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LogAspect {//private static final Logger LOGGER = LoggerFactory.getLogger(LogAspect.class);int i=0;@Pointcut("execution (* com.tgb.aop.RMBPayService.pay(..))")public void publicPointcut(){System.out.println("这里是切点。该方法只是一个标示,供@Pointcut注解依附。"+i++);}@Before("publicPointcut()")//里面的值是切点的定义方法。public void before() {System.out.println("支付前打印一点字.........");}@Before("publicPointcut()")//里面的值是切点的定义方法。public void before2() {System.out.println("支付前打印一点字.33223232........");}@After("publicPointcut()")public void afterAdvice() {System.out.println("后置通知,支付完成了呵呵............");}// 注意,此处returning后的值必须与方法参数名的值一致@AfterReturning(value = "execution(public String com.tgb.aop.*.pay(..))", returning = "retVal")public void afterReturning(String retVal) {System.out.println("支付结果如何,检查检查:后置" + retVal);}@AfterThrowing(pointcut = "publicPointcut()", throwing = "ex")public void afterThrowing(Exception ex) {System.out.println(ex.getMessage());}// 此方法必须有返回值,否则会使得被代理的方法的返回值变为null,在此方法中可以修改返回值@Around("publicPointcut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("支付方法中,环绕    先来一下........");Object result = joinPoint.proceed();System.out.println("支付方法结束了,走你.........");//改变运行结果。return result + "add";}
}

测试类

package com.tgb.aop;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {private static ApplicationContext ctx;public static void main(String[] args) throws Exception{//加载配置文件。ctx = new ClassPathXmlApplicationContext("test.xml");//在注解时,名字会是默认的类名。IPayService service = (IPayService)ctx.getBean("rmb");System.out.println(service.pay(2000, 20000));
//
//      ApplicationContext act = new ClassPathXmlApplicationContext("test.xml");
//      CommonEmployee e = (CommonEmployee)act.getBean("employee");
//        e.signIn();}
}

运行结果

log4j:WARN No appenders could be found for logger (org.springframework.core.io.support.PathMatchingResourcePatternResolver).
log4j:WARN Please initialize the log4j system properly.
支付方法中,环绕    先来一下........
支付前打印一点字.........
支付前打印一点字.33223232........
用户:2000使用人民币支付金额:20000
支付方法结束了,走你.........
后置通知,支付完成了呵呵............
支付结果如何,检查检查:后置okadd
okadd

整个项目在我的资源那里可以下载

初学spring aop 注解遇到的问题相关推荐

  1. Spring AOP注解方式实现

    简介 上文已经提到了Spring AOP的概念以及简单的静态代理.动态代理简单示例,链接地址:https://www.cnblogs.com/chenzhaoren/p/9959596.html 本文 ...

  2. Spring AOP注解为什么失效?90%Java程序员不知道

    转载自 Spring AOP注解为什么失效?90%Java程序员不知道 使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方 ...

  3. java spring aop 注解包_Spring AOP 注解配置实例

    Spring AOP注解例子 一:导入相关jar包. 首先导入Spring的相关包(这里就不多说了,我这里是3.2.4版本的) 然后导入AOP注解的相关包(不是spring的包)aspectjrt-1 ...

  4. spring AOP注解失效原因

    目录 @Transactional @Async等注解不起作用 JDK动态代理 Spring AOP注解失效原因及解决 原因1:同一个类中,方法A调用方法B(方法B上加有注解),注解无效 原因2:AO ...

  5. spring aop 注解

    spring Aop 注解 Aop 术语 AOP 的特性术语,不同的翻译还会不一样,得在过程中理解 横切关注点:跨越程序多个模块的方法或功能.即与业务逻辑无关,但我们也要关注的部分,就是横切关注点.如 ...

  6. spring AOP注解含义

    spring AOP 的几个注解含义 @Aspect                                                              指定一个类为切面类 @P ...

  7. spring AOP注解实现

    一.什么是AOP 引用一下维基百科的定义 面向切面的程序设计(Aspect-oriented programming,AOP,又译作面向方面的程序设计.剖面导向程序设计)是计算机科学中的一种程序设计思 ...

  8. Spring AOP注解

    1.配置 <!-- 配置spring创建容器时要扫描的包--><context:component-scan base-package="com">< ...

  9. spring注解:spring aop注解详解

    一. AOP的基本概念 Aspect(切面):通常是一个类,里面可以定义切入点和通知 Pointcut(切点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式 JointPoint(连接点) ...

最新文章

  1. C#调用API向外部程序发送数据(转载)
  2. MySQL的TRUNCATE关键字
  3. linux多系统更改启动顺序
  4. IoC(控制反转)的主要组件和注入的两种方式
  5. 昨天的一个披扣的问题处理到很晚没搞定的原因
  6. 记:通过Swagger-ui 生成json
  7. java什么是自动类型转换_java自动类型转换
  8. SpringMVC+Vue项目班级管理系统
  9. 概率论-数理统计部分思维导图
  10. K3路由器官改V2.1D设置定时重启
  11. 企业盈利能力五大指标之:总资产收益率
  12. android 锁屏代码分析,锁屏分析(Android9.0)
  13. iPhone2018年最全iPhone尺寸
  14. ajax高级程序设计_javascript高级程序设计核心知识总结
  15. 导数的四则运算法则_导数、微分、积分之间的区别与联系
  16. Surfer绘制等值线图
  17. 【Linux】工具(3)——gcc/g++
  18. 英雄帖:乌镇巴比特加速器潜力项目DemoDay,虚位以待
  19. go语言,安装包fetch error 问题解决方案
  20. 推荐10个HTML5游戏网站

热门文章

  1. 【校内模拟】坦克(LCT)
  2. 十大哲理故事(zt)
  3. 凯诺克斯品牌百科介绍
  4. cancelbubble和stoppraopagation区别
  5. Golang标准库中的fmt
  6. MacBook长期待机导致网页视频无法播放
  7. 广告推荐CTR点击率预测实践项目!
  8. 精彩回顾:终于明白阿里百度为什么拿WaitNotify通知机制考察求职者了
  9. Python Open3d的在可视化窗口快捷键
  10. HDU 1024 ~ Max Sum Plus Plus (DP + XJB优化)