- "1.0" encoding="UTF-8"?>
- <beans xmlns="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.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
-
-
-
- <context:component-scan base-package="com.atguigu.spring.aop.annotation">context:component-scan>
-
-
- <aop:aspectj-autoproxy />
-
- beans>
- package com.atguigu.spring.aop.annotation;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.springframework.stereotype.Component;
-
-
-
- /*1、在切面中,需要通过指定的注解将方法标识为通知方法
- * @Before:前置通知,在目标对象方法执行之前执行
- *
- * */
- @Component
- @Aspect //将当前组件标识为切面
- public class LoggerAspect {
-
- @Before("execution(public int com.atguigu.spring.aop.annotation.CalculatorImpl.add(int, int))")
- public void beforeAdviceMethod() {
- System.out.println("LoggerAspect,前置通知");
- }
-
- }
假设获取的是目标对象
-
- public class AOPByAnnotationTest {
-
- @Test
- public void testAOPByAnnotation(){
- //获取IOC容器
- ApplicationContext ioc = new ClassPathXmlApplicationContext("aop-annotation.xml");
- //获取目标对象
- CalculatorImpl calculator = ioc.getBean(CalculatorImpl.class);
- calculator.add(10, 1);
- }
- }
刚会报如下错误
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.atguigu.spring.aop.annotation.CalculatorImpl' available
CalculatorImpl的bean没有找到 不可用
但是我们在CalculatorImpl里面已经加了@Component 也已经扫描了 但是从IOC容器中获取不到
这就如同 我们之前所说的代理模式一样的 我们只要为目标对象创建了代理对象 我们每一次要访问 我们都是通过代理对象 间接访问 已经不能直接通过目标对象进行访问了
我们不知道代理类叫什么名字 要如何获取支对象呢?
虽然不知道代理类叫什么 但是他和目标对象 实现的是同一个接口
如同我们之前做动态代理时 不知道叫什么 但是可以通过向上转型来创建接口的对象
所以这里我们也是 通过IOC来获取某个Bean的时候 ,我们不需要通过一个具体的一个类型来获取
我们可以用所继承的父类或所实现的接口进行获取
通过代理对象获取
正确的
-
- public class AOPByAnnotationTest {
-
- @Test
- public void testAOPByAnnotation(){
- //获取IOC容器
- ApplicationContext ioc = new ClassPathXmlApplicationContext("aop-annotation.xml");
- //获取目标对象
- // CalculatorImpl calculator = ioc.getBean(CalculatorImpl.class);
- //获取代理对象
- Calculator calculator = ioc.getBean(Calculator.class);
- calculator.add(10, 1);
- }
- }