【问题标题】:AOP works only with @Autowired annotationAOP 仅适用于 @Autowired 注释
【发布时间】:2019-10-17 00:31:07
【问题描述】:

我有以下弹簧控制器代码:

@Controller
@RequestMapping("/")
public class MainController {
    UserService user = new UserService();

    @GetMapping("/home")
    public String goFirstPage(){
        user.showUserName(new User("Mike"));
        return"firstpage";
    }

}

以及以下方面:

@Aspect
@Component
@Order(1)
public class UserAspect {


    @Before("execution(public void com.project.aopmaven.services.UserService.showUserName(..))")
    public void logUser(){
        System.out.println("Logging User");
    }

}

它不起作用,没有显示“Logging User”消息(甚至在控制器类中实例化了 UserService 对象)。但是,当我们将 @Autowired 注释添加到控制器中定义的 UserService 时,它​​就可以工作了!

@Autowired
UserService user = new UserService();

谁能解释一下?

【问题讨论】:

    标签: java spring-mvc aop autowired spring-aop


    【解决方案1】:

    Spring AOP 允许在 Spring bean 上使用 AOP,而不是在随机对象上。它是基于代理的:Spring 不是注入 bean 的实际实现,而是注入一个包装实际实现的代理,并在调用包装的 bean 实现之前/之后调用方面。

    Documentation

    【讨论】:

    • 让我再解释一下:JB 的意思是,如果你直接调用UserService 构造函数,你并没有使用 Spring 来创建你的组件(以及它的动态代理,如果需要的话) .不过,自动注入确实将对象创建委托给 Spring。如果你坚持在你的方法中创建对象而不是让 Spring 注入它,你也可以使用类似 myApplicationContext.getBean(UserService.class) 的东西。但是使用像 Spring 这样的依赖注入容器的全部意义在于——嗯,依赖注入。 ;-)
    • 知道了!非常感谢你们。
    猜你喜欢
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2016-05-08
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    相关资源
    最近更新 更多