spring boot 配置AOP时不生效

星辰海 2017-12-28 11:55:10
最近在学习了springboot,但是遇到了这样一个问题,我搭建完架构后,想加上一个请求日志打印和响应日志打印,这无疑就用到了spring的AOP机制了,但是我配置完了之后,确是没有生效。我也百度了,但是看配置都和我差不多,但是我的却不生效,这令我百思不得其解,希望大家帮我看看。我的代码如下:

/**
* 这配置AOP的代码
*/
@Aspect
@Component
public class HttpAspect{

private Logger logger = LoggerFactory.getLogger(HttpAspect.class);

public HttpAspect(){
logger.info("=============初始化AOP===============");
}

@Pointcut("execution(public * com.springboot.mybatis.controller.*.*(..))")
public void log(){
}

/**
*
* 获取请求的信息
*/
@Before("log()")
public void doBefore(JoinPoint joinPoint){

ServletRequestAttributes arrt = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = arrt.getRequest();
logger.info("请求地址 url:{}",request.getRequestURL());
logger.info("请求方式 :{}",request.getMethod());
logger.info("请求者ip地址:{}",request.getRemoteAddr());
logger.info("访问的类与方法:{}",joinPoint.getSignature().getDeclaringTypeName()+"."
+joinPoint.getSignature().getName());
logger.info("请求参数:{}",joinPoint.getArgs());
}

/**
* 获取响应的信息
* @param object
*/
@AfterReturning(returning = "object", argNames = "object", pointcut = "log()")
public void doAfterReturning(Object object){

logger.info("响应信息如下:");
logger.info("response:{}",object.toString());
}
}


/**
* 这是启动应用的代码
*/
@SpringBootApplication(scanBasePackages = "com")
@MapperScan(basePackages = "com.springboot.mybatis.dao")
public class SpringbootMybatisApplication {

public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisApplication.class, args);
}
}


#这是我的配置文件
server:
port: 8080
context-path: /sbm

spring:
profiles:
active: dev
#数据库配置
datasource:
url: jdbc:mysql://localhost:3306/testaclec?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
#页面跳转配置
mvc:
view:
prefix: /view/
suffix: .html

#mybatis 配置
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.springboot.mybatis.model

#分页插件配置
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql

logging:
config: classpath:logback-spring.xml

...全文
3374 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fai_jai 2021-03-29
  • 打赏
  • 举报
回复
引用 16 楼 fai_jai 的回复:
[quote=引用 12 楼 一枚小麻瓜 的回复:]配置类或者启动类加这个注解 @EnableAspectJAutoProxy
为什么我们项目没有这个注解也可以正常跑[/quote] 明白了,The @SpringBootApplication annotation contains the @EnableAutoConfiguration annotation.
fai_jai 2021-03-29
  • 打赏
  • 举报
回复
引用 12 楼 一枚小麻瓜 的回复:
配置类或者启动类加这个注解 @EnableAspectJAutoProxy
为什么我们项目没有这个注解也可以正常跑
viaco2love 2021-03-29
  • 打赏
  • 举报
回复
注入是注入了,但是还是没有aop 。 然后我发现我居然在aop 里写错注解名称了 @Before("@annotation(com.xxxxx.XxxAnnotation)") public void before() {
CQTany 2020-12-08
  • 打赏
  • 举报
回复
准确的说是未开启aop,虽然加了componentScan可以解决,但并不是真正的解决方案,12楼才是最正确的解决方案
qq_31380211 2020-12-07
  • 打赏
  • 举报
回复
@EnableEurekaClient @SpringBootApplication @ComponentScan("com.xxx.*") //这里要能扫描到你注解的HttpAspect 才行 public class PheryWebApplication { public static void main(String[] args) { SpringApplication.run(PheryWebApplication.class, args); } } 上面标红这句话是正解!!!困扰了我好几天的问题,终于解决了!!!
gaofei2019 2019-09-30
  • 打赏
  • 举报
回复
引用 9 楼 zcw_cms 的回复:
//不能只使用@Component,因为只使用此注解启动会报aop切面类注入容器失败(我这里是这样), //需加上@ComponentScan(basePackages="XXX.XXX.XXX")扫描具体包才能注入成功
我按照7楼的办法,可以使用了,没有加入basePackage.
一枚小麻瓜 2019-09-30
  • 打赏
  • 举报
回复
配置类或者启动类加这个注解 @EnableAspectJAutoProxy
zcw_cms 2019-03-23
  • 打赏
  • 举报
回复
@ComponentScan(basePackages="com.zcw") @Component//这个必不可缺,否则aop不生效 @Aspect//开启切面Aop //不能只使用@Component,因为只使用此注解启动会报aop切面类注入容器失败(我这里是这样), //需加上@ComponentScan(basePackages="XXX.XXX.XXX")扫描具体包才能注入成功
lianbancai 2018-07-01
  • 打赏
  • 举报
回复
@会飞的fish 多谢你给的灵感
lianbancai 2018-07-01
  • 打赏
  • 举报
回复
@EnableEurekaClient
@SpringBootApplication
@ComponentScan("com.xxx.*") //这里要能扫描到你注解的HttpAspect 才行
public class PheryWebApplication
{

public static void main(String[] args)
{
SpringApplication.run(PheryWebApplication.class, args);
}
}

你把你的HttpAspect类随便注入其他类中,看是不是能注入,我的不能,我就加了扫描包,可以注入了, 注解也生效了
星辰海 2017-12-29
  • 打赏
  • 举报
回复
还有没有大神有不同的见解的,求指教。
星辰海 2017-12-28
  • 打赏
  • 举报
回复
不要沉啊!有没有高手解答啊!
会飞的fish 2017-12-28
  • 打赏
  • 举报
回复
不是改那个,那个自定义包,他是不会去扫描的 /** * 这是启动应用的代码 */ @SpringBootApplication(scanBasePackages = "com") @MapperScan(basePackages = "com.springboot.mybatis.dao") public class SpringbootMybatisApplication { public static void main(String[] args) { SpringApplication.run(SpringbootMybatisApplication.class, args); } } @SpringBootApplication这个注解不会扫描自定义包的,无论你写很多包名都是不行的,@MapperScan(basePackages = "com.springboot.mybatis.dao")这个注解在这面不起作用的直接去掉,直接把这个类移到com目录下,就可以了
星辰海 2017-12-28
  • 打赏
  • 举报
回复
@会飞的fish 你的意思是改成@SpringBootApplication(scanBasePackages = "com.springboot.mybatis") 这样的了,试了不行哦!
会飞的fish 2017-12-28
  • 打赏
  • 举报
回复
你这个可能运行Spring boot 的@SpringBootApplicatioin里的@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) 他是不会定义你自己的扫描包的,应该把你的你的@SpringBootApplicatioin运行的类放在上层的 例如:com.kkk.clm 放在 com.kkk里面就能扫描到了
星辰海 2017-12-28
  • 打赏
  • 举报
回复
好吧!沉了。不知道能不能顶上去。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