使用Spring(八) 延迟初始化bean、Lookup方法注入

来源:互联网 发布:ubuntu查看用户名密码 编辑:程序博客网 时间:2024/06/05 08:48

spring官方说明:

Lookup方法注入利用了容器的覆盖受容器管理的bean方法的能力,从而返回指定名字的bean实例。在上述场景中,Lookup方法注入适用于原型bean(尽管它也适用于singleton bean,但在那种情况下直接注入一个实例就够了)。Lookup方法注入的内部机制是Spring利用了CGLIB库在运行时生成二进制代码功能,通过动态创建Lookup方法bean的子类而达到复写Lookup方法的目的。



1.applicationContext4.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">    <!-- 延迟初始化bean -->    <bean id="bean2" class="com.yw.test05.ExpensiveToCreateBean"        lazy-init="true"></bean>    <!-- <bean id="bean1" class="com.yw.test05.ExpensiveToCreateBean" lazy-init="false">         </bean> -->    <!-- Lookup方法注入 -->    <!-- a stateful bean deployed as a prototype (non-singleton) -->    <bean id="command" class="com.yw.test05.AsyncCommand" scope="prototype"        lazy-init="true">        <!-- inject dependencies here as required -->    </bean>    <!-- commandProcessor uses statefulCommandHelper -->    <bean id="commandManager" class="com.yw.test05.CommandManager">        <lookup-method name="createCommand" bean="command" />    </bean></beans>

2.

package com.yw.test05;public abstract class CommandManager{// mmm, but where is the implementation of this method?abstract Command createCommand();}

package com.yw.test05;public interface Command{}

package com.yw.test05;public class AsyncCommand implements Command{public AsyncCommand(){System.out.println("==AsyncCommand()==");}}

package com.yw.test05;import org.springframework.beans.factory.BeanFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;public class Test04{public static void main(String[] args){// 实例化容器方法三classpath:// ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {// "com/yw/test05/applicationContext.xml"});ApplicationContext context = new FileSystemXmlApplicationContext(new String[] { "classpath:com/yw/test05/applicationContext4.xml" });// of course, an ApplicationContext is just a BeanFactoryBeanFactory factory = (BeanFactory) context;// 延迟初始化beanObject obj = factory.getBean("bean2");System.out.println("obj=" + obj);// Lookup方法注入Object obj2 = factory.getBean("commandManager");System.out.println("obj2=" + obj2);CommandManager comManager = (CommandManager) obj2;Command command = comManager.createCommand();System.out.println("cmmand=" + command);}}

3.运行


0 0
原创粉丝点击