implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean
public class Result implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {
private String status;
private String message;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "Result{" +
"status='" + status + '\'' +
", message='" + message + '\'' +
'}';
}
@Override
public void setBeanName(String name) {
System.out.println("注册我成为bean时定义的id:" + name);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("管理我的beanfactory为" + beanFactory);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("高级容器接口ApplicationContext:" + applicationContext);
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet... ");
}
public void initMethod() {
System.out.println("init-method....");
}
@PostConstruct//代替xml initMethod
public void postCoustrcut() {
System.out.println("postCoustrcut");
}
@PreDestroy//在销毁之前执行
public void destory() {
System.out.println("destory-method... ");
}
@Override
public void destroy() throws Exception {
System.out.println("destroy...");
}
}
implements BeanPostProcessor (允许自定义修改新 bean 实例的工厂钩子,例如检查标记接口或用代理包装它们。)
* 拦截实例化之后的对象(实例化了并且属性注入了)
*/
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if ("lazyResult".equalsIgnoreCase(beanName)) {
System.out.println("MyBeanPostProcessor before方法拦截器处理lazyResult");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("lazyResult".equalsIgnoreCase(beanName)) {
System.out.println("MyBeanPostProcessor after方法拦截器处理lazyResult");
}
return bean;
}
}
@Component
@Aspect
//@EnableAspectJAutoProxy//开启aop注解驱动
public class LogUtils {
@Pointcut("execution(* com.lagou.edu.service.impl.TransferServiceImpl.*(..))")
public void pt1() {
}
/**
* 业务逻辑开始之前执行
*/
@Before("pt1()")
public void beforeMethod(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
Object arg = args[i];
System.out.println(arg);
}
System.out.println("业务逻辑开始之前执行。。。。。。。");
}
/**
* 业务逻辑结束时执行(无论异常与否)
*/
@After("pt1()")
public void afterMethod() {
System.out.println("业务逻辑结束时执行,无论异常与否都执行");
}
/**
* 异常时时执行
*/
@AfterThrowing("pt1()")
public void exceptionMethod() {
System.out.println("异常时执行。。。。。");
}
/**
* 业务逻辑正常时执行
*/
@AfterReturning(value = "pt1()", returning = "retVal")
public void successMethod(Object retVal) {
System.out.println("业务逻辑正常时执行 。。。。。");
}
/**
* 环绕通知
*/
// @Around("pt1()")
public Object arroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕通知中的befor emethod。。。");
Object reuslt = null;
try {
// 控制原有业务逻辑是否执行
// reuslt = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
} catch (Exception e) {
System.out.println("环绕通知中的exception Method...");
} finally {
System.out.println("环绕通知中的after method。。。");
}
return reuslt;
}
}
/**
* 测试xml-anno aop
*/
@Test
public void testXmlAnnoAop() throws Exception {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
TransferService transferService = applicationContext.getBean(TransferService.class);
transferService.transfer("6029621011000","6029621011001",100);
}
结果: