Spring中基于FactoryBean的练习

浅浅的花香味﹌ 2022-03-20 11:25 276阅读 0赞
  • 1.BeanFactory,
    以Factory结尾,表示它是一个工厂类(接口),用于管理Bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
      Spring为我们提供了许多易用的BeanFactory实现,XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。XmlBeanFactory类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用。
  • 2.FactoryBean
    以Bean结尾,表示它是一个Bean,不同于普通Bean的是:它是实现了FactoryBean接口的Bean,根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身,如果要获
    取FactoryBean对象,请在id前面加一个&符号来获取。

请参考如下代码:

  1. //ABean.java
  2. package sping.analysis.beans;
  3. public class ABean implements MyBean {
  4. private String name;
  5. public ABean(String name) {
  6. this.name = name;
  7. }
  8. public void doSomething() {
  9. System.out.println(this.name);
  10. }
  11. }
  12. //MyBean.java
  13. package sping.analysis.beans;
  14. public interface MyBean {
  15. void doSomething();
  16. }
  17. //MyFactoryBean.java
  18. package sping.analysis.beans;
  19. import java.lang.reflect.InvocationHandler;
  20. import java.lang.reflect.Method;
  21. import java.lang.reflect.Proxy;
  22. import org.springframework.beans.factory.DisposableBean;
  23. import org.springframework.beans.factory.FactoryBean;
  24. import org.springframework.beans.factory.InitializingBean;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.beans.factory.annotation.Qualifier;
  27. import org.springframework.beans.factory.annotation.Value;
  28. import org.springframework.stereotype.Component;
  29. @Component
  30. public class MyFactoryBean implements FactoryBean<Object>, InitializingBean, DisposableBean {
  31. @Value(value = "sping.analysis.beans.MyBean")
  32. private String interfaceName;
  33. @Autowired(required=false) @Qualifier("aBean")
  34. private Object target;
  35. private Object proxyObj;
  36. public void destroy() throws Exception {
  37. System.out.println(this.getClass().getName() + ".destroy() ....");
  38. }
  39. /** * 注意: * JDK Proxy 动态代理是基于 接口 来实现的。 * cglib 才是基于类实现的 */
  40. public void afterPropertiesSet() throws Exception {
  41. System.out.println(this.getClass().getName() + ".afterPropertiesSet() ...");
  42. proxyObj = Proxy.newProxyInstance(
  43. this.getClass().getClassLoader(),
  44. new Class[] { Class.forName(interfaceName)},
  45. new InvocationHandler() {
  46. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  47. System.out.println("invoke method:" + method.getName());
  48. Object res = method.invoke(target, args);
  49. return res;
  50. }
  51. });
  52. }
  53. public Object getObject() throws Exception {
  54. System.out.println(this.getClass().getName() + ".getObject() ...");
  55. return proxyObj;
  56. }
  57. public Class<?> getObjectType() {
  58. return proxyObj == null ? Object.class : proxyObj.getClass();
  59. }
  60. }
  61. //TestFactoryBean.java
  62. package sping.analysis.beans;
  63. import javax.annotation.Resource;
  64. import org.junit.Test;
  65. import org.junit.runner.RunWith;
  66. import org.springframework.test.context.ContextConfiguration;
  67. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  68. @RunWith(SpringJUnit4ClassRunner.class)
  69. @ContextConfiguration(locations = "classpath:application3.xml")
  70. public class TestFactoryBean {
  71. @Resource(name = "myFactoryBean")
  72. private MyBean myBean;
  73. //如果要获取FactoryBean对象,请在id前面加一个&符号来获取
  74. @Resource(name = "&myFactoryBean")
  75. private MyFactoryBean myFactoryBean;
  76. @Test
  77. public void test() {
  78. myBean.doSomething();
  79. System.out.println("> myFactoryBean.isSingleton:" + myFactoryBean.isSingleton());
  80. }
  81. }

输出结果:

  1. sping.analysis.beans.MyFactoryBean.afterPropertiesSet() ...
  2. sping.analysis.beans.MyFactoryBean.getObject() ...
  3. invoke method:doSomething
  4. 张三
  5. > myFactoryBean.isSingleton:true
  6. sping.analysis.beans.MyFactoryBean.destroy() ....
  7. //application3.xml
  8. <?xml version="1.0" encoding="UTF-8"?>
  9. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  10. <context:component-scan base-package="sping.analysis.beans"/>
  11. <bean id="aBean" class="sping.analysis.beans.ABean">
  12. <constructor-arg type="java.lang.String" value="张三" />
  13. </bean>
  14. </beans>

发表评论

表情:
评论列表 (有 0 条评论,276人围观)

还没有评论,来说两句吧...

相关阅读