bean 实例化的三种方式实现:
第一种:使用类的无参数构造创建(第一种是重点,第二三种已经没太多人用了)
目录树:
1.首先定义一个 bean:
bean1.java:
package com.spring.demo;
public class Bean1 {
public void print(){
System.out.println("Bean1......");
}
}
这个bean只有一个print方法
2.在Spring配置文件Bean.xml 中 配置 bean:
<?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.xsd">
<!-- 关键部分 -->
<bean id="bean1" class="com.spring.demo.Bean1"></bean>
</beans>
<bean id = “bean1” class="com.spring.demo.Bean1"></bean>:
id 为 在 xml 里的这个 bean的标识。 class 为xml 里的这个bean 绑定的java类(bean)的全路径(包名+类名)
这个标签会自动寻找 Bean1类中的无参数构造函数来创建对象
3.测试代码从配置文件中取出Bean1对象:
package com.spring.demo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TextIoc {
@Test
public void textUser()
{
//1.获取spring文件
ApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");
//2.由配置文件返回对象
Bean1 b = (Bean1)context.getBean("bean1");
System.out.println(b);
b.print();
}
}
getBean() 返回的就是由spring 实例化的对象。
结果是:打印返回的对象b,和调用 b 的print()方法
第二种:使用静态工厂创建
1.定义一个bean:
bean2.java:(就是要创建这个类的对象)
package com.spring.demo;
public class Bean2 {
public void print(){
System.out.println("Bean2......");
}
}
2.配置spring的配置文件
<?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.xsd">
<!-- 关键部分 -->
<bean id="bean2" class="com.spring.demo.Bean2Factory" factory-method="getBean2"></bean>
</beans>
<bean id="bean2" class="com.spring.demo.Bean2Factory" factory-method="getBean2"></bean>:
表示创建的对象(bean)用bean2指代,使用到的class(类)为com.spring.demo 包 下的Bean2Factory类(作为工厂类)
factory-method = "getBean2"表示调用 class 下的 getBean2方法来创建对象(而且factory-method指定的方法必须为static静态方法)
3.定义静态工厂类
package com.spring.demo;
public class Bean2Factory {
public static Bean2 getBean2(){
return new Bean2();
}
}
注意静态工厂类的创建对象方法为静态
4.测试代码:
public class TextIoc {
@Test
public void textUser()
{
//1.获取spring文件
ApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");
//2.由配置文件返回对象
Bean3 b = (Bean2)context.getBean("bean2");
System.out.println(b);
b.print();
}
}
第三种:使用实例工厂创建
1.定义一个bean:
package com.spring.demo;
public class Bean3 {
public void print(){
System.out.println("Bean3......");
}
}
2.配置spring的配置文件:
<?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.xsd">
<!-- 关键部分 -->
<bean id="bean3factory" class="com.spring.demo.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3factory" factory-method="getBean3"></bean>
</beans>
第八行:<bean id="bean3factory" class="com.spring.demo.Bean3Factory"></bean> :为在xml配置文件中定义一个bean,这个bean的id 为bean3factory ,创建所用到的类(class)为com.spring.demo 包下的 Bean3Factory类
第九行:<bean id="bean3" factory-bean="bean3factory" factory-method="getBean3"></bean> :
在定义一个bean,id 为bean3,生产它的工厂类为 bean3factory,调用 bean3factory生产 bean3的方法为 (bean3factory的)getBean3()方法
3.(非静态)工厂类
package com.spring.demo;
public class Bean3Factory {
public Bean3 getBean3(){
return new Bean3();
}
}
4.测试代码:
public class TextIoc {
@Test
public void textUser()
{
//1.获取spring文件
ApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");
//2.由配置文件返回对象
Bean3 b = (Bean3)context.getBean("bean3");
System.out.println(b);
b.print();
}
}
运行:
打印出对象,和调用bean3的print方法
静态工厂类与非静态工厂类的区别是,前者不需要创建对象,直接可以调用静态方法创建bean;后者则要先创建对象,然后再通过对象调用其方法创建bean