好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Spring详细讲解FactoryBean接口的使用

FactoryBean是一个接口,创建对象的过程使用了工厂模式。

一、基本使用

让Spring容器通过FactoryBean来实现对象的创建。

创建FactoryBean案例

?

1

2

3

4

5

6

7

8

9

10

11

public class SimpleFactoryBean implements FactoryBean<Cat> {

     @Override

     public Cat getObject() throws Exception {

         // 创建Cat对象并且返回

         return new Cat( "Tom" );

     }

     @Override

     public Class<?> getObjectType() {

         return Cat. class ;

     }

}

其实这里就相当于在配置文件里创建了一个bean标签。

?

1

< bean class = "com.text.registrar.SimpleFactoryBean" id = "cat" ></ bean >

需要加载的类

?

1

2

3

4

5

6

public class Cat {

     String name;

     public Cat(String name) {

         this .name = name;

     }

}

启动类里面创建方法加载Bean

?

1

2

3

4

5

6

7

8

9

10

11

@SpringBootApplication

public class SpringbootApplication {

     public static void main(String[] args) {

         ConfigurableApplicationContext run = SpringApplication.run(SpringbootApplication. class , args);

     }

     // 等价于配置文件配置

     @Bean

     public SimpleFactoryBean catFactoryBean() {

         return new SimpleFactoryBean();

     }

}

二、高级使用

让Spring容器通过FactoryBean创建指定接口的动态代理对象。

创建FactoryBean,可以生成任意接口的动态代理对象

创建一个接口

?

1

2

3

public interface MyUserMapper {

     void select();

}

创建一个FactoryBean实现类

可以通过传入接口的全类名,创建动态代理对象。

?

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

public class MapperFactoryBean implements FactoryBean {

     /**

      * 用于保存接口的全类名

      */

     private String className;

     public MapperFactoryBean(String className) {

         this .className = className;

     }

     @Override

     public Object getObject() throws Exception {

         Class<?> interfaceClass = Class.forName(className);

         // 生成动态代理对象返回

         Object proxyInstance = Proxy.newProxyInstance(MapperFactoryBean. class .getClassLoader(), new Class[]{interfaceClass}, new InvocationHandler() {

             @Override

             public Object invoke(Object o, Method method, Object[] objects) throws Throwable {

                 // 获取当前方法名

                 System.out.println(method.getName());

                 if ( "select" .equals((method.getName()))) {

                     System.out.println(className + "动态代理对象的select方法被执行了!!" );

                 }

                 return null ;

             }

         });

         return proxyInstance;

     }

     @Override

     public Class<?> getObjectType() {

         try {

             Class<?> interfaceCLass = Class.forName(className);

             return interfaceCLass;

         } catch (ClassNotFoundException e) {

             e.printStackTrace();

         }

         return null ;

     }

}

启动类里面创建方法加载Bean

?

1

2

3

4

5

6

7

8

9

10

11

12

@SpringBootApplication

public class SpringbootApplication {

     public static void main(String[] args) {

         ConfigurableApplicationContext run = SpringApplication.run(SpringbootApplication. class , args);

         run.getBean(MyUserMapper. class );

     }

     // 等价于配置文件配置

     @Bean

     public MapperFactoryBean mapperFactoryBean() {

         return new MapperFactoryBean( "com.test.registrar.MyUserMapper" );

     }

}

到此这篇关于Spring详细讲解FactoryBean接口的使用的文章就介绍到这了,更多相关Spring FactoryBean内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

原文链接:https://blog.csdn.net/See_Star/article/details/125003932

查看更多关于Spring详细讲解FactoryBean接口的使用的详细内容...

  阅读:14次