Bean就是Java里面的对象的实例,所以,class文件仅仅是对象的定义。
所以才需要按照定义创建(new)一个实例。
属性
class | 定义bean的类,必须要有 |
id | bean的名字 |
scope | bean作用域 |
constructor-arg | 构造器依赖注入用到的参数 |
property | 依赖注入的参数 |
autowire | 自动装配模式 |
lazy-initialization | bean第一次被请求时再初始化 |
init-method | bean初始化后执行的方法 |
destroy-method | bean销毁后执行的方法 |
abstract | 作为模版使用,和class冲突 |
parent | 指定父bean |
作用域
Bean对象在容器内生效的范围,是整个容器还是单个实例。
singleton | 在一个容器内只有一个实例(默认) |
prototype | 每次请求这个Bean都新创建一个 |
request | Bean存在于HTTP请求 |
session | Bean存在于HTTP会话 |
global-session | Bean存在于全局HTTP会话 |
例子:(先按照这里创建一个项目,或者下载我做好的)
在src/main/resources文件夹下创建Beans.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id='helloWorld' class='com.explause.SpringExamples.HelloWorld' scope='prototype'/>
</beans>
然后创建HelloWorld.java文件:
package com.explause.SpringExamples;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
}
最后的main函数入口BeanConfigDemo.java文件:
package com.explause.SpringExamples;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanConfigDemo {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld obj1 = (HelloWorld) context.getBean("helloWorld");
obj1.setMessage("Hello World");
obj1.getMessage();
HelloWorld obj2 = (HelloWorld) context.getBean("helloWorld");
obj2.getMessage();
context.close();
}
}
最终的项目结构:
执行main函数(方法)后的结果:
因为在singleton作用域下,一个容器内这个类型的对象只有一个实例,怎么返回都是返回同一个对象。
如果将作用域改成singleton,那么输出的两条消息都是一样的,即Hello World。
生命周期管理
Bean实例化之后可能需要做一些初始化工作,Bean从容器里移除之后也需要一些清理工作,
有两种方法,一种是在xml文件里配置,一种是实现两个接口。
xml文件里面定义的话就要在Bean的源码文件里写好函数(方法),然后在xml文件里配置
bean标签的init-method或destroy-method属性。
实现接口有InitializingBean和DisposableBean两个。
例子:
BeansLifeCycle.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id='helloWorld' class='com.explause.SpringExamples.HelloWorldLifeCycle' scope='singleton' init-method='init' destroy-method='end'>
<property name="message" value='Hello World'/>
</bean>
</beans>
HelloWorldLifeCycle.java文件:
package com.explause.SpringExamples;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class HelloWorldLifeCycle implements InitializingBean, DisposableBean {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
public void init() {
System.out.println("In the init method.");
}
public void end() {
System.out.println("In the end method.");
}
@Override
public void destroy() throws Exception {
System.out.println("In the destroy method.");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("In the afterPropertiesSet method.");
}
}
BeanLifeCycleDemo.java文件:
package com.explause.SpringExamples;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanLifeCycleDemo {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("BeansLifeCycle.xml");
HelloWorldLifeCycle obj1 = (HelloWorldLifeCycle) context.getBean("helloWorld");
obj1.getMessage();
context.close();
}
}
后期处理
通过BeanPostProcessor接口,可以放一些自定义逻辑,依赖解析等行为。也可以搭配Ordered接口配置多个实现。作为Bean配置在xml文件里面。
例子:在上面生命周期管理的例子里添加一个HelloWorldPostProcessor.java文件:
package com.explause.SpringExamples;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class HelloWorldPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeforeInitialization : " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("AfterInitialization : " + beanName);
return bean;
}
}
BeansLifeCycle.xml文件:
添加了注册HelloWorldPostProcessor的代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id='helloWorld' class='com.explause.SpringExamples.HelloWorldLifeCycle' scope='singleton' init-method='init' destroy-method='end'>
<property name="message" value='Hello World'/>
</bean>
<bean class="com.explause.SpringExamples.HelloWorldPostProcessor"/>
</beans>
Bean定义继承
子类设置parent属性,父类的同名属性会被子类覆盖,如果有的话。 还可以设置模版bean,没有class属性。
例子:
BeansParent.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id='helloWorld' class='com.explause.SpringExamples.HelloWorld'>
<property name="message" value='Hello World'/>
</bean>
<bean id='helloWorld2' class='com.explause.SpringExamples.HelloWorld2' parent='helloWorld'>
<property name="message2" value='Hello World 2'/>
</bean>
</beans>
HelloWorld.java文件:
package com.explause.SpringExamples;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
}
HelloWorld2.java文件:
package com.explause.SpringExamples;
public class HelloWorld2 {
private String message;
private String message2;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
System.out.println("Your Message 2 : " + message2);
}
public void setMessage2(String message2){
this.message2 = message2;
}
}
BeanParentDemo.java文件:
package com.explause.SpringExamples;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanParentDemo {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("BeansParent.xml");
HelloWorld obj1 = (HelloWorld) context.getBean("helloWorld");
obj1.getMessage();
HelloWorld2 obj2 = (HelloWorld2) context.getBean("helloWorld2");
obj2.getMessage();
context.close();
}
}