欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring的几个接口

程序员文章站 2022-05-14 18:17:31
...

  备注: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"));
    		//[email protected]
     
相关标签: Spring的几个接口

上一篇: P1141 01迷宫

下一篇: py问