Spring从核心而言就是一个DI(依赖注入)容器,其核心的核心就是Bean的封装机制:BeanWrapper(Bean的封装包)和Bean Factory(Bean工厂)
1.[color=brown]Bean Wrapper[/color]
Bean Wrapper及Bean Factory的底层是通过java.lang.reflect机制来实现的
Class cla = Class.forName("com.tianye.Student");
Object obj = (Object)cla.newInstance();
Method method = cla.getMethod("setName",new Class[]{String.class});
method.invoke(obj,new Object[]{"TianYe"});
利用Bean Wrapper来操作一个Bean实例:
public static void TestBeanWrapper(){
try{
Object obj = Class.forName("com.tianye.Student").newInstance();
BeanWrapper bw = new BeanWrapperImpl(obj);
bw.setPropertyValue("name","TianYe");
System.out.println(bw.getPropertyValue("name"));
}catch(Exception e){
e.printStackTrace();
}
}
BeanWrapper 需要逐个的对属性设置值,操作起来比较繁琐,而且只是针对单个Bean进行的操作,BeanWrapper不是很常用,在此基础上出现了BeanFactory
2.[color=brown]BeanFactory[/color]
BeanFactory对Bean的操作是通过配置文件来完成的,BeanFactory在配置文件中可以配置的项目:
(1) Bean属性值及依赖关系
(2) Bean的创建模式(是否为singleton)
(3) Bean的初始化及销毁方法
(4) Bean的依赖关系
[color=blue] <bean>[/color]标签中的属性及用法
[color=red]id[/color]: 是Bean在BeanFactory中的一个唯一的标识,在代码中以此作为索引名称来获取Bean实例的
[color=red]class[/color]:类名(类的路径---包名.类名)
[color=red]singleton[/color]: singleton="false"的时候表示该类不是单例Bean是多利Bean,多线程访问的时候,会获取到多个不同的Bean实例 singleton="true"的时候表示该类是单例Bean,多线程访问的时候只可以获取到一个Bean实例
[color=red]lazy-init[/color]:为"true"的时候表示在spring容器启动的时候不用加载该Bean,只要第一次获取Bean实例的时候才加载该Bean, 为"false"的时候则是在spring容器启动的时候就被加载,利用该属性可以优化spring容器的启动速度
该属性只针对于单例Bean起作用,当singleton="false"的时候系统抛出异常
init-method:初始化方法,在BeanFactory创建Bean实例后执行该方法
destroy-method:销毁方法,在Bean销毁的时候调用,一般用于资源释放
[color=blue]<property>[/color]标签中的属性及用法
<value>节点:用于指定一个属性的值,BeanFactory会自动进行类型匹配
<ref>节点:指定了属性对BeanFactory中其他Bean的引用关系(即一个Bean中的属性或方法中的参数是另一个Bean的对象或是Interface对象),由接口的实现类来完成注入
<null>节点:当Bean中的属性值要设为 null 的时候,就需要使用到<null/>子节点
利用BeanFactory来获取Bean实例:
InputStream is = new FilleInputStream("bean.xml");
XmlBeanFactory xbf = new XmlBeanFactory(is);
IHello ihello = (IHello)xbf.getBean("hello");
BeanFactory实现了对多个Bean的管理
1.[color=brown]Bean Wrapper[/color]
Bean Wrapper及Bean Factory的底层是通过java.lang.reflect机制来实现的
Class cla = Class.forName("com.tianye.Student");
Object obj = (Object)cla.newInstance();
Method method = cla.getMethod("setName",new Class[]{String.class});
method.invoke(obj,new Object[]{"TianYe"});
利用Bean Wrapper来操作一个Bean实例:
public static void TestBeanWrapper(){
try{
Object obj = Class.forName("com.tianye.Student").newInstance();
BeanWrapper bw = new BeanWrapperImpl(obj);
bw.setPropertyValue("name","TianYe");
System.out.println(bw.getPropertyValue("name"));
}catch(Exception e){
e.printStackTrace();
}
}
BeanWrapper 需要逐个的对属性设置值,操作起来比较繁琐,而且只是针对单个Bean进行的操作,BeanWrapper不是很常用,在此基础上出现了BeanFactory
2.[color=brown]BeanFactory[/color]
BeanFactory对Bean的操作是通过配置文件来完成的,BeanFactory在配置文件中可以配置的项目:
(1) Bean属性值及依赖关系
(2) Bean的创建模式(是否为singleton)
(3) Bean的初始化及销毁方法
(4) Bean的依赖关系
[color=blue] <bean>[/color]标签中的属性及用法
[color=red]id[/color]: 是Bean在BeanFactory中的一个唯一的标识,在代码中以此作为索引名称来获取Bean实例的
[color=red]class[/color]:类名(类的路径---包名.类名)
[color=red]singleton[/color]: singleton="false"的时候表示该类不是单例Bean是多利Bean,多线程访问的时候,会获取到多个不同的Bean实例 singleton="true"的时候表示该类是单例Bean,多线程访问的时候只可以获取到一个Bean实例
[color=red]lazy-init[/color]:为"true"的时候表示在spring容器启动的时候不用加载该Bean,只要第一次获取Bean实例的时候才加载该Bean, 为"false"的时候则是在spring容器启动的时候就被加载,利用该属性可以优化spring容器的启动速度
该属性只针对于单例Bean起作用,当singleton="false"的时候系统抛出异常
init-method:初始化方法,在BeanFactory创建Bean实例后执行该方法
destroy-method:销毁方法,在Bean销毁的时候调用,一般用于资源释放
[color=blue]<property>[/color]标签中的属性及用法
<value>节点:用于指定一个属性的值,BeanFactory会自动进行类型匹配
<ref>节点:指定了属性对BeanFactory中其他Bean的引用关系(即一个Bean中的属性或方法中的参数是另一个Bean的对象或是Interface对象),由接口的实现类来完成注入
<null>节点:当Bean中的属性值要设为 null 的时候,就需要使用到<null/>子节点
利用BeanFactory来获取Bean实例:
InputStream is = new FilleInputStream("bean.xml");
XmlBeanFactory xbf = new XmlBeanFactory(is);
IHello ihello = (IHello)xbf.getBean("hello");
BeanFactory实现了对多个Bean的管理