`

使用Spring方法注入协调不同步的bean

阅读更多
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

  <bean id="chinese" class="Bean.lookupbean.Chinese">
    <property name="axe">
      <ref local="axe"/>
    </property>
    <!-- 指定lookup注入方法,该方法用来保证每次产生的non-singleton bean都是新的实例,使用bean属性确定lookup方法的返回值 -->
    <lookup-method name="createAxe" bean="axe"/>
  </bean>
  <bean id="axe" class="Bean.lookupbean.SteelAxe" singleton="false"></bean>
</beans>

   spring bean有两种状态,singleton和non-singleton,区别是singletom在整个生命周期中只实例化一次,由spring进行管理,而non-singleton可以实例化多次,spring不负责进行管理,当有依赖关系存在是,会有这样一个问题,当singleton bean依赖non-singleton时,由于singleton bean只初始化一次,而non-singleton可以初始化多次,这样就会造成不同步的想象,解决办法是使用spring提供的lookup方法注入 

 

定义接口:

package Bean.lookupbean;

public interface Person {
    public Axe getAxe();
    public void useAxe();
    public abstract Axe createAxe();
} 

package Bean.lookupbean;

public interface Axe {
   public String chop();
}

 实现类:

注意,方法注入所需要的方法,必须是abstract的

package Bean.lookupbean;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import Bean.lookupbean.Person;

public abstract class Chinese implements Person ...{
    private Axe axe;
    public void useAxe() ...{
        axe.chop();
        
    }
    public Axe getAxe() ...{
        return axe;
    }
    public void setAxe(Axe axe) {
        this.axe = axe;
    }
    //方法注入所需要的方法,由spring提供实现
    public abstract Axe createAxe();

  
}


package Bean.lookupbean;

public class SteelAxe implements Axe {
    private int count=0;
    public String chop() ...{
        
        return "这是一把铁斧子"+ ++count;

    }

}


 配置文件;

这里要把axe bean设置成singleton=false否则,由于容器内只有一个目标bean实例,即使采用lookup注入,每次依然返回同一个实例,lookup方法不仅适用于设值注入,也适用于构造注入

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

  <bean id="chinese" class="Bean.lookupbean.Chinese">
    <property name="axe">
      <ref local="axe"/>
    </property>
    <!-- 指定lookup注入方法,该方法用来保证每次产生的non-singleton bean都是新的实例,使用bean属性确定lookup方法的返回值 -->
    <lookup-method name="createAxe" bean="axe"/>
  </bean>
  <bean id="axe" class="Bean.lookupbean.SteelAxe" singleton="false"></bean>
</beans>

 

public static void main(String[] args) throws Exception ...{
        
        String path=new Test().getClass().getResource("/").getPath();
        String realpath=path.substring(1, path.length());
        ApplicationContext context=new FileSystemXmlApplicationContext(realpath+"/lookupbean.xml");
        System.out.println("不使用lookup");
        Person p=(Person)context.getBean("chinese");
        System.out.println(p.getAxe());
        System.out.println(p.getAxe());
        System.out.println(p.getAxe().chop());
        System.out.println(p.getAxe().chop());
        System.out.println("使用lookup");
        System.out.println(p.createAxe());
        System.out.println(p.createAxe());
        System.out.println(p.createAxe().chop());
        System.out.println(p.createAxe().chop());
        
       
       
    }

 运行结构:

不使用lookup
Bean.lookupbean.SteelAxe@1e87719
Bean.lookupbean.SteelAxe@1e87719
这是一把铁斧子1
这是一把铁斧子2
使用lookup
Bean.lookupbean.SteelAxe@e32802
Bean.lookupbean.SteelAxe@b23210
这是一把铁斧子1
这是一把铁斧子1

可以看到,不使用lookup,spring返回同一个实例(由于不同步的原因),使用lookup,每次返回一个新的实例

分享到:
评论

相关推荐

    Quartz注入Spring的Bean

    3. **Spring注入Bean到Job**:在Job执行时,我们可以直接注入其他由Spring管理的Bean,无需在Job中创建这些对象,从而减少了代码的复杂性,增强了可重用性。 4. **JobFactory的自定义**:Quartz默认使用...

    4 后台使用Spring中的Bean质量评估193210111党涛1

    当不使用构造注入时,Spring会自动寻找无参构造器来创建Bean实例。因此,为了使Spring能够正确实例化Bean,你需要确保Bean类有一个公共的无参构造器。默认情况下,Spring会对Bean的属性进行默认初始化,即基本类型设...

    特殊情况(ActionForm,Servlet, Filter, Listener)下Spring如何注入对象

    对于Servlet、Filter和Listener,由于它们通常在Web应用启动时由容器实例化,而非由Spring管理,所以也不能直接使用@Autowired注解或其他常规的注入方式。为了解决这个问题,可以使用以下策略: 1. **Servlet**: ...

    Spring系列面试题129道(附答案解析)

    它通过读取配置文件或使用注解来创建和管理Bean实例,并将依赖关系自动注入到需要它们的Bean中。 17、什么是springbean? Spring bean是存储在Spring IoC容器中的Java对象,可以通过容器来配置和管理。 18、spring...

    static静态变量使用@Value注入方式.md

    通过上述分析和示例,我们可以看到,在Spring框架中,虽然不能直接使用`@Value`注解为静态变量注入值,但可以通过定义一个非静态方法并使用`@Value`注解来间接实现这一目标。这种方法不仅避免了潜在的警告和错误,还...

    SPRING面试宝典

    Bean自动装配是指Spring容器根据特定规则自动将Bean实例注入到依赖它们的其他Bean中的过程。这种方式可以简化配置。 **3.13 解释不同的自动装配模式** Spring框架支持以下几种自动装配模式: - **no**:默认模式...

    使用xDoclet自动生成Spring的bean的配置文件

    本篇文章将深入探讨如何使用xDoclet来自动创建Spring的bean配置文件。 首先,理解xDoclet的基础概念是必要的。xDoclet是一款基于Javadoc的元数据处理工具,它可以读取Java源代码中的特殊注释,并根据这些注释生成...

    定时启动--启动按钮(spring注入)

    - `&lt;bean id="backupQuarz" class="SavaLog"/&gt;` 表示将 `SavaLog` 类作为 Bean 注入。 - `&lt;bean id="quartzDetail"&gt;` 定义了具体的任务详情,包括目标对象 `targetObject` 和要执行的方法名 `targetMethod`。 - `...

    Spring-Reference_zh_CN(Spring中文参考手册)

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器...

    spring_精简教程

    通过本教程的学习,您不仅了解了Spring框架的基本概念和特点,还掌握了如何利用Spring容器管理和配置Bean,以及如何实现依赖注入的基本方法。这对于构建高效、可维护的企业级应用至关重要。接下来,您可以进一步深入...

    spring学习笔记

    2. 使用方法注入(lookup-method),让容器在运行时重写bean的方法,返回其他bean的新实例。 Spring还提供了定制bean生命周期行为的机制。例如,可以在bean初始化完成后执行特定操作: 1. 使用`init-method`属性,...

    SPRING 定时器的使用

    ### Spring 定时器的使用 #### 背景与需求 在开发应用程序时,并非所有操作都需要用户主动触发。有些任务需要系统自动执行,比如数据同步、定期备份等。例如,电力行业的集抄系统(一种自动收集电表读数的系统)...

    mybaits-spring(ibatis-spring)-1.0.2-bundle

    在不使用这个库的情况下,开发者需要手动管理SqlSessionFactory或SqlSession,并确保它们在Spring事务边界内正确关闭。而MyBatis-Spring通过提供SqlSessionTemplate和SqlSessionDaoSupport等工具类,使得MyBatis可以...

    25个经典的Spring面试问答

    3. 注解配置:使用如@Service、@Component、@Repository等注解直接在类上声明Bean。 【Spring Bean的生命周期】 Spring Bean的生命周期包括初始化、正常服务和销毁三个阶段。Spring提供了一些回调方法,如初始化...

    spring-5.3.9-dist.zip(spring-framework-5.3.9)

    Spring框架是Java开发中不可或缺的一部分,它为构建高效、可测试和可维护的应用程序提供了全面的基础设施。在本文中,我们将深入探讨Spring框架的5.3.9版本,包括其核心特性、文档、库和XML架构。 首先,Spring ...

    spring2.0学习笔记+spring定时任务

    在Spring 2.0中,我们可以使用Bean的生命周期回调方法来初始化和清理Bean。@PostConstruct和@PreDestroy注解分别标记在初始化方法和清理方法上,使得在Bean的生命周期中能有条不紊地执行特定操作。 对于“源码”...

    Jaxws+Spring整合实例

    - `HelloServiceImpl.java`:服务接口的实现,可以通过Spring注入其他依赖。 - `spring-config.xml`:Spring配置文件,声明服务bean。 - `JaxWsServerFactoryBean.java`:创建并启动Web服务的工厂类,设置Spring...

    Spring.3.x企业应用开发实战(完整版).part2

    经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...

    Spring 2.0 开发参考手册

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    Spring中文帮助文档

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

Global site tag (gtag.js) - Google Analytics