Springboot 使用aop ,切controll层可以,切service层不行,请问是为什么 5C

Springboot 使用aop ,切controll层可以,切service层不行,找了好久不知道是为啥。

pom.xml:

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!--mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--end mybatis-->

        <!--通用mapper-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>1.1.5</version>
        </dependency>
        <!--&lt;!&ndash;pagehelper 分页插件&ndash;&gt;-->
        <!--<dependency>-->
            <!--<groupId>com.github.pagehelper</groupId>-->
            <!--<artifactId>pagehelper-spring-boot-starter</artifactId>-->
            <!--<version>1.2.3</version>-->
        <!--</dependency>-->

        <!--增加alibaba的连接池-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.19</version>
        </dependency>
        <!--end 增加连接池-->
<!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <!--end 热部署-->
        <!--默认日志Logback-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
        <!--shiro依赖包-->

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.0</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.31</version>
        </dependency>

        <!--&lt;!&ndash;redis 的spring支持&ndash;&gt;-->
        <!--<dependency>-->
            <!--<groupId>org.springframework.boot</groupId>-->
            <!--<artifactId>spring-boot-starter-data-redis</artifactId>-->
        <!--</dependency>-->

        <!-- 整合redis -->
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>2.0.6.RELEASE</version>
        </dependency>
        <!-- redis客户端操作 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

        <!--aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!--<dependency>-->
            <!--<groupId>org.aspectj</groupId>-->
            <!--<artifactId>aspectjrt</artifactId>-->
            <!--<version>1.7.4</version>-->
        <!--</dependency>-->

    </dependencies>
aop
0

7个回答

service层


@Service
public class UserService extends BaseService {
    @Autowired
    UserMapper userMapper ;

    /**
     * 分页查询
     * @param user
     * @param page
     * @return
     */
    @RedisCacheEnable(invalidTime = 15)
    public Page<User> findPage(User user , Page<User> page){
        user.setPage(page);
        page.setResultList(userMapper.findList(user));
        return page;
    }
}
0

RedisCacheAspect


@Component
@Aspect
public class RedisCacheAspect {

    @Autowired
    private RedisUtils redisUtils;
    private Logger logger = LoggerFactory.getLogger(this.getClass());

//    @Pointcut("@annotation(com.lin.commons.config.cache.annotation.RedisCacheEnable)")
    @Pointcut("execution(* com.lin.modules.sys.services.UserService.*(..))")
    public void pointCut(){}

    @Before(value = "pointCut()")
    public void before(){
        System.out.println("===========================================>before");
    }

}
0

controller:

 @Autowired
    RedisUtils redisUtils;
    @Autowired
    UserService userService ;
    @RequestMapping("get")
    public User get(@Param("id") String id ){
        return userService.get(id);
    }

    /**
     * 获取
     * @return
     */
    @RequestMapping("findPage")
    public Page<User> findPage(){
        String key = "findPage";
        Page<User> page ;
        page = userService.findPage(new User(), new Page<>());
        return page;
    }
0
 @SpringBootApplication
@EnableTransactionManagement  // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />
@MapperScan(basePackages = "com.lin", markerInterface = GlobalMapper.class)//在com.lin这里面的包进行扫描
@EnableCaching//增加redis的支持需要增加这一行
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class DemoApplication {
    private static final Logger LOGGER = LoggerFactory.getLogger(DemoApplication.class);

//  @RequestMapping("/hello")
//  public String sayHello(){
//      return "hello";
//  }

    public static void main(String[] args) throws InterruptedException {
        ApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);
    }
}
0

问题发现了,可能因为项目中有集合了shiro,在authRealm中把userService给设置成懒加载就好了,不知道为什么。

0
DearLinxu
chengLinxu 您好,我也碰到这个问题,也是用了shiro,您后面是怎么解决这个问题的,麻烦告知下
11 个月之前 回复

谢谢大神的指点,在shiro里面添加注解@Lazy就可以了

图片说明

0

