Spring IOC的一些高级特性

简介: 1.Lookup方法注入        在大部分的应用场景中,容器中的大部分bean是singleton类型的。当一个单例bean需要和另外一个单例bean协作时,或者一个非单例bean要引用另外一个非单例bean时,通常情况下将一个bean定义为另外一个bean的属性值就行了。

1.Lookup方法注入

        在大部分的应用场景中,容器中的大部分bean是singleton类型的。当一个单例bean需要和另外一个单例bean协作时,或者一个非单例bean要引用另外一个非单例bean时,通常情况下将一个bean定义为另外一个bean的属性值就行了。不过对于具有不同生命周期的bean来说这样做就会有问题了,比如在调用一个单例类型bean A的某个方法,需要引用另一个非单例(prototype)类型bean B,对于bean A来说,容器只会创建一次,这样就没法在需要的时候每次让容器为bean A提供一个新的bean B实例。

        Lookup方法具有使容器覆盖受容器管理的bean方法的能力,从而返回指定名字的bean实例。在上述场景中,Lookup方法注入适用于原型bean。 Lookup方法注入的内部机制是Spring利用了CGLIB库在运行时生成二进制代码的功能,通过动态创建Lookup方法bean的子类从而达到复写Lookup方法的目的。

        为了使动态子类起作用,Spring容器要子类化的类不能是final,并且需要覆写的方法也不能是final。同样的,要测试一个包含抽象方法的类也稍微有些不同,你需要子集编写它的子类提供该抽象方法的实现。最后,作为方法注入目标的bean不能是序列化的。在Spring 3.2之后再也没必要添加CGLIB到classpath,因为CGLIB的类打包在了org.springframework下并且在Spring核心JAR中有所描述。这样做既方便,又避免了与其他使用了不同版本CGLIB的项目的冲突。

        假如现在有2个类:Clerk和ClerkManager,其中ClerkManager依赖于Clerk,即ClerkManager持有类型为Clerk的私有属性,现在我们想让Clerk been的作用域为singleton,而ClerkManager been的作用域为prototype,如果不做任何处理直接在ClerkManager been中设置Clerk属性,就会出现问题,即每次应用的Clerk been都是同一个,无法达到预期的效果。这个时候我们可以使用Spring的Lookup方法注入来达到在每次引用Clerk属性的时候都会动态创建一个新的Clerk been的目的。一下是Clerk和ClerkManager的代码:

package com.ioc.lookup;

public class Clerk {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

}

 

package com.ioc.lookup;

public abstract class ClerkManager {
	private Clerk clerk;
	
    public Object process() {
        //调用createClerk()方法动态生成Clerk对象
        Clerk Clerk=createClerk();
        return Clerk;
    }

    //这个动态生成Clerk对象的方法,这是个抽象方法,Spring容器会自动覆写createClerk()方法的实现。
    protected abstract Clerk createClerk();

	public Clerk getClerk() {
		return clerk;
	}

	public void setClerk(Clerk clerk) {
		this.clerk = clerk;
	}
    
}


        接着我们在applicationContext.xml中配置如上类的bean:

	<bean id="clerk" class="com.ioc.lookup.Clerk" scope="prototype">
		<property name="name" value="Tom"></property>
		<property name="age" value="20"></property>
	</bean>
	
	<bean id="clerkManager" class="com.ioc.lookup.ClerkManager" scope="singleton">
		<lookup-method name="createClerk" bean="clerk"/>
	</bean>

        最后编写一个测试类:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ioc.lookup.ClerkManager;

public class LookuoDemo {

	public static void main(String[] args) {

		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		
		ClerkManager clerkManager=(ClerkManager) applicationContext.getBean("clerkManager");
		
		System.out.println("第一次注入的Clerk:"+clerkManager.process());
		
		System.out.println("第二次注入的Clerk:"+clerkManager.process());

	}

}

        运行测试类,结果如下:

        可以看到,两次注入的Clerk been是不一样的,因此达到了我们的目的。

 

相关文章
|
2月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
10月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
774 26
|
10月前
|
负载均衡 Java API
Spring Cloud是什么及基本特性都有哪些?
Spring Cloud 是用于构建健壮云应用的框架,包含多个子项目。其核心组件如Eureka(服务注册与发现)、Hystrix(熔断器)、Ribbon(负载均衡)等,帮助开发者快速实现微服务架构。Spring Cloud 提供了服务注册与发现、分布式配置、路由、断路器等功能,简化了微服务开发与管理。本文将重点介绍服务注册与发现及分布式配置两大特性。
584 5
|
5月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
186 2
|
6月前
|
XML 人工智能 Java
Spring IOC 到底是什么?
IOC(控制反转)是一种设计思想,主要用于解耦代码,简化依赖管理。其核心是将对象的创建和管理交给容器处理,而非由程序直接硬编码实现。通过IOC,开发者无需手动new对象,而是由框架负责实例化、装配和管理依赖对象。常见应用如Spring框架中的BeanFactory和ApplicationContext,它们实现了依赖注入和动态管理功能,提升了代码的灵活性与可维护性。
200 1
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
222 4
|
7月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
197 0
|
12月前
|
XML Java 数据格式
【SpringFramework】Spring IoC-基于XML的实现
本文主要讲解SpringFramework中IoC和DI相关概念,及基于XML的实现方式。
272 69

热门文章

最新文章