1,一切都是Bean
Bean是Spring应用程序中(其实是Spring容器中)的基本元素,在Spring框架上运行的应用程序,就是由一个又一个的Bean组合在一起、像搭积木一样堆出来的。所有的Bean都由Spring的核心容器负责管理、创建、销毁,同时Bean之间的相互依赖也由Spring容器中的依赖注入功能自动管理。1.1bean的作用域
lsingleton:定义bean的范围为每个Spring容器一个实例(默认值) lprototype:定义bean可以被多次实例化(使用一次就创建一次) lrequest:定义bean的范围是HTTP请求,只有再使用有web能力的spring上下文时有效。 lsession:定义bean的范围是HTTP会话,只有再使用有web能力的spring上下文时有效。 lglobal-session:定义bean的范围是全局HTTP会话,只有再portlet上下文中有效。1.2 三种实例化bean的方式
使用构造器实例化(默认无参数)
使用静态工厂方法实例化(简单工厂模式)
public class PersonFactory { public static Person getPersonInstance(){ return new Person(); } }使用实例工厂方法实例化(工厂方法模式)
public class PersonFactory{ public Person createtPersonInstance(){ return new Person(); } }
1.3 指定Bean的初始化方法和销毁方法spring初始化bean或销毁bean时有时候需要执行一些处理工作,因此spring可以在创建或者销毁bean时可以调用bean的两个生命周期方法
init-method="init"
destroy-method="distory" scope="singleton" />(注意的是只有scope=singleton的bean,destroy-method才有效)
1.4 bean 的生命周期
1.5 bean的继承实例化bean 设置属性值 设置bean名称(如果bean实现了BeanNameAware接口) 设置beanFactory(如果bean实现了BeanFactoryAware接口) 设置ApplicationContext(如果bean实现了ApplicationContextAware接口) 前预处理(如果上下文中存在多个BeanPostProcessor,将调用其postProcessBeforeInitialization()方法) 初始化Bean(如果bean实现了InitializingBean,将调用其afterPropertiesSet方法,如果bean声明了自定义初始化方法,调用) 后预处理(如果上下文中存在多个BeanPostProcessors,将调用其postProcessAfterInitialization()方法) Bean创建完成,待用 销毁Bean(如果bean实现了DisposableBean,调用其destroy()方法) 销毁Bean(如果bean声明了自定义的销毁方法,调用)
在spring的继承中不论在java类的实际情况中是否存在真正的extends继承关系,只要其存在引用相同的属性值,在spring的bean管理都可以将其抽象为继承关系。在spring的xml配置中可将引用相同属性的属性property抽出一个父类bean。该bean需要设计其abstract属性为true。其他“继承”该bean的bean需要制定其parent属性值为该抽象父类的id。如下在studentDao和teacherDao中都存在属性sf(SessionFactory),则可以抽出一个父类。
2,依赖注入(Dependency Injection)
所谓的依赖注入就是在于行期间,由外部容器动态的将依赖对象注入到组件中。通俗的讲也就是不在程序中显示的调用该类的setter()方法去设置该类的属性。而是由spring容器处理经过程序员配置的xml来设置该类的属性值。
所谓的控制反转(Inversion of Control)就是指应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转,目的是为了获得更好的扩展性和良好的可维护性。
通常的依赖注入有手工装配(配置xml)和自动装配(基于注解)的两种方式方式:
2.1通过setter方法注入依赖
元素的 子元素指明了使用该bean的setter方法来注入 1.可以使用property的value属性来进行简单类型的注入
2.使用ref引用其他的bean
3.内部bean
使用该方式的缺点就是无法在其他地方使用这个类,该类只能为外部的bean使用。
4.装配集合
set1 set2 prop1 prop2 01=prop1 02=prop2 5.设空值null
6,自定义String2Object类型转换器来设置属性在该属性类的同一包下面创建类 名称 PropertyClassNameEditor,并继承PropertyEditorSupport类,复写其setAsText(String text)方法即可。
例如给Family类的Person类属性创建一个String2Person类的类型转换器。
public class PersonEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { if(text!=null){ String[] props = text.split("-"); if(props!=null && props.length == 3){ Person p = new Person(); p.setId(Long.parseLong(props[0])); p.setName(props[1]); p.setMail(props[2]); this.setValue(p); } } } }Family类:
public class Family { private Person master; public void setMaster(Person master) {