谢谢大神的指点!!!!!!!!!!!!

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
spring中aop无法切到service内部调用的方法
首先,特别鸣谢周先生做的测试代码。一。场景描述 有一个控制层类OutStoreOverController(简称controller),依赖了XsCustomorExpenseOperateServiceImpl(简称service)类。controller在2个不同方法中分别调用了service的siteDeliverySettlement 和stockDownAccounts方法(分别简称为m...
在SpringBoot中配置controller层切面和service层切面的区别
其实区别很简单,贴两端代码一目了然service层的aoppackage com.yy.aop; //省略导入包 @Aspect @Service(&quot;logAspect&quot;) public class LogAspect { @Pointcut(&quot;execution(* com.newer.service.*.*(..))&quot;) public void anyMethod(){ ...
利用Spring AOP自定义注解实现服务层和controller层日志以及异常记录功能
项目开发中我们需要记录各个服务的调用日志,作为审计记录或者供debug查看,或者性能以及使用率分析等等。通过记录日志和异常,我们能找出,哪些功能在哪个时间段被哪些模块调用,入参都有哪些,反应时间多长,这样我们就能比较快的找出项目问题所在或者优化项目。那么如何实现这种功能,Spring AOP给我们提供了现成的方法。 当然实现的方法有很多,最直接的莫过于在每个调用的进入和对出都记录一天日志(log...
Spring如何使用aop切入controller层---问题笔记
转载自:http://www.oschina.net/question/222929_124314
spring aop对service层日志和异常的处理
1.aop是什么   AOP是Aspect Oriented Programming的缩写,意思是面向切面编程,与OOP(Object Oriented Programming)面向对象编程对等,都是一种编程思想。 从OOP角度分析,我们关注业务的处理逻辑,是属于纵向的行为,从AOP角度分析,我们关注对象行为发生时的问题,是属于横向的行为。 2.AOP 作用:   2.1 监控函数的调用   2....
springmvc在controller层使用aop切面不成功解决
需要在配置文件中加入&amp;lt;aop:aspectj-autoproxy proxy-target-class=&quot;true&quot; /&amp;gt;
spring aop 不能加在controller上,能加在service上
问题如上:  想在controller上加@Aspect  切面 ,但是总不成功,反而在service实现类上添加成功。 原因:  spring-mvc 的配置扫描优先于spring的配置文件,将aop 配置从spring的配置文件 转移到 spring-mvc的配置文件,可以在controller里方法作为切点了.
SpringBoot通过AOP实现系统日志记录(二)-Service层日志监控
本文是SpringBoot通过AOP实现系统日志记录(二)-Service层日志监控,若要实现Controller层监控,请点击传送门: SpringBoot通过AOP实现系统日志记录(一)-Controller层日志监控(包括日志表设计) 由于公司业务上的需求,现在需要对整个系统做日志性能监控,方便开发人员快速定位系统瓶颈并方便开发人员去解决问题,相关代码如下: 1、引入依赖 &lt;...
Spring配置加事物加扫描dao层 加增强的AOP切面方法
例子:增强Service层记录时间的方法
spring使用AOP技术对DAO层操作进行增强功能
AOP的概述1. 什么是AOP的技术? * 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程 * AOP是一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构 * AOP最早由AOP联盟的组织提出的,制定了一套规范.Spring将AOP思想引入到框架中,必须遵守AOP联盟的规范 * 通过预编译方式和运行期动态代理实
spring aop同时代理service层和controller层的问题
再说spring aop同时代理controller和service之前,先讲一下代理service和代理controller的基本写法把。。。。 单一的代理service写法 applicationContext.xml 扫描切面--> context:component-scan base-package="com.yunhui.web.aop">conte
关于spring在controller层的事务操作
以下是代码:package cn.hr.controller;import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org
springboot解决拦截器无法调用service层问题(无法注入serivce)
拦截器:   if (loginTickerService == null) {//解决service为null无法注入问题 System.out.println(&quot;loginTickerService is null!!!&quot;); BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicat...
spring的aop,为一个service添加一个一个逻辑
在学spring的时候 初学aop面向切面编程的时候,书上讲的很简单就是对一段业务添加一段逻辑,我就尝试着自己写了一个对service添加一段逻辑,就是在执行service的一段代码的时候在让其执行另一端代码,例如一下的例子: package com.qbd.blog.serviceimpl; import java.util.Date; import javax.annotat
springboot使用aop拦截controller干一些事导致service们@Autowired全部注入失败
springboot使用aop拦截controller干一些事导致controller里的service们@Autowired全部注入失败,报空指针 先集成使用aop吧 &amp;amp;lt;dependency&amp;amp;gt; &amp;amp;lt;groupId&amp;amp;gt;org.springframework.boot&amp;amp;lt;/groupId&amp;amp;gt; &amp;amp;lt;artifactId&amp;amp;gt;spri
spring aop类方法之间调用切面不能匹配
参考:https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#aop-proxying
Spring通过AOP在Service层注入用户信息
使用基于注解形式的AOP配置,在Service层或其他层,注入用户登录信息,这样就不需要在用到用户登录信息时总是注入Http相关对象,不用手动setter用户信息,且用户登录信息会随着session失效而自动注销。 . 相关类如下: 相关类说明: AppUserContextConfig:模块的配置类,负责扫描模块的Bean,当需要使用此模块时,用Import(AppUserCont
对@Repository注解的mybatis接口中的方法进行AOP拦截无效
实际情况是不光对@Repository注解的mybatis接口中的方法进行AOP拦截无效。如果对Service层的接口中的方法进行拦截也不生效,只有对Service接口的实现类中的方法进行拦截才生效。对Mybatis的写操作进行拦截可以使用mybatis提供的插件(plugin)中的Interceptor来实现 ...
AOP切面详解1
通过配置织入@Aspectj切面 虽然可以通过编程的方式织入切面,但是一般情况下,我们还是使用spring的配置自动完成创建代理织入切面的工作。     通过aop命名空间的声明自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面。当然,spring 在内部依旧采用AnnotationAwareAspectJAutoProxyCreator进行自动代理的创建工
记第一次使用spring aop拦截service
&amp;lt;bean id=&quot;Audience&quot; class=&quot;com.czx.core.aspect.Audience&quot;&amp;gt;&amp;lt;/bean&amp;gt; &amp;lt;!--开启自动扫描--&amp;gt; &amp;lt;context:component-scan base-package=&quot;Concert&quot; /&amp;gt; &amp;lt;aop:config proxy-target-class=&
通过aop拦截mybatis接口dao
最近开发的客服系统遇到了这样一个问题:微信渠道发送消息时如果nickname带有emoji表情,后台则会报消息无法插入数据库的错误,导致微信端一直无法进入人工,错误如下: 经查证,是由于后台在使用mybatis插入数据库时没有对emoji做转换处理,导致无法插入数据库,故而报错 由于mybatis使用的接口的形式跟mysql映射的,刚开始还以为aop无法拦截接口,结果验证,ao
springboot内部方法调用,aop切面失效
场景描述 有一个控制层类OutStoreOverController(简称controller),依赖了XsCustomorExpenseOperateServiceImpl(简称service)类。controller在2个不同方法中分别调用了service的siteDeliverySettlement和stockDownAccounts方法(分别简称为m1和m2)。m1和m2在具体实现的时候又...
spring+mybatis数据源切换【service层以及controller层】
最近项目需要切换数据源,查询了相关资料后做了一个简单的数据源的切换。 一、基本的简单配置 首先是我认为比较好的切换是在service层进行切换,基本思想是利用spring的AbstractRoutingDataSource类进行datasource的选择,就像map一样有个key,value,AbstractRoutingDataSource是有个determineCurrentLookupK
spring无事务的数据源切换,和带事务的数据源切换
最近在配置spring框架时需要使用多数据源,其中遇到一些问题,特此记录 无事务数据源切换 见 http://blog.csdn.net/shadowsick/article/details/8878448  主要说一下带事务数据源切换的配置 首先在spring-database.xml中配置两个数据源(默认数据源),和应用的切面
AOP的好处与之前DAO和DAOIMPL的对比
原始代码的写法既然要通过代码来演示,那必须要有例子,这里我的例子为:有一个接口Dao有insert、delete、update三个方法,在insert与update被调用的前后,打印调用前的毫秒数与调用后的毫秒数首先定义一个Dao接口:public interface Dao { public void insert(); public void delete(); ...
Spring 事务切面配置
Spring 事务切面配置
SpringAOP切换数据源的问题总结
1在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut”切入点” 例如定义切入点表达式 execution(* com.sample.service.impl...(..)) execution()是最常用的切点函数,其语法如下所示: 整个表达式可以分为五个部分: 1、execution(): 表达式主体。 2、第一个号:表示返回类
使用aop 统一处理控制层抛出的异常
依赖jar包,maven 导入 pom.xml &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-aop&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.0.0.RELEASE&amp;lt;/version&amp;gt; &
非Controller层获取spring的bean,调用service层
 有时候想调用service层的方法,但是在非Controller层注入不了spring的bean,所以我们直接写一个帮助类来获取,原理是直接去spring容器里根据命名来获取bean对象。代码是 public final class SpringTool implements ApplicationContextAware { private static ApplicationCo...
AOP面向切入实现service层嵌入缓存
缓存方法 : Srping+Ehcache 在Service层配置缓存 [url]http://panyongzheng.iteye.com/blog/2234167[/url] AOP面向切入实现service层嵌入缓存 [url]http://my.oschina.net/vill/blog/550715[/url] [code=&quot;java&quot;]//放入缓存注解 @Retention...
spring AOP action切点处调用自身方法
spring aop 在action的方法中插入切点,在切点处调用自身方法
controller层的引用service层一直报空指针问题
注入的service层一直报空指针的错误,原因就是controller层有个方法是private的方法,将这个private改为public问题即可解决解决后的:
接口实现时Spring AOP切入点注意事项
最近好多人问我说我的我的切入点没有错误啊,怎么不起作用?而且大部分情况都是写AOP切入点时带有类继承或接口实现时出现的问题。在此总结一下,方便后人查阅。而且建议使用如IntelliJ IDEA、STS或者Eclipse装AspectJ插件自动显示切入点是否匹配目标对象/目标方法。   1、相关类 1.1、抽象基类 我们在写一些项目时,都会抽象一些基类,比如DAO、Servi
Spring配置事务在Dao层和Service层
【转载自http://www.blogjava.net/hk2000c/archive/2007/11/01/157508.html】  【感谢原作者:hk2000c】  Spring通过AOP实现声明式事务管理。通常通过TransactionProxyFactoryBean设置Spring事务代理。我们需要一个目标对象包装在事务代理中。这个目标对象一般是一个普通Java对象的bean。当我们
在不是控制层里面controller里面使用service或者dao。可以讨论一下
    首先说一下ApplicationContext这个类,bean工厂,applicationContext说白了就是对beanFactory的扩展,也就是一个spring容器,而且applicationContext是单例的,项目中主要包含一个webApplicationContext和spring的DispatchServlet的一个容器。      配置一下,就这么一句话在spring里...
Sping AOP切面失效问题
jdk动态代理demo如下所示:(命名随意了,望见谅)   当代理类调用test方法的时候,会进入到InvocationHandler的invoke方法中,执行完增强逻辑后,接着执行 method.invoke(proxyDemo, args),proxyDemo就是我们被代理的类,之后的方法就是在proxyDemo实例中执行,所以test1方法是不会再进入到InvocationHand...
解决Spring AOP (注解方式) Controller 不生效
很久没写文章了,一来是工作比较乏味,基本上没遇到什么比较有意思的问题,基本上很多问题,网上都能解决~ 二来。。懒了~,最近在职业道路上又遇到了坎,所以提起“笔”,对于平复心情也是一种好的方式~ 好吧,进入今天的主题,Spring AOP 不生效 是怎样一个情况呢?接触SSH也很久了,从仰望到觉得,其实也挺烦恼的~ 自己比较倾向于“零配置”的开发,也许本身对配置觉得无爱吧~ 所...
springmvc 在controller层使用aop切面编程
第一 编写切点 首先我们在Springmvc的controller层中定义一个测试用的切点 package com.lin.controller; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.
为什么action使用的多例模式,但是service层和dao层用的是单例模式
使用单例和多例的判定条件是并发访问时会不会对类中公共属性进行修改。如果有可能修改,那就最好用多例,否则会出现各种异常情况。 action中一般会有前端对应的属性,这个一般是action的成员变量,如果是单例访问,所有的访问公用一个action实例对象,当然也公用里面的成员变量和方法,在使用成员变量时就有可能出问题了,比如多个请求同时对同一个属性进行修改,那不就乱了?因此在action层采用多例来
Spring AOP拦截Service实现日志管理(自定义注解的方式)
最近项目中用到AOP方式进行Service操作方法日志管理,特为之记! 1、先说理论和采用的方法 采用注解的方式,其中包括以下注解:@Aspect(类注解)和@AfterReturning(方法注解),其中需要用的Maven库如下: "org.aspectj:aspectjrt:1.8.9", "org.aspectj:aspectjweaver:1.8.9", org.spring
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 大数据基础层 大数据架构基础设施层