Spring的几个接口
程序员文章站
2022-05-14 18:17:31
...
备注:Aware接口spring标记接口 表示spring的回调
-
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"/>
-
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" />
-
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"/>
-
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();
-
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" />
-
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]
上一篇: P1141 01迷宫
下一篇: py问