Spring3.x企业应用开发_IOC

Ioc概念:

包括两个内容:控制&反转

对于软件来说,是某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定。DI(依赖注入:Dependency Injection)即让调用类对某一接口实现类的依赖由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。

Ioc类型:从注入方法上看,主要可以划分为三种类型:构造函数注入、属性注入和接口注入。

反射在Ioc中的应用,小例子:

Car.class

package com.wiseweb.ioc;

public class Car {

	private String brand ;

	private String color ;

	private int maxSpeed ;

	public Car(){}

	public Car(String brand, String color, int maxSpeed) {
		this.brand = brand ;
		this.color = color ;
		this.maxSpeed = maxSpeed ;
	}

	public void introduce() {
		System.out.println("brand:" + brand + ";color:" +color + ";maxSpeed" + maxSpeed);
	}
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public int getMaxSpeed() {
		return maxSpeed;
	}
	public void setMaxSpeed(int maxSpeed) {
		this.maxSpeed = maxSpeed;
	}

}

ReflectTest.class

package com.wiseweb.ioc;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectTest {
	public static Car initByDefaultConst() throws Throwable {
		ClassLoader loader = Thread.currentThread().getContextClassLoader() ;
		Class clazz = loader.loadClass("com.wiseweb.ioc.Car") ;

		Constructor cons = clazz.getDeclaredConstructor((Class[])null) ;
		Car car = (Car)cons.newInstance() ;

		Method setBrand = clazz.getMethod("setBrand", String.class) ;
		setBrand.invoke(car, "红旗") ;
		Method setColor = clazz.getMethod("setColor", String.class) ;
		setColor.invoke(car, "黑色") ;
		Method setMaxSpeed = clazz.getMethod("setMaxSpeed", int.class) ;
		setMaxSpeed.invoke(car, 200) ;
		return car ;
	}

	public static void main(String[] args) throws Throwable {
		Car car = initByDefaultConst() ;
		car.introduce() ;
	}
}

输出:brand:红旗;color:黑色;maxSpeed200

类装载器ClassLoader的工作机制:类装载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤:

1、装载:查找和导入class文件;

2、链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的:

a、校验:检查载入class文件数据的正确定;

b、准备:给类的静态变量分配存储空间;

c、解析:将符号引用转成直接引用;

3、初始化:对类的静态变量、静态代码块执行初始化工作。

类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入Class字节码文件。JVM在运行时会产生三个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoder(系统类装载器)。其中,根装载器不是ClassLoader子类,它使用c++编写,因此我们在java中看不到它,根装载器负责装载JRE的核心类库,如JRE目标下的rt.jar、charsets.jar等。ExtClassLoader和AppClassLoader都是ClassLoader的子类。其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包;AppClassLoader负责装载Classpath路径下的类包。

这三个类装载器之间存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器。默认情况下,使用AppClassLoader装载应用程序的类。

package com.wiseweb.ioc;

public class ClassLoaderTest {
	public static void main(String[] args) {
		ClassLoader loader = Thread.currentThread().getContextClassLoader() ;
		System.out.println("current loader:" + loader);
		System.out.println("parent loader:" + loader.getParent());
		System.out.println("grandparent loader:" + loader.getParent().getParent());
	}
}

输出:current loader:[email protected]

parent loader:[email protected]

grandparent loader:null

JVM装载类时使用“全盘负责委托机制”,“全盘负责”是指当一个ClassLoader装载一个类时,除非显示地使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader载入;“委托机制”是指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点是从安全角度考虑的,试想如果有人编写了一个恶意的基础类(如java.lang.String)并装载到JVM中将会引起多么可怕的后果。但是由于有了“全盘负责委托机制”,java.lang.String永远是由根装载器来装载的,这样就避免了上述时间的发生。

时间: 2024-12-15 01:49:54

Spring3.x企业应用开发_IOC的相关文章

《Spring3.X企业应用开发实战》学习笔记--SpringMVC

