Bean 的配置方式
2016-06-13 23:24
441 查看
Bean 的配置方式 的三种方式:
①. 通过全类名(反射)
②. 通过工厂方法(静态工厂方法 & 实例工厂方法)
③. FactoryBean
1. 通过全类名(反射)
通过全类名配置Bean
2. 通过工厂方法
Phone.java
静态工厂方法
StaticPhoneFactory.java
实例工厂方法
InstanceFactory.java
配置Bean
beans_staticefactory_instancefactory.xml
测试:
TestStaticFactoryAndInstanceFactory.java
运行结果:
3. FactoryBean
Phone.java
配置bean
beans_factorybean.xml
测试方法:
①. 通过全类名(反射)
②. 通过工厂方法(静态工厂方法 & 实例工厂方法)
③. FactoryBean
1. 通过全类名(反射)
package com.baidu.spring.beans.test; public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void showName() { System.out.println("Person's name: " + name); } }
通过全类名配置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 --> <bean id="person" class="com.baidu.spring.beans.test.Person"> <property name="name" value="HanMeiMei"></property> <property name="age" value="35"></property> </bean> </beans>
2. 通过工厂方法
Phone.java
package com.baidu._StaticFactory; public class Phone { private String brand; private double price; public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Phone [brand=" + brand + ", price=" + price + "]"; } public Phone() { System.out.println("Phone`s Constructor...."); } public Phone(String brand, double price) { super(); this.brand = brand; this.price = price; } }
静态工厂方法
StaticPhoneFactory.java
package com.baidu._StaticFactory; import java.util.HashMap; import java.util.Map; /** * 静态工厂方法:直接调用某一个类的静态方法就可以返回Bean 的实例 */ public class StaticPhoneFactory { private static Map<String, Phone> phones = new HashMap<String, Phone>(); static { phones.put("HuaWei", new Phone( "HuaWei",4899)); phones.put("Mi", new Phone( "Mi",1999)); } //静态工厂方法 public static Phone getPhone(String brand) { return phones.get(brand); } }
实例工厂方法
InstanceFactory.java
package com.baidu._InstanceFactory; import java.util.HashMap; import java.util.Map; import com.baidu._StaticFactory.Phone; /** * 实例工厂方法:实例工厂的方法,即需要先创建工厂本身,在调用工厂的实例方法来返回bean 的实例 */ public class InstanceFactory { private Map<String, Phone> phones = null; public InstanceFactory() { phones = new HashMap<String, Phone>(); phones.put("HuaWei", new Phone( "HuaWei",4899)); phones.put("Mi", new Phone( "Mi",1999)); } public Phone getPhone(String brand) { return phones.get(brand); } }
配置Bean
beans_staticefactory_instancefactory.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.xsd"> <!-- 通过静态工厂方法来配置bean。注意不是配置静态工厂方法实例,而是配置bean 实例 --> <!-- class 属性: 指向静态工厂方法的全类名 factory-method:指向静态工厂方法的名字 constructor-arg: 如果工厂方法需要传入参数,则使用constructor-arg 来配置参数 --> <bean id="phone1" class="com.baidu._StaticFactory.StaticPhoneFactory" factory-method="getPhone"> <constructor-arg value="HuaWei"></constructor-arg> </bean> <!-- ~~~~~~~~~~~~~~配置工厂的实例 ~~~~~~~~~~~~~~ --> <!-- 配置工厂的实例 --> <bean id="phoneFactory" class="com.baidu._InstanceFactory.InstanceFactory"></bean> <!-- 通过实例工厂方法来配置bean factory-bean 属性: 指向实例工厂方法的bean factory-method:指向实例工厂方法的名字 constructor-arg: 如果工厂方法需要传入参数,则使用constructor-arg 来配置参数 --> <bean id="phone2" factory-bean="phoneFactory" factory-method="getPhone"> <constructor-arg value="Mi"></constructor-arg> </bean> </beans>
测试:
TestStaticFactoryAndInstanceFactory.java
package com.baidu._StaticFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestStaticFactoryAndInstanceFactory { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext(" beans_staticefactory_instancefactory.xml"); Phone phone1 = (Phone) applicationContext.getBean("phone1"); System.out.println(phone1); Phone phone2= (Phone) applicationContext.getBean("phone2"); System.out.println(phone2); } }
运行结果:
Phone [brand=HuaWei, price=4899.0] Phone [brand=Mi, price=1999.0]
3. FactoryBean
Phone.java
package com.baidu.FactoryBean; public class Phone { private String brand; private double price; public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Phone [brand=" + brand + ", price=" + price + "]"; } public Phone() { System.out.println("Phone`s Constructor...."); } public Phone(String brand, double price) { super(); this.brand = brand; this.price = price; } }PhoneFactoryBean.java
package com.baidu.FactoryBean; import org.springframework.beans.factory.FactoryBean; //自定义的FactoryBean 需要实现FactoryBean 接口 public class PhoneFactoryBean implements FactoryBean<Phone> { //配置属性 这里只是为了演示可以这样配置 private String brand; public void setBrand(String brand) { this.brand = brand; } //返回bean 的对象 @Override public Phone getObject() throws Exception { return new Phone(brand, 4889); } //返回bean 的类型 @Override public Class<?> getObjectType() { return Phone.class; } //返回bean 是否为单实例 @Override public boolean isSingleton() { return true; } }
配置bean
beans_factorybean.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.xsd"> <!-- 通过FactoryBean 来配置Bean 的实例 class:指向FactoryBean 的全类名 property: 配置FactoryBean 的属性 但是,实际返回的实例是FactoryBean 的getObject() 方法返回的实例! --> <bean id="phone" class="com.baidu.FactoryBean.PhoneFactoryBean"> <property name="brand" value="HuaWei"></property> </bean> </beans>
测试方法:
package com.baidu.FactoryBean; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestSpringFactoryBean { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans_factorybean.xml"); Phone phone = (Phone) applicationContext.getBean("phone"); System.out.println(phone); } }运行结果:
Phone [brand=HuaWei, price=4889.0]
相关文章推荐
- iOS开发--QQ音乐练习,旋转动画的实现,音乐工具类的封装,定时器的使用技巧,SliderBar的事件处理
- Runable和thread的区别(多线程必须用Runable)
- Excel -- 日期和时间运算
- 基于数据驱动的框架具体的学习点
- send(),recv()函数详解
- 初识 HTML5(一)
- IOS swift 自定义Tableview cell
- android.support.design.widget.TabLayout
- Js 调用 webservice
- <Sicily>Threecolor problem
- E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)
- nginx源码分析——配置
- 你应当如何学习C++(以及编程)
- 软件技术简要说明
- gradle
- 软件设计——原则
- 小额支付试验的结果
- 第四百三十七天 how can I 坚持
- include require区别
- JSP九大内置对象的作用和用法总结?