您的位置:首页 > 其它

Bean实例化的三种方式

2018-01-22 15:36 239 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: