一、配置项
1.id
2.class (必要)
3.scope (作用域)
3.constuctor arguments (构造器参数)
4.properties
5.autowiring mode (自动装配模式)
6.lazy-initialization (懒加载模式)
7.initialization / Destruction method (初始化/销毁方法)
二、作用域
1.Singleton: 单例,一个Bean容器中只存在一个实例
2.prototype: 每次请求都创建一个新的实例,destroy不生效只在GC回收
3.request: 每次http请求只创建一个实例,且只在该request内有效
4.session: 类似request
5.global session: 主要用于多系统集成、单点登录等,类似session
配置实例:
<bean id="testBean" class="org.znufe.Bean.testBean" scope="singleton"></bean>
三、生命周期
1.定义
2.初始化
3.Service
4.销毁
可以配置自定义初始化/销毁方法,在创建实例前或者销毁实例前调用。
(1) 通过配置单个bean的init-method / destory-method属性指向自定义方法
注:如果类中无指定方法会报错。
<bean id="testBean" class="org.znufe.Bean.testBean" init-method="myInit()"></bean>
public class testBean { public void myInit() { } }
(2)单个bean通过实现org.springframework.beans.factory.InitializingBean接口,覆盖afterPropertiesSet方法自定义初始化;
或者实现org.springframework.beans.factory.DisposableBean接口,覆盖destory方法
public class testBean implements InitializingBean { @Override public void afterPropertiesSet() throw Exception{ } }
public class testBean implements DisposableBean { @Override public void destory() throw Exception{ } }
(3)配置文件中出现的所有bean设置全局默认初始化或销毁方法
注:类中可以没有全局方法
<beans …… …… …… …… default-init-method="myInit" default-destory-method="myDestory" >
</beans>
注:如果用多种方式设置指定初始化/销毁方法,执行顺序是先执行接口的方法然后执行配置文件指定方法;全局默认方法只会在前两者都没有时执行。
四、利用Aware获取资源
1.Aware类型与对应资源
2.基本用法(实现对应接口,覆盖接口中的方法)
例1:假设已配置好MyApplication并命名为myApplication,ApplicationContextAware用法如下
public class MyApplication implements ApplicationContextAware { @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeanExceprion { System.out.println(applicationContext.getBean("myApplication"); } }
例2:假设已配置好MyBeanName并命名为myBeanName,BeanNameAware用法如下
public class MyBeanName implements BeanNameAware { @Override public void setApplicationContext(String beanName) { System.out.println("MyBeanName: " + beanName ); } }
3.进阶用法
先获取容器中的Bean然后把该Bean的Name传给容器资源,再利用容器资源与传入的Name再次获取Bean
public class MyAware implements BeanNameAware, ApplicationAware { private String beanName; @Override public void setBeanName(String name) { this.beanName = name; System.out.println("BeanName: " + name); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeanException { System.out.println("ApplicationContext: " + applicationContext.getBean(this.beanName)); } }
五、注入方式
事先配好两个bean,MyWiringService与MyWiringDAO。
<beans …… …… …… …… > <bean id="myWiringService" class="org.znufe.Bean.MyWiringService"> <property name="myWiringDAO" ref="myWiringDAO"></property> </bean> <bean id="myWiringDAO" class="org.znufe.Bean.MyWiringDAO"></bean> </beans>
public class MyWiringService { private MyWiringDAO myWiringDAO; public void Greet(String word) { this.myWiringDAO.Greet(word); } }
public class MyWiringDAO { public void Greet(String word) { System.out.println("DAO Greets: " + word); } }
测试方法如下
public void test() {
MyWiringService myWiringService = super.getBean("myWiringService");
myWiringService.Greet("Hello World!");
}
设置全局注入方式之后,可以简化bean的配置,比如在MyWiringService中增加对属性myWiringDAO的Setter方法并配置了全局注入方式(byName或者byType),可以去掉对属性myWiringDAO的配置;或者在MyWiringService中增加包含MyWiringDAO类型参数的构造函数,并配置了全局注入方式(constructor),可以去掉对属性myWiringDAO的配置。
下图为byName或者byType的配置方式
<beans …… …… …… …… default-autowire="xxxxxx"> <bean id="myWiringService" class="org.znufe.Bean.MyWiringService"></bean> <bean id="myWiringDAO" class="org.znufe.Bean.MyWiringDAO"></bean> </beans>
public class MyWiringService { private MyWiringDAO myWiringDAO; public void setMyWiringService(MyWiringDAO myWiringDAO) { System.out.println("Run Service Setter."); this.myWiringDAO = myWiringDAO; } public void Greet(String word) { this.myWiringDAO.Greet(word); } }
输出结果:
Run Service Setter.
DAO Greets: Hello World!
1.byName方式执行test()
把XML配置的bean的id与myWiringService一致的bean注入到myWiringService,然后调用myWiringService.Greet();
myWiringService.Greet()实际调用了myWiringDAO.Greet(),myWiringDAO又是通过同样查找id的方式注入的。
2.byType方式执行test()
把XML配置的bean的class类型(bean的id有无或者id值不会影响注入)与MyWiringService一致的bean注入到myWiringService,然后调用myWiringService.Greet();
myWiringService.Greet()实际调用了myWiringDAO.Greet(),myWiringDAO又是通过同样查找class的方式注入的。
下图为constructor的注入方式配置
<beans …… …… …… …… default-autowire="constructor"> <bean id="myWiringService" class="org.znufe.Bean.MyWiringService"></bean> <bean id="myWiringDAO" class="org.znufe.Bean.MyWiringDAO"></bean> </beans>
public class MyWiringService { private MyWiringDAO myWiringDAO; public MyWiringService(MyWiringDAO myWiringDAO) { System.out.println("Run Service Constructor."); this.myWiringDAO = myWiringDAO; } public void Greet(String word) { this.myWiringDAO.Greet(word); } }
输出结果:
Run Service Constructor.
DAO Greets: Hello World!
3.constructor方式执行test()
把XML配置的bean的id与myWiringService一致的bean注入到myWiringService,然后调用myWiringService.Greet();
myWiringService.Greet()实际调用了myWiringDAO.Greet(),myWiringDAO则是在myWiringService的构造器中通过查找构造器参数类型(类似byType)的bean被注入;
所以MyWiringDAO这个bean配置的id不会对注入过程造成影响。