一、Bean实例化
1、创建类:MyDao.java,写一个方法,输出xixi。代码如下:
public class MyDao {
public void mytest(){
System.out.println("xixi");
}
}
2、创建测试类:TestSpring.java,写一个方法,在方法内实例化MyDao,并调用mytest方法。
2.1 配置MyDao类Bean的实例化,在applicationContext.xml文件中配置。代码如下:
<bean id="myDao" class="com.xuexue.model.dao.MyDao" scope="prototype"></bean>
注:id:取得的名字,一般都是类名的首字母小写,其他均与类名相同。
class:这个bean实例化的是哪个类的对象。
scope:Spring是按照单例模式来管理对象的,若不想要单例模式,给属性赋值为prototype。(singleton这个是单例,默认值)
2.2 建立一个测试类TestSpring.java中启动Spring容器,并向容器要一个MyDao的实例化对象。代码如下:
public class TestSpring {
public void mytest(){
//1.在xml中配置bean,在上一步我们已经配置好了
//2.启动spring容器 传参是找到applicationContext.xml配置文件的路径
ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
//3.跟容器要一个MyDAO的实例
MyDao myDao=(MyDao)context.getBean("myDao");//传参是配置文件中id属性的值
//4.调用mytest方法
myDao.mytest();
//我们再实例化一个对象,输出两个对象的地址值
MyDao myDao2=(MyDao)context.getBean("myDao");
System.out.println(myDao);
System.out.println(myDao2);
//控制台上输出对象,两个地址是一样的,说明spring是按照单例模式来管理对象的
}
}
注:ApplicationContext 接口:
1、ClassPathXmlApplicationContext:从类路径ClassPath中寻找指定的XML配置文件,找到并装载。
完成ApplicationContext的实例化工作
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
如果有多个spring配置文件也可以传一个数组。
String[] str= {"配置文件1.xml","配置文件2.xml","配置文件3.xml"};
ApplicationContext cxt = new ClassPathXmlApplicationContext(str);
2、FileSystemXmlApplicationContext: 从指定的文件系统路径中寻找指定的XML配置文件,找到并装载。
3、WebApplicationContext:是专门为 WEB 应用而准备的,从Web应用中寻找指定的XML配置文件,找到并装载。
二、Bean实例化的几个方法
1、构造器方式实例化
上诉代码即是一个简单的构造器实例化例子。
2、静态工厂方式实例化
2.1 建一个类,写一个实例化对象的静态方法。代码如下:
public class MyStaticFactory {
//静态工厂模式实例化对象
static int count=0;
public static MyDao getInstance(){
if(count<2){
count++;
return new MyDao();
}else{
return null;
}
}
}
只能创建2个对象,超过2个,返回空值
2.2 使用静态工厂的方式实例化MyDao的配置。代码如下:
<!-- id是取得名字,calss写的是工厂的类名,factory写的是方法名, scope属性必须赋值prototype,因为不是单例-->
<bean id="myStaticFactory" class="com.xuexue.model.factory.MyStaticFactory" factory-method="getInstance" scope="prototype"></bean>
2.3 写测试类测试一下。代码如下:
public class TsetSpring {
public static void main(String[] args) {
//启动Spring容器
ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
//跟spring容器要三个MyDao实例化对象
MyService myDao1=(MyDao)context.getBean("myStaticFactory");//入参是配置信息的id
MyService myDao2=(MyDao)context.getBean("myStaticFactory");
MyService myDao3=(MyDao)context.getBean("myStaticFactory");
System.out.println(myDao1);
System.out.println(myDao2);
System.out.println(myDao3);
}
}
这样创建对象可以控制数量,第三个对象输出的就是空值了
3、工厂方式实例化
3.1 建一个类,写一个实例化对象的方法。代码如下:
public class MyFactory {
//工厂模式实例化对象
int count=0;
public MyDao getInstance(){
if(count<2){
count++;
return new MyDao();
}else{
return null;
}
}
}
与静态工厂方式相比,在写法上的不同在于少了static修饰。
3.2 使用工厂的方式实例化MyDao的配置。代码如下:
与静态工厂的配置相比,工厂方式需要先实例化一个工厂的对象,之后才能实例化MyDao对象
<!--配置工厂的对象 id是取得名字 class是工厂类所在的路径-->
<bean id="myFactory" class="com.xuexue.model.factory.MyFactory"></bean>
<!--配置MyDao id是要实例化factory-bean是工厂bean的id,factory-method是方法名-->
<bean id="myDao" factory-bean="myFactory" factory-method="getInstance" scope="prototype"></bean>
3.3 写测试类测试一下。代码如下:
public class TsetSpring {
public static void main(String[] args) {
//启动Spring容器
ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
//跟spring容器要三个MyDao实例化对象
MyService myDao1=(MyDao)context.getBean("myDao");//入参是配置对象信息的id,不是工厂的
MyService myDao2=(MyDao)context.getBean("myDao");
MyService myDao3=(MyDao)context.getBean("myDao");
System.out.println(myDao1);
System.out.println(myDao2);
System.out.println(myDao3);
}
}