Spring Aop Demo

文章目录

  • 一、aop
  • 二、xml方式
    • 1、定义接口类
    • 2、具体实现类
    • 3、切入类
    • 4、xml配置方式
    • 5、test
  • 二、Config配置方式
    • 1、配置类
    • 2、test
    • 1、接口类
    • 2、实现类
    • 3、切入类
    • 4、xml配置
    • 5、test

eclipse 如何自动新建bean.xml
new–>others–>spring Bean Configuration File–>命名

一、aop

1、 aop面向切面有两种方式:1 接口代理 2 cglib代理
2、由于在编程过程中会涉及到代码重用,或者是在获得第三方代码后,只能去添加功能,而不能去修改源码,可以通过继承、代理来实现,继承的话使得代码耦合度增加,aop核心就是通过代理来实现
3、aop使用的场景:安全、日志、监控等
一下的demo是通过两种配置来实例化bean,xml 和Java Config

二、xml方式

1、定义接口类

public interface Performance {
    //表示演员表演
	public void actor() ;

}

2、具体实现类

public class PerImp implements Performance{
	@Override
	public void actor() {
		System.out.println("开始表演");
	}
	
}

3、切入类

@org.aspectj.lang.annotation.Aspect
public class Aspect {
//表明在演员表演之前分别需要关闭手机,表演之后需要欢呼,在表演出演问题的时候去退票,表演结束之后离场
	@Pointcut("execution(* book4.Performance.actor(..))")
	public void pointcut() {} 
	@Before("pointcut()")
	public void before() {
		System.out.println("关闭手机");
	}
	@After("pointcut()")
	public void after() {
		System.out.println("呼叫欢呼");
	}
	@Around("pointcut()")
	public void arround(ProceedingJoinPoint jp)  {
		System.out.println("round关闭手机");
		System.out.println("round请坐");
		try {
			jp.proceed();
		} catch (Throwable e) {
			System.out.println("round退票");
		}
		
	}
	@AfterReturning("pointcut()")
	public void afterReturn() {
		System.out.println("离场");
	}
	@AfterThrowing("pointcut()")
	public void Throwing() {
		System.out.println("退票");
	}

}

4、xml配置方式

	<!-- 开启自动化代理 -->
   <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
	<bean id="perimp" class="book4.PerImp"></bean>
	<bean id="aspect" class="book4.Aspect"></bean>

5、test

        ApplicationContext context = new ClassPathXmlApplicationContext("book4/bean.xml");
		Performance performance = (Performance) context.getBean("perimp");
		performance.actor();

二、Config配置方式

1、配置类

@Configuration
//配置方式
@ComponentScan
//组件扫描
@EnableAspectJAutoProxy
//配置自动代理
public class Config { 
	@Bean(name = "asp")
	public Aspect getAsp() {
		return new Aspect();
	}
	@Bean(name = "per")
	public Performance getPer() {
		return new PerImp();
	}
}

2、test

        ApplicationContext context2 = new AnnotationConfigApplicationContext(Config.class);
		Performance performance2 = (Performance) context2.getBean("per");
		performance2.actor();

三、通过注释引入增加新功能

1、接口类

public interface ExtendPerformance {
	public void perCore();
}

2、实现类

public class DefaultExtendsPerformanceImp implements ExtendPerformance {

	@Override
	public void perCore() {
		System.out.println("增加功能:来个大跳");
	}
}

3、切入类

value表示当前引入接口,+表示实现当前接口的子类
defaultImpl ,表示增加功能的具体实现类

@Aspect
public class AspectCore {
	@DeclareParents(value = "book4.Performance+" 
			,defaultImpl = DefaultExtendsPerformanceImp.class)
	public static ExtendPerformance extendCor;
	
}

4、xml配置

<!-- aop扩展 -->
<bean class="book4.AspectCore"></bean>

5、test

实例化bean后,需要将其转化为增加功能的接口

ExtendPerformance performance3 =(ExtendPerformance)context.getBean("perimp");
performance3.perCore();

你可能感兴趣的:(spring)