@DeclareParents触发方式
有两种触发方式:
- 第一种触发方式:在使用时自行强转新引入接口类型,然后调用方法。
- 第二种触发方式:在通知类中,使用this关键字,引入新目标类对象,调用方法
目标类、为需要增强的方法建立一个类
目标类
public interface Waiter{
void service();
}
@Service("waiter")
public class WaiterImpl implements Waiter{
@Override
void service(){
System.out.println("服务员进行服务");
}
}
需要添加的方法:拖地
public interface Employee{
void mopping();
}
@Component
public class EmployeeImpl implements Employee{
@Override
public void mopping(){
System.out.println("职员拖地");
}
}
在切面类中配置好@DeclareParents
注意 :要先在切面类中配置好@DeclareParents才能通过后面两种触发方法进行代理增强。
@Component
@Aspect
public class LogUtil{
//配置@DeclareParents,让目标类具备添加方法类中的添加方法。
@DeclareParents(value = "Waiter+", defaultImp = EmployeeImpl.class)
private Employee employee;
}
触发方式
- 第一种:在使用时自行强转新引入接口类型,然后调用方法
public class SpringDeclareParentsTest {
public static void main(String[] args) {
//1.创建容器
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
//2.获取对象
Waiter waiter = ac.getBean("waiter",waiter.class);
//3.自行强转
Employee employee = (Employee)employee;
//4.调用添加的方法
employee.mopping();
//5.调用目标类中的方法。
waiter.service();
}
}
- 第二种:在通知类中,使用this关键字,引入新目标类对象,调用方法
@Component
@Aspect
public class LogUtil{
//配置@DeclareParents,让目标类具备添加方法类中的添加方法。
@DeclareParents(value = "Waiter+", defaultImp = EmployeeImpl.class)
private Employee employee;
@Before("execution(* *.*.(..))&&this(employee)")
public void printlog(Employee employee){
employee.mopping();
System.out.println("打印日志");
}
}
public class SpringDeclareParentsTest {
public static void main(String[] args) {
//1.创建容器
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
//2.获取对象
Waiter waiter = ac.getBean("waiter",waiter.class);
//3.调用目标类中的方法。
waiter.service();
}
}
更好的博客:https://blog.csdn.net/u010502101/article/details/76944753