本篇是<Spring3.X企业应用开发实战>,陈雄华 林开雄著,电子工业出版社,2012.2出版"的学习笔记的第三篇,关于SpringMVC. Spring MVC 3.0和早期版本相比拥有了一个质的飞跃,全面支持REST风格的WEB编程.完全注解驱动.处理方法签名非常灵活.处理方法不依赖于Servlet API等. 由于Spring MVC框架在后头做了非常多的隐性工作,所以想深入掌握Spring MVC 3.0并非易事,本章我们在学习Spring MVC的各项功能时,还深入其内部

《Spring3.X企业应用开发实战》学习笔记--DAO和事务

本篇是"<Spring3.X企业应用开发实战>,陈雄华 林开雄著,电子工业出版社,2012.2出版"的学习笔记的第二篇,关于DAO和事务. 本篇从DAO操作,以及事务处理的基本知识谈起,介绍事务本身,以及Spring如何通过注解实现事务. DAO 近几年持久化技术领域异常喧嚣,各种框架如雨后春笋般地冒出,Sun也连接不断的颁布了几个持久化规范. Spring对多个持久化技术提供了持久化支持,包括Hibernate,iBatis,JDO,JPA,TopLink,另外,还通过S

Spring3.x企业应用开发实战1.环境搭建

书中搭建得环境是spring3.x,我选择得是spring 4.2.5.RELEASE系列得jar包搭建.记录下其中遇到得问题 1.jar包选择: spring4.x中没有spring-asm 和 spring web-servlet这两个jar包,因为 asm这个包已经在spring4.x得core包中包含 web-servlet 在spring4.下得webmvc中包含 2.环境搭建至书上得30页之后,用junit测试一直是空指针异常,在检查applicationContext.xml中确保

Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)

注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先设置一下授权回调域.这里瞬间想到之前做JSSDK的时候,也设置过一个域名.二者本质上都是设置可信域名. 当用户授权完毕之后,请求将重定向到此域名(或者子域名)下的执行者(jsp页面或者servlet等).如何设置授权回调域,请见第二节. 1.2 获取Code https://open.weixin.

第八章 企业项目开发--分布式缓存memcached

注意:本节代码基于<第七章 企业项目开发--本地缓存guava cache> 1.本地缓存的问题 本地缓存速度一开始高于分布式缓存,但是随着其缓存数量的增加,所占内存越来越大,系统运行内存越来越小,最后系统会被拖慢(这一点与第二点联系起来) 本地缓存存于本机,其缓存数量与大小受本机内存大小限制 本地缓存存于本机,其他机器的访问不到这样的缓存 解决方案:分布式缓存 Jboss cache:缓存还存于本机,但是会同步更新到其他机器(解决了第三个问题,解决不了第一和第二个问题),如果缓存机器数量很多

Java企业微信开发_03_通讯录同步

一.本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步”  ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取或者编辑通讯录. 获取通讯录密钥的目的: 通过企业ID(CorpId)和 通讯录密钥可以获取通讯录相关接口的使用凭证(AccessToken).有了AccessToken,就可以使用通讯录相关接口了. 凭证的获取方式有两种(此处暂时存疑,以待勘误): 通讯录AccessToken:CorpId+通讯录密钥 其

企业搜索引擎开发之连接器connector(二十八)

通常一个SnapshotRepository仓库对象对应一个DocumentSnapshotRepositoryMonitor监视器对象,同时也对应一个快照存储器对象,它们的关联是通过监视器管理对象DocumentSnapshotRepositoryMonitorManagerImpl实现的 DocumentSnapshotRepositoryMonitorManagerImpl类要实现那些行为,先查看其实现接口DocumentSnapshotRepositoryMonitorManager定义

企业搜索引擎开发之连接器connector(二十七)

ChangeQueue类实现ChangeSource接口,声明了拉取下一条Change对象的方法 * A source of {@link Change} objects. * * @since 2.8 */ public interface ChangeSource { /** * @return the next change, or {@code null} if there is no change available */ public Change getNextChange();

企业搜索引擎开发之连接器connector(二十二)

下面来分析线程执行类,线程池ThreadPool类 对该类的理解需要对java的线程池比较熟悉 该类引用了一个内部类 /** * The lazily constructed LazyThreadPool instance. */ private LazyThreadPool lazyThreadPool; 该成员实现了单例模式,即该对象只有一个实例,属于懒汉式单例模式,当实例化该成员时,启用了线程同步机制 /** * Shut down the {@link ThreadPool}. Afte