1IOC:Inverse of Control 控制反转,两个关键词
控制反转:获得依赖对象的过程被反转了,即A类要调用B类时,一般是B b=new B();这时A获得B的方式是A主动去创建B,控制反转后,A不再主动创建B,而是IOC容器在需要的时候为A创建B
2 spring根据配置文件就可以实例化并装配好bean,要归功于Java反射技术
3 java语言允许通过程序化的方式间接对class进行操作,class文件由类装载器装载后,在JVM中生成一份描述calss结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数、属性和方法。Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能
CarReflectTest.java
package lyf;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class CarReflectTest {
public static Car initCarByDefaultConst() throws Throwable {
//通过类装载器获取Car对象
ClassLoader loader=Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("lyf.Car");
//获取类的默认构造器对象,并通过它实例化Car
Constructor cons=clazz.getDeclaredConstructor((Class[])null);
Car car= (Car)cons.newInstance();
//通过反射方法设置属性
Method setBrand =clazz.getMethod("setBrand",String.class);
setBrand.invoke(car,"红旗CA72");
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 car1 = initCarByDefaultConst();
car1.introduce();
}
}
Car.java
package lyf;
public class Car {
private String brand;
private String color;
private int maxSpeed;
public Car(){System.out.println("init 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;
}
}
3.1 类装载器ClassLoader
它负责在运行时查找和装入Class字节码文件。JVM运行时会产生3个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)、AppClassLoader(系统类装载器)
根装载器:不是ClassLoader的子类,负责装载JRE的核心类库,它使用C++编写,在java中访问不到
ExtClassLoader:负责装载JRE扩展目录ext中的JAR包
AppClassLoader:负责装载calsspath路径下的类包,默认情况下使用它装载应用程序的类
3.2 对于private或protected的成员变量或方法,只要JVM的安全机制允许,也可以使用反射机制访问
4 BeanFactory和ApplicationContext
com.springframework.beans.factory.BeanFactory
com.springframework.context.ApplicationContext
BeanFactory是Spring框架的基础设施,面向Spring本身
ApplicationContext面向使用spring框架的开发者,几乎所有的应用场合我们都直接使用ApplicationContext,而非底层的BeanFactory
4.1 BeanFactory介绍
BeanFactory是类的通用工厂,和传统的工厂不同,传统的工厂仅负责构造一个或几个类的实例,而BeanFactory可以创建并管理各种类的对象,
使用spring时,要提供一个日志框架,这样启动spring容器才不会报错
4.2 ApplicationContext介绍
ApplicationContext的主要实现类是
ClassPathXmlApplicationContext:默认从类路径加载配置文件
FileSystemXmlApplicationContext:默认从文件系统加载配置文件
ApplicationContext的初始化和BeanFactory有很大的区别
BeanFactory在初始化容器时,并未实例化bean,直到第一次访问某个bean时才实例目标Bean
而ApplicationContext在初始化应用上下文时就实例化所有单实例的Bean
4.3 WebApplicationContext
WebApplicationContext需要ServletContext实例,它必须在拥有Web容器的前提下才能完成启动的工作,可以在web.xml中配置自启动的servlet或定义Web容器监听器(ServletContextListener)
org.springframework.web.context.ContextLoaderServlet
org.springframework.web.context.ContextLoaderListener
spring需要使用日志框架,把日志配置文件放在类路径WEB-INF/class下,在myeclipse下只需要放在一个source folder中即可,这样就不要进行其他配置就可以顺利启动,如果日志配置文件放在了其他位置,就需要在web.xml中指定配置文件的位置