Spring解决单例引用原型的问题 lookup-method

解决单例引用原型的问题

单例引用原型有什么问题
    一个人

public class User {
    private String name;
    private Watch wt;
}


    这个人有个手表
 

public class Watch {
    private String time;
    public Watch() {
        this.time = new Date().toString();
    }
}


    配置文件
        

<bean id="user" class="com.cn.mytest.lookupmethod.User">
        <property name="name" value="ccc" />
        <property name="wt" ref="watch" />
    </bean>

    <bean id="watch" class="com.cn.mytest.lookupmethod.Watch" scope="prototype">
    </bean>


            手表是原型模式
    测试
      

 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("lookupmethod.xml");
        User user = applicationContext.getBean(User.class);
        System.out.println(user);
        System.out.println(user.getWt().toString());
        Thread.sleep(1000l);
        User user1 = applicationContext.getBean(User.class);
        System.out.println(user1);
        System.out.println(user1.getWt().toString());


            获取2次,时间没变
    问题就是,时间应该变才对

怎么解决
    public abstract class User {
    user换为抽象类
    修改getWt方法
        public abstract Watch getWt();

    配置文件
        

<bean id="user" class="com.cn.mytest.lookupmethod.User">
        <property name="name" value="ccc" />
        <lookup-method name="getWt" bean="watch"></lookup-method>
    </bean>


    测试
        com.cn.mytest.lookupmethod.User$$EnhancerBySpringCGLIB$$c179f09b@5bf0d49
Watch{time='Wed Jul 21 19:12:41 CST 2021'}
com.cn.mytest.lookupmethod.User$$EnhancerBySpringCGLIB$$c179f09b@5bf0d49
Watch{time='Wed Jul 21 19:12:42 CST 2021'}
            时间变了
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,除了使用注解方式,我们还可以使用XML配置来实现Spring Lookup Method。下面是一个使用XML配置的示例: 首先,定义一个抽象类: ``` public abstract class AbstractBean { public void doSomething() { getDependency().execute(); } public abstract Dependency getDependency(); } ``` 接下来,定义一个具体的子类: ``` public class ConcreteBean extends AbstractBean { private Dependency dependency; @Override public Dependency getDependency() { if (dependency == null) { dependency = createDependency(); } return dependency; } protected Dependency createDependency() { // 返回一个新的Dependency对象 } } ``` 注意到这里的`createDependency()`方法没有被`@Lookup`注解标记,这是因为我们将会在XML中配置这个方法。 接下来,我们需要在XML中配置这个类: ``` <bean id="concreteBean" class="com.example.ConcreteBean"> <lookup-method name="createDependency" bean="dependency"/> </bean> <bean id="dependency" class="com.example.Dependency"/> ``` 注意到这里的`lookup-method`元素,它告诉Spring在运行时为`createDependency()`方法生成一个代理,并将其返回值注入到`ConcreteBean`对象中。 现在,我们可以在其他类中注入`concreteBean`对象,并调用它的`doSomething()`方法,它将会使用`ConcreteBean`中的`createDependency()`方法来获取一个新的`Dependency`对象,并执行它的`execute()`方法。 这就是使用XML配置的Spring Lookup Method的一个简单示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值