Action 1 Foundation
来源:互联网 发布:南山 科技园 知乎 编辑:程序博客网 时间:2024/06/07 01:14
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
注入完成后 的初始化前后分别执行这两个方法
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 登录
- Action 1 Foundation
- Team Foundation Server 2008 in Action
- 【Foundation-10-1】#import <Foundation/NSArray.h>
- Foundation 框架1
- foundation
- Foundation
- Foundation
- Foundation
- FOUNDATION
- Foundation
- 【Foundation-36-1】#import <Foundation/NSIndexPath.h>树结构
- 【Foundation-37-1】#import <Foundation/NSIndexSet.h>不可索引集合
- 【Foundation-62-1】#import <Foundation/NSRange.h>范围
- 【Foundation-86-1】#import <Foundation/NSValue.h>基础创建
- 【Foundation-26-1】#import <Foundation/NSDictionary.h>字典,旧
- SQL Foundation(1--13)
- OC的Foundation框架1
- 3Foundation Kit-1 字符串
- 关于synchronized
- 看看我的房间(我奋斗的地方 南北战争就是在这里酝酿的....)
- 暴走之前
- 无用
- Rod和Ted,Don之间关于EJB和Spring的讨论(二)
- Action 1 Foundation
- WINDOWS程序总体架构(摘取自WINDOWS程序设计)
- ASP.NET 2.0中合并 GridView 的表头单元格
- XML 问题: 超越 DOM
- 宝元生活写照
- ABAP开发资源列表
- Some Tips about Interbase
- 自动生成SQL Server数据库的Word文档格式的数据字典
- Dojo Spreadsheet Widget - 基于Ajax的Excel