Spring的几个接口

  备注:Aware接口spring标记接口 表示spring的回调

 

  1. org.springframework.beans.factory.FactoryBean
    	/**
    	 * 调用getBean()时spring容器每次返回 getObject()方法的返回值
    	 *
    	 */
    	public class Factory implements FactoryBean<Test1> {
    
    		@Override
    		public Test1 getObject() throws Exception {
    			return new Test1();
    		}
    
    		@Override
    		public Class<?> getObjectType() {
    			return Test1.class;
    		}
    
    		@Override
    		public boolean isSingleton() {
    			return false;
    		}
    
    	}
      
               <!-- 屌用Factory实例,context.getBean("&t3") -->
    	<bean id="t3" class="i.test.Factory"/>
     
  2. org.springframework.beans.factory.BeanNameAware
    	/**
    	 * 得到配置文件中,id的名字
    	 *
    	 */
    	public class Test3 implements BeanNameAware {
    		private String name;
    
    		@Override
    		public void setBeanName(String name) {
    			this.name = name;
    		}
    	}
      
    	<!-- 可以直接在Test3中使用这个id -->
    	<bean id="t3" class="i.test.Test3" />
      
  3. org.springframework.beans.factory.InitializingBean
    	public class Test3 implements InitializingBean {
    
    		public void setName(String name) {
    			System.out.println("-----" + name);
    		}
    
    		/**
    		 * 属性初始化后调用该方法
    		 */
    		@Override
    		public void afterPropertiesSet() throws Exception {
    			//
    			System.out.println("-----");
    		}
    	}
      
    	<bean id="t3" class="i.test.Test3" p:name="name"/>
    	
    	<!-- 在没有实现上面接口时,可以通过下面配置实现同样效果 -->
    	<bean id="t3" class="i.test.Test3" p:name="name" init-method="afterPropertiesSet"/>
     
  4. org.springframework.beans.factory.DisposableBean
    	public class Test3  implements DisposableBean{
    
    		public void setName(String name) {
    			System.out.println("-----"+name);
    		}
    
    		/**
    		 * 对象被销毁时调用的方法,
    		 * 单例模式bean与spring容器有相同的生命周期
    		 */
    		@Override
    		public void destroy() throws Exception {
    			//
    			System.out.println("-----");
    			
    		}
    	}
      
    	<bean id="t3" class="i.test.Test3" p:name="name" />
    
    	<!-- 在没有实现上面接口时,可以通过下面配置实现同样效果 -->
    	<bean id="t3" class="i.test.Test3" p:name="name" destroy-method="destroy" />
     
    		AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
    		// 让容器关闭时回调
    		context.registerShutdownHook();
     
  5. import org.springframework.context.ApplicationContextAware
    public class Test3 implements ApplicationContextAware {
    
    	private ApplicationContext context;
    
    	/**
    	 * 通过容器初始化对象
    	 */
    	public Test1 getTest1() {
    		return context.getBean("t1", Test1.class);
    	}
    
    	/**
    	 * 可以得到spring容器
    	 */
    	@Override
    	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    		this.context = applicationContext;
    	}
    
    }
    
     
    	<bean id="t1" class="i.test.Test1" scope="prototype" />
    	<bean id="t3" class="i.test.Test3"  />
     
  6. Lookup method injection(可作为上面功能的简单实现版)
    public abstract class Test3 {
    
    	/**
    	 * 要求每次反回一个新的Test1实例
    	 */
    	public abstract Test1 getTest1();
    
    	@Override
    	public String toString() {
    		System.out.println(getTest1());
    		return "";
    	}
    
    }
    
     
    	<bean id="t1" class="i.test.Test1" scope="prototype" />
    	<bean id="t3" class="i.test.Test3">
    		<!-- Spring框架通过使用CGLIB字节码生成工具,动态库生成的子类重写方法实现。 cglib这个包在spring3.2被集成进来 -->
    		<lookup-method name="getTest1" bean="t1" />
    	</bean>
           cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理,java自带的代理类工具proxy(被代理类必须要实现接口)
    		ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
    		System.out.println(context.getBean("t3"));
    		//i.test.Test3$$EnhancerByCGLIB$$86e9bbc0@f1afec5
     

你可能感兴趣的:(Spring的几个接口)