bean的创建方式:
1、调用构造器创建bean
package cn.itouchtv;
public class News {
private String title;
private String content;
private int viewCnt;
private int likeCnt;
public News(String title, String content, int viewCnt, int likeCnt) {
this.title = title;
this.content = content;
this.viewCnt = viewCnt;
this.likeCnt = likeCnt;
}
public News() {
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
public int getViewCnt() {
return viewCnt;
}
public int getLikeCnt() {
return likeCnt;
}
}
调用无参数构造器创建bean:这种方式是通过property标签来为属性赋值。
调用有参数构造器创建bean:通过对应的构造器,参数的顺序即为赋值的顺序。
2、通过静态工厂方法来创建
首先有个工厂类:
public class StaticFactory {
public static News getNews(String title,String content,int viewCnt,int likeCnt){
return new News(title,content,viewCnt,likeCnt);
}
}
xml文件中的配置:
这里指定的类为工厂类,还要指定factory-method对应的静态方法,使用constructor-arg来为静态方法传参数,这里发现实例的创建不再是通过容器,而是通过用户自己定义的工厂方法来创建,不过之后,bean和其他方式创建的bean没什么区别,都是由spring来管理。
3、通过实例工厂方法来创建bean:
同样需要工厂类:不过这次创建实力的方法为实力方法,不再是静态方法。
package cn.itouchtv;
public class InstanceFactory {
public News getNews(String title,String content,int viewCnt,int likeCnt){
return new News(title,content,viewCnt,likeCnt);
}
}
xml的配置,其实要调用InstanceFactory 的方法来创建bean,首先得创建工厂,具体配置:
4、通过FactoryBean来创建
实现Spring提供的FactoryBean接口
package cn.itouchtv;
import org.springframework.beans.factory.FactoryBean;
public class NewsFactoryBean implements FactoryBean {
private String title;
private String content;
private int viewCnt;
private int likeCnt;
/**
* 返回的bean
* @return
* @throws Exception
*/
@Override
public Object getObject() throws Exception {
return new News(title,content,viewCnt,likeCnt);
}
/**
* 该对象的类型
* @return
*/
@Override
public Class> getObjectType() {
return News.class;
}
/**
* 是否单实力
* @return
*/
@Override
public boolean isSingleton() {
return true;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getViewCnt() {
return viewCnt;
}
public void setViewCnt(int viewCnt) {
this.viewCnt = viewCnt;
}
public int getLikeCnt() {
return likeCnt;
}
public void setLikeCnt(int likeCnt) {
this.likeCnt = likeCnt;
}
}
xml的配置:
以上是四种创建bean的方式。
bean的生命周期:
bean的生命周期的管理是针对单实例singleton的bean来说的,IOC容器知道它的创建,初始化和销毁;对于多实例prototype的bean,IOC容器只知道创建,创建后就不再由容器管理了。
举个例子吧:
package cn.itouchtv;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class News implements InitializingBean,DisposableBean{
private String title;
private String content;
private int viewCnt;
private int likeCnt;
public News(String title, String content, int viewCnt, int likeCnt) {
this.title = title;
this.content = content;
this.viewCnt = viewCnt;
this.likeCnt = likeCnt;
}
@Override
public void destroy() throws Exception {
System.out.println("DisposableBean destory...");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet 方法");
}
public News() {
System.out.println("调用构造器。。。");
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
public int getViewCnt() {
return viewCnt;
}
public int getLikeCnt() {
return likeCnt;
}
public void setTitle(String title) {
System.out.println("设置属性。。。");
this.title = title;
}
public void setContent(String content) {
this.content = content;
}
public void setViewCnt(int viewCnt) {
this.viewCnt = viewCnt;
}
public void setLikeCnt(int likeCnt) {
this.likeCnt = likeCnt;
}
public void initItouchtv(){
System.out.println("初始化操作。。。。");
}
public void myDestory(){
System.out.println("銷毀方法。。。");
}
}
这里的initItouchtv方法是个初始化方法,News类实现了InitializingBean接口,对于调用
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
时,输出结果为:
调用构造器。。。
设置属性。。。
afterPropertiesSet 方法
初始化操作。。。。
DisposableBean destory...
銷毀方法。。。
调用构造器-》设置属性-》afterPropertiesSet 方法-》初始化操作=》DisposableBean destory=》銷毀方法
这里要注意的是afterPropertiesSet和init都是初始化方法,但是afterPropertiesSet会先执行
destory和myDestory都是销毁方法,但是DisposableBean 的destory会先执行。