编程开发 > JSP > 文章内容

Spring自动代理创建器详细介绍及简单实例

2017-4-26编辑:ljnbset

Spring 自动代理创建器详细介绍及简单实例

前言:

在经典的spring Aop中,可以手工为目标Bean创建代理Bean,配置文件必须为每一个需要增强的Bean声明一个代理,结果配置文件里声明了大量的代理Bean。

在经典的Spring Aop中,Spring提供了自动代理创建器(Aotu proxy creator),有了自动代理创建器,就不再需要使用ProxyFactoryBean手工地创建代理了。

接口Animal和Book:

?

1

2

3

4

5

6


 
package com.zzj.aop;

  

public interface Animal {

 public void eat();

 public void drink();

}

?

1

2

3

4

5

package com.zzj.aop;

  

public interface Book {

 public void read();

}

目标类:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

package com.zzj.aop;

  

public class Human implements Animal, Book{

 @Override

 public void eat() {

  System.out.println("eat...");

 }

  

 @Override

 public void drink() {

  System.out.println("drink...");

 }

  

 @Override

 public void read() {

  System.out.println("read...");

 }

}

前置通知和后置通知:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

package com.zzj.aop;

  

import java.lang.reflect.Method;

  

import org.springframework.aop.MethodBeforeAdvice;

  

public class MethodBefore implements MethodBeforeAdvice {

  

 public void before(Method arg0, Object[] arg1, Object arg2)

   throws Throwable {

  System.out.println("before " + arg0.getName());

 }

  

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

package com.zzj.aop;

  

import java.lang.reflect.Method;

  

import org.springframework.aop.AfterReturningAdvice;

  

public class MethodAfter implements AfterReturningAdvice {

  

 public void afterReturning(Object arg0, Method arg1, Object[] arg2,

   Object arg3) throws Throwable {

  System.out.println( "after " + arg1.getName());

 }

  

}

Spring配置文件:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

"1.0" encoding="UTF-8"?>

"http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://www.springframework.org/schema/beans

   http://www.springframework.org/schema/beans/spring-beans.xsd">

  

  "human" class="com.zzj.aop.Human">

   

  

  "beforeAdvice" class="com.zzj.aop.MethodBefore">

  "afterAdvice" class="com.zzj.aop.MethodAfter">

   

  

  "methodNamePointcut"

   class="org.springframework.aop.support.NameMatchMethodPointcut">

   "mappedNames">

    

     eat

     read

    

   

  

   

  

  "AfterMethodNameAdvisor"

   class="org.springframework.aop.support.DefaultPointcutAdvisor">

   "advice" ref="afterAdvice">

   "pointcut" ref="methodNamePointcut">

  

  

  "BeforeMethodNameAdvisor"

   class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">

   "advice" ref="beforeAdvice">

   "expression">

    execution(* *.*in*(..))

   

  

   

  

  class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

   "beanNames">

    

     *human

    

   

   "interceptorNames">

    

     AfterMethodNameAdvisor

     BeforeMethodNameAdvisor

    

   

  

以上自动代理器可以为以human结尾的Bean创建代理。

测试:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

package com.zzj.aop;

  

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

  

public class Test {

  

 /**

  * @param args

  */

 public static void main(String[] args) {

  ApplicationContext context = new ClassPathXmlApplicationContext(

    "applicationContext.xml");

  Animal animal = (Animal) context.getBean("human");

  Book book = (Book) animal;

  animal.eat();

  animal.drink();

  book.read();

  

 }

  

}

输出:

?

1

2

3

4

5

6

eat...

after eat

before drink

drink...

read...

after read

Spring还提供了另一个自动代理创建器:DefaultAdvisorAutoProxyCreator。这个自动代理创建器不需要任何配置,他会自动检查Ioc容器里声明的每一个增强器和Bean。如果存在与增强器切入点匹配的的Bean,那么DefaultAdvisorAutoProxyCreator将自动为其创建代理。

?

1

class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

需要注意的是,DefaultAdvisorAutoProxyCreator可能会代理那些不希望被代理的目标Bean,所以使用时要格外小心。

Spring组件自动扫描详解及实例代码

热点推荐

登录注册
触屏版电脑版网站地图