`

实现java bean的懒加载

    博客分类:
  • Java
 
阅读更多

hibernate的lazy懒加载:

只有我们在正真使用时,它才会发出SQL语句,给我们去查询,如果不使用对象则不会发SQL语句进行查询。

Hibernate中lazy(懒加载)的实现:
采用了第三方组件的库,这个库叫cglib.jar(比较流行),这个库对我们的类生成代理类(JDK的动态代理,只能对JDK中实现了接口的类进行代理),代理可以控制源对象并且可以对源对象的功能进行增强,而cglib.jar可以对类进行代理(cglib对我们的类进行继承,生成一个子类,这个子类作为代理类返回给你)。
只有你正真代理类的方法,则会查看你有没有加载目标对象,如果没有则会加载目标对象。

 

可是网上很少有文章描述java bean如何实现懒加载。

下面,我使用cglib实现java bean 的懒加载方式。

1、首先,创建一个User类, 有name、age、car字段,而car字段是大对象, 这时候可以让car字段以懒加载方式加载数据。

 

public class User {
	private String name;
	private int age;
	private Car car;

	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;
	}

	public Car getCar() {
		return car;
	}

	public void setCar(Car car) {
		this.car = car;
	}
}

 

public class Car {
	private String carName;
	private String type;
	public String getCarName() {
		return carName;
	}
	public void setCarName(String carName) {
		this.carName = carName;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
}

 

2、利用cglib,创建懒加载工厂类LazyloadFactory, 实现cglib 的MethodInterceptor接口

 

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

public class LazyloadFactory implements MethodInterceptor {
	private Object target;

	public LazyloadFactory(Object target) {
		this.target = target;
	}

	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		String methodName = method.getName();
		if (methodName.startsWith("get")) {
			//获取属性
			Field field = target.getClass().getDeclaredField(
					methodName.substring(3, methodName.length()).toLowerCase());
			//对大字段懒加载
			if(field.getType()== Car.class) {
				field.setAccessible(true);
				
				//打印要执行的方法
				System.out.println("懒加载------>执行" + method.getName());
				//延迟加载, 这里可以从数据库中获取数据,给属性赋值
				System.out.println("懒加载------>" + "加载大对象开始");
				Thread.sleep(1000);
				
				Car car = new Car();
				car.setCarName("京Q123456");
				car.setType("宝马");
				//给指定的属性赋值
				field.set(target, car);  
				System.out.println("懒加载------>" + "加载大对象完成");
			}
		}
		Object result = proxy.invoke(target, args);
		return result;
	}
}

 3、创建获取User的Service, 这样可以实现懒加载

import org.springframework.cglib.proxy.Enhancer;

public class UserService {
	public User getUser() {
		User user = new User();
		//先给其他字段赋值
		user.setName("suncht");
		user.setAge(20);
		//再给大字段赋值(懒加载)
		LazyloadFactory intercepter=new LazyloadFactory(user);       
		return (User) Enhancer.create(User.class,intercepter);
	}
}

 4、我们用测试类进行测试下, 运行时,很明显会感觉到getCar().getName()进行懒加载

public class Test {

	public static void main(String[] args) {
		UserService service = new UserService();
		User user = service.getUser();
		System.out.println(user.getName());
		System.out.println(user.getAge());
		System.out.println(user.getCar().getCarName());
	}
}

   

 结果如下:

suncht
20
懒加载------>执行getCar
懒加载------>加载大对象开始
懒加载------>加载大对象完成
京Q123456

 

分享到:
评论

相关推荐

    Spring Boot 全局懒加载机制.docx

    在传统的Spring应用中,我们可以通过在bean定义上添加`@Lazy`注解来实现单个bean的懒加载。例如: ```java @Lazy @Configuration public class DemoConfig { public DemoConfig() { log.warn(" > > > demoConfig ...

    一种面向对象的Java Bean查询方法的实现

    ### 一种面向对象的Java Bean查询方法的实现 #### 概述 在Java开发中,尤其是在涉及数据库操作的应用场景下,传统的做法是直接在Java Bean中编写SQL语句来完成数据的增删改查等操作。然而,这种方法存在一些明显的...

    Spring bean 动态注册,jar包热替换

    Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...

    让spring解决控制springboot中bean的加载顺序的问题.docx

    本文将探讨为什么需要控制Bean加载顺序、常见的误解,以及如何有效地实现Bean的加载顺序控制。 1. 为什么需要控制加载顺序 在一般情况下,Spring Boot会自动扫描并管理@Component注解的类,将其注册为Bean并初始化...

    用于实现JAVA树结构的BEAN

    2. CLASSPATH.sh:这可能是一个脚本文件,用于设置运行Java程序所需的类路径环境变量,这对于正确加载和运行包含这个BEAN的Java应用至关重要。 3. 代码中国.txt:这可能是一份与代码相关的文本文件,可能包含了代码...

    spring的bean加载顺序样例项目

    在"spring的bean加载顺序样例项目"中,我们可以通过分析和实验来深入理解这一主题。下面将详细阐述Spring Bean的加载顺序以及相关知识点。 1. **Bean的定义与作用域** - Spring中的Bean是在`beans.xml`或Java配置...

    JAVA bean 技术.JSP

    在JSP中使用Java Bean可以极大地提高代码的复用性和维护性,同时使得业务逻辑与视图层分离,有助于实现MVC(模型-视图-控制器)架构。 总结起来,Java Bean是Java Web开发中的核心组件,它遵循特定的编码规范,提供...

    java bean用户登录系统

    在这个场景中,我们讨论的是一个使用Java Bean实现的用户登录系统,它与MySQL数据库协同工作,为用户提供注册和登录的功能。下面我们将深入探讨相关的知识点。 首先,`Java Bean`遵循JavaBeans规范,其主要特点包括...

    spring 重新动态加载数据库或xml中的bean,可以不用重启tomcat

    spring 重新动态加载数据库或xml中的bean,可以不用重启tomcat

    一种面向对象的Java Bean查询方法的实现 (1).pdf

    Persister类的主要目的是将Java Bean中的数据操作(如添加、修改、删除、加载和查询)从Bean中分离出来,使Bean专注于数据封装和数据合法性验证。这样,可以降低Java Bean的实现复杂度。Persister通过反射访问Bean的...

    详解Spring简单容器中的Bean基本加载过程

    在 Spring 中,bean 的加载过程是通过 XmlBeanFactory 或 DefaultListableBeanFactory 实现的。XmlBeanFactory 是 Spring 提供的一个基本的 bean factory,它可以从 XML 文件中加载 bean 的定义,并将其注册到容器中...

    Java_Bean教程

    Java Bean 是Java编程中的一个重要概念,它是一种遵循特定规范的Java类,主要用于创建可复用的...无论是简单的数据模型还是复杂的业务逻辑,都可以通过Java Bean来实现,使得Java应用程序的构建变得更加灵活和高效。

    xml和bean 互相转换

    在Java开发中,XML(可扩展标记语言)和Bean之间的互相转换是一项常见的任务,尤其是在处理配置文件、数据交换或者序列化场景中。本篇将详细阐述XML与Bean之间的转换过程,以及相关的Java技术。 首先,XML是一种...

    java反射以及复制一个bean的值到另一个bean中。

    复制一个bean的值到另一个bean中,通常是为了实现对象之间的深度克隆。Java没有内置的深拷贝机制,但可以通过反射实现。假设我们有两个 `Person` 类的实例 `person1` 和 `person2`,我们想要将 `person1` 的属性值...

    Spring Bean 加载顺序 .

    让我们详细探讨Spring Bean加载顺序的各个环节。 1. **配置源解析**: Spring支持多种配置方式,包括XML、Java配置类(@Configuration)、注解(@Component、@Service等)以及通过@ConfigurationProperties处理...

    使用JSP和Java Bean来构建一个网上书店

    此外,为了提高用户体验,还可以引入AJAX技术,实现页面的部分刷新,无需每次操作都完全加载新页面。 总的来说,使用JSP和Java Bean构建网上书店涉及到的技术点包括但不限于:Java Bean的设计与使用、JSP语法和内置...

    使用java类配置Bean

    在Spring框架中,Bean的配置方式主要有两种:XML配置和基于Java的配置。本文将深入探讨"使用java类配置Bean"这一主题,特别是在SIA实战项目中的应用。 首先,让我们理解Spring框架的核心概念——Bean。在Spring中,...

    java+bean分页技术

    在本主题“java + bean 分页技术”中,我们将深入探讨如何利用Java Bean实现高效的分页功能,这在处理大量数据时特别重要,能够提高网页的加载速度并优化用户体验。 分页技术的基本思想是将大数据集分割成多个小...

    JSP+SQLJava bean

    总的来说,JSP+SQL配合Java Bean可以有效地实现对各种数据库的访问和数据展示。无论是Access还是MySQL,或者其他支持JDBC的数据库,都可以通过类似的方式来建立连接,执行SQL查询,并利用Java Bean进行数据处理。在...

    JSP+JAVA BEAN实现的计数器程序.rar_计数器

    本示例中的“JSP+JAVA BEAN实现的计数器程序”是利用JavaServer Pages(JSP)技术和JavaBeans组件来创建一个简单的计数器应用。以下是对这个主题的详细说明: **JSP(JavaServer Pages)**: JSP是Sun Microsystems...

Global site tag (gtag.js) - Google Analytics