IoC type 1 interface injection
要求实作接口 对象所在的容器也要实现这个接口
代码: |
public interface IDependencyInjection { public void createDependency(Map dependObjects); } public class BusinessObject implement IDependencyInjection { private Map dependObjects; public void createDependency(Map dependObjects) { this.dependObject = dependObjects; // 在这边实现与BusinessObject的依赖关系 ...... } public void save() { .... writer.saveToDevice(); } } |
太依赖容器 这样的耦合程度较高
IoC type 2 setter injection
例子程序
HelloBean.java
public class HelloBean
... {
private String helloworld;
public void setHelloworld(String helloworld)
...{
this.helloworld=helloworld;
}
public String getHelloworld()
...{
return this.helloworld;
}
}
SpringDemo.java
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
public class SpringDemo
... {
public static void main(String args[])
...{
Resource rs=new FileSystemResource("beans-config.xml");
BeanFactory factory=new XmlBeanFactory(rs);
HelloBean hello=(HelloBean)factory.getBean("hellobean");
System.out.println(hello.getHelloworld());
}
}
beans-config.xml
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans >
< bean id ="hellobean"
class ="com.ergal.spring.HelloBean" >
< property name ="helloworld" >
< value > Hello! Rainytooo!! </ value >
</ property >
</ bean >
</ beans >
运行结果:
2006-9-27 5:18:34 org.springframework.core.CollectionFactory <clinit>
信息: JDK 1.4+ collections available
2006-9-27 5:18:35 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [D:/workspace/springdemo/beans-config.xml]
Hello! Rainytooo!!
IoC type 3 constructor injection
例子程序
HelloBean.java
public class HelloBean
... {
private String helloworld;
private String name;
public HelloBean()...{}
public HelloBean(String helloworld, String name)
...{
this.helloworld=helloworld;
this.name=name;
}
public void setHelloworld(String helloworld)
...{
this.helloworld=helloworld;
}
public String getHelloworld()
...{
return this.helloworld;
}
public void setName(String name)
...{
this.name=name;
}
public String getName()
...{
return this.name;
}
}
SpringDemo.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class SpringDemo
... {
public static void main(String args[])
...{
ApplicationContext context=new FileSystemXmlApplicationContext("beans-config.xml");
HelloBean hello=(HelloBean)context.getBean("hellobean");
System.out.println(hello.getHelloworld());
System.out.println(hello.getName());
}
}
beans-config.xml
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans >
< bean id ="hellobean"
class ="com.ergal.spring.HelloBean" >
< constructor-arg index ="0" >
< value > Hi guy ! </ value >
</ constructor-arg >
< constructor-arg index ="1" >
< value > Rainytooo </ value >
</ constructor-arg >
</ bean >
</ beans >
BeanFactory
BeanFactory 负责读取Bean定义文件 管理对象的加载 生成并维护Bean对象之间的依赖关系 负责生命周期
ApplicationContext
有更简洁的获取资源方法 提供文字消息的解析方法 支持国际化 可以发布事件 对事件感兴趣的bean 可以接受到这些事情
常使用的三个类
org.springframework.context.support.FileSystemXmlApplicationContext
制定路径来读取定义文件
org.springframework.context.support.ClassPathXmlApplicationContext
从classpath中来读取XML定义文件
org.springframework.web.context.support.XmlWebApplicationContext
在web应用中 指定位置来读取定义文件
Bean的基本管理
属性参考
直接参考一个已经定义的bean
用<bean> 里的<ref bean=" " />
例子程序
HelloBean.java
import java.util.Date;
public class HelloBean
... {
private String helloworld;
private String name;
private Date date;
public HelloBean()...{}
public HelloBean(String helloworld, String name)
...{
this.helloworld=helloworld;
this.name=name;
}
public void setHelloworld(String helloworld)
...{
this.helloworld=helloworld;
}
public String getHelloworld()
...{
return this.helloworld;
}
public void setName(String name)
...{
this.name=name;
}
public String getName()
...{
return this.name;
}
public Date getDate()
...{
return this.date;
}
public void setDate(Date date)
...{
this.date=date;
}
}
SpringDemo.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class SpringDemo
... {
public static void main(String args[])
...{
ApplicationContext context=new FileSystemXmlApplicationContext("beans-config.xml");
HelloBean hello=(HelloBean)context.getBean("hellobean");
System.out.println(hello.getHelloworld());
System.out.println(hello.getName());
System.out.println("Time is " + " " + hello.getDate());
}
}
beans-config.xml
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans >
< bean id ="datebean" class ="java.util.Date" >
</ bean >
< bean id ="hellobean"
class ="com.ergal.spring.HelloBean" >
< constructor-arg index ="0" >
< value > Hi guy ! </ value >
</ constructor-arg >
< constructor-arg index ="1" >
< value > Rainytooo </ value >
</ constructor-arg >
< property name ="date" >
< ref bean ="datebean" />
</ property >
</ bean >
</ beans >
自动绑定
<bean> autowire属性 有
byType 根据类型自动绑定
byName
autoselect 一切交给Spring来判断 spring是先constractor后byType
no
constractor
default
<bean> dependency-check属性 有
simple 只检查属性
object 只检查对象
all 都检查注入了没有
default
none
例子程序
同上
改beans-config.xml
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans >
< bean id ="datebean" class ="java.util.Date" >
</ bean >
< bean id ="hellobean"
class ="com.ergal.spring.HelloBean" autowire ="byType" >
< constructor-arg index ="0" >
< value > Hi guy ! </ value >
</ constructor-arg >
< constructor-arg index ="1" >
< value > Rainytooo </ value >
</ constructor-arg >
</ bean >
</ beans >
集合对象的注入
对于List Set Map 等集合对象 在注入之前若必须填充一些对象到集合中 然后再将集合对象注入到bean里
例子程序
Some.java
public class Some
... {
private String name;
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
public String toString()
...{
return name;
}
}
SomeBean.java
import java.util.List;
import java.util.Map;
public class SomeBean
... {
private String[] someStrArray;
private Some[] someObjArray;
private List someList;
private Map someMap;
public List getSomeList() ...{
return someList;
}
public void setSomeList(List someList) ...{
this.someList = someList;
}
public Map getSomeMap() ...{
return someMap;
}
public void setSomeMap(Map someMap) ...{
this.someMap = someMap;
}
public Some[] getSomeObjArray() ...{
return someObjArray;
}
public void setSomeObjArray(Some[] someObjArray) ...{
this.someObjArray = someObjArray;
}
public String[] getSomeStrArray() ...{
return someStrArray;
}
public void setSomeStrArray(String[] someStrArray) ...{
this.someStrArray = someStrArray;
}
}
SpringDemo2.java
import java.util.List;
import java.util.Map;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class SpringDemo2
... {
public static void main(String[] args)
...{
ApplicationContext context=new FileSystemXmlApplicationContext("beans-config.xml");
SomeBean somebean=(SomeBean)context.getBean("somebean");
String[] strs=(String[])somebean.getSomeStrArray();
Some[] somes=(Some[])somebean.getSomeObjArray();
for(int i=0; i <strs.length; i++)
...{
System.out.println(strs[i] + " " + somes[i].getName());
}
List someList=(List)somebean.getSomeList();
for(int i=0;i<someList.size();i++)
...{
System.out.println(someList.get(i));
}
Map someMap=(Map)somebean.getSomeMap();
System.out.println(someMap.get("MapTest"));
System.out.println(someMap.get("some1"));
}
}
beans-config.xml
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans >
< bean id ="some1" class ="com.ergal.spring.Some" >
< property name ="name" >
< value > RainyTooo </ value >
</ property >
</ bean >
< bean id ="some2" class ="com.ergal.spring.Some" >
< property name ="name" >
< value > zhang </ value >
</ property >
</ bean >
< bean id ="somebean" class ="com.ergal.spring.SomeBean" >
< property name ="someStrArray" >
< list >
< value > Hello </ value >
< value > welcome! </ value >
</ list >
</ property >
< property name ="someObjArray" >
< list >
< ref bean ="some1" />
< ref bean ="some2" />
</ list >
</ property >
< property name ="someList" >
< list >
< value > ListTest </ value >
< ref bean ="some1" />
< ref bean ="some2" />
</ list >
</ property >
< property name ="someMap" >
< map >
< entry key ="MapTest" >
< value > Hello hhahaha </ value >
</ entry >
< entry key ="somekey1" >
< ref bean ="some1" />
</ entry >
</ map >
</ property >
</ bean >
</ beans >
结果
welcome! zhang
ListTest
RainyTooo
zhang
要注意的是map用 <entry key=""><value></value></entry>
List 可以用value 或者ref
另外
set
< set >
< value ></ value >
< ref bean = "" />
< ref bean = "" />
</ set >
java.util.properties
< props key = " someProKey1 " > someProValue1 </ props >
< props key = " someProKey2 " > someProValue2 </ props >
</ property >
BeanPostProcessor
org.springframework.beans.factory.config
Interface BeanPostProcessor
注入完成后 的初始化前后分别执行这两个方法
Method Summary | |
---|---|
Object |
postProcessAfterInitialization(Object bean, String beanName) Apply this BeanPostProcessor to the given new bean instance after any bean initialization callbacks (like InitializingBean's afterPropertiesSet or a custom init-method). |
Object |
postProcessBeforeInitialization(Object bean, String beanName) Apply this BeanPostProcessor to the given new bean instance before any bean initialization callbacks (like InitializingBean's afterPropertiesSet or a custom init-method). |
例子:
大小写转换
BeanPostProcessorDemo.java
import java.lang.reflect.Field;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class BeanPostProcessorDemo implements BeanPostProcessor
... {
public Object postProcessAfterInitialization(Object bean, String beanName)
...{
Field[] fields=bean.getClass().getDeclaredFields();
for(int i=0; i<fields.length; i++)
...{
if(fields[i].getType().equals(String.class))
...{
fields[i].setAccessible(true);
try
...{
String original=(String)fields[i].get(bean);
fields[i].set(bean, original.toUpperCase());
}
catch(IllegalArgumentException e)
...{
e.printStackTrace();
}
catch(IllegalAccessException e)
...{
e.printStackTrace();
}
}
}
return bean;
}
public Object postProcessBeforeInitialization(Object bean, String beanName)
...{
return bean;
}
}
HelloBean.java
import java.util.Date;
public class HelloBean
... {
private String helloworld;
private String name;
private Date date;
public HelloBean()...{}
public HelloBean(String helloworld, String name)
...{
this.helloworld=helloworld;
this.name=name;
}
public void setHelloworld(String helloworld)
...{
this.helloworld=helloworld;
}
public String getHelloworld()
...{
return this.helloworld;
}
public void setName(String name)
...{
this.name=name;
}
public String getName()
...{
return this.name;
}
public Date getDate()
...{
return this.date;
}
public void setDate(Date date)
...{
this.date=date;
}
}
SpringDemo.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class SpringDemo
... {
public static void main(String args[])
...{
ApplicationContext context=new FileSystemXmlApplicationContext("beans-config.xml");
HelloBean hello=(HelloBean)context.getBean("hellobean");
System.out.println(hello.getHelloworld());
System.out.println(hello.getName());
System.out.println("Time is " + " " + hello.getDate());
}
}
beans-config.xml
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans >
< bean id ="date" class ="java.util.Date" >
</ bean >
< bean id ="hellobean" class ="com.ergal.spring.HelloBean" autowire ="byType" >
< constructor-arg index ="0" >
< value > Hi guy ! </ value >
</ constructor-arg >
< constructor-arg index ="1" >
< value > Rainytooo </ value >
</ constructor-arg >
</ bean >
< bean id ="uppercaseModifier" class ="com.ergal.spring.BeanPostProcessorDemo" />
</ beans >
输出结果为
RAINYTOOO
Time is Fri Sep 29 04:41:01 CST 2006
BeanFactoryPostProcessor
在BeanFactory加载Bean定义文件的所有内容,但还没有正式产生bean实力之前可以进行一些处理
1 PropertyPlacehholderConfiguer
籍由这个类可以将配置信息移出到一个或多个.properties文件中 可以用来客户化和分离功能设定
例子
将上面的xml改成
beans-config.xml
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans >
< bean id ="date" class ="java.util.Date" >
</ bean >
< bean id ="hellobean" class ="com.ergal.spring.HelloBean" autowire ="byType" >
< property name ="helloworld" >
< value > ${com.ergal.spring.HelloWorld} </ value >
</ property >
< property name ="name" >
< value > Rainytooo </ value >
</ property >
</ bean >
< bean id ="configbBean" class ="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
< property name ="location" >
< value > hello.properties </ value >
</ property >
</ bean >
</ beans >
增加
hello.properties
输出结果
Rainytooo
Time is Fri Sep 29 05:16:47 CST 2006
2 CustomerEditComfigurer
将字符串值转换为指定类型的对象
例子
User.java
public class User
... {
String name;
int number;
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
public int getNumber() ...{
return number;
}
public void setNumber(int number) ...{
this.number = number;
}
}
HellBean.java
public class HelloBean
... {
private String helloworld;
private User user;
public String getHelloworld() ...{
return helloworld;
}
public void setHelloworld(String helloworld) ...{
this.helloworld = helloworld;
}
public User getUser() ...{
return user;
}
public void setUser(User user) ...{
this.user = user;
}
}
SpringDemo.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class SpringDemo
... {
/** *//**
* @param args
*/
public static void main(String[] args)
...{
// TODO Auto-generated method stub
ApplicationContext context=new FileSystemXmlApplicationContext("beans-config.xml");
HelloBean hello=(HelloBean)context.getBean("helloBean");
System.out.println(hello.getHelloworld() + " !");
System.out.println(hello.getUser().getName());
System.out.println(hello.getUser().getNumber());
}
}
beans-config.xml
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans >
< bean id ="configBean" class ="org.springframework.beans.factory.config.CustomEditorConfigurer" >
< property name ="customEditors" >
< map >
< entry key ="com.ergal.spring.User" >
< bean id ="userEditor" class ="com.ergal.spring.UserEditor" ></ bean >
</ entry >
</ map >
</ property >
</ bean >
< bean id ="helloBean" class ="com.ergal.spring.HelloBean" >
< property name ="helloworld" >
< value > kkakaa </ value >
</ property >
< property name ="user" >
< value > rainytooo,10889701 </ value >
</ property >
</ bean >
</ beans >
输出结果
rainytooo
10889701
这个例子不能显示出威力和优点 只有在属性很多的时候 就能看出这种用来用指定方法来装还字符串为 指定对象的优点
资源的取得
Resource resource=context.getResource("classpath:admin.properties");
Resource resource=context.getResource("file:c:/asd/war/***/**");
Resource resource=context.getResource("WEB-INF/conf/admin.properties");
国际化
String getMessage(String code,
Object[] args,
Locale locale)
throws NoSuchMessageException
例子
beans-config.xml
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
< beans >
< bean id ="messageSource" class ="org.springframework.context.support.ResourceBundleMessageSource" >
< property name ="basename" >
< value > messages </ value >
</ property >
</ bean >
</ beans >
SpringDemo2.java
import java.util.Calendar;
import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class SpringDemo2
... {
public static void main(String[] args)
...{
ApplicationContext context=new FileSystemXmlApplicationContext("beans-config.xml");
Object[] arguments=new Object[]...{ "Keith", Calendar.getInstance().getTime()};
System.out.println(context.getMessage("userLogin", arguments, Locale.US));
System.out.println(context.getMessage("userLogin", arguments, Locale.CHINA));
}
}
messages_en_US.properties
messages_zh_CN.properties
是用 native2ascii工具从txt转换而来
我在英文版win2003上直接用ANNI保存的txt
结果如下
使用者 Keith 于 06-9-29 上午10:18 登录