Action 1 Foundation

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

package  com.ergal.spring;

public   class  HelloBean 
{
    
private String helloworld;
    
public void setHelloworld(String helloworld)
    
{
        
this.helloworld=helloworld;
    }

    
public String getHelloworld()
    
{
        
return this.helloworld;
    }

}

SpringDemo.java

package  com.ergal.spring;

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

<? xml version="1.0" encoding="UTF-8"  ?>
<! 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

package  com.ergal.spring;

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

package  com.ergal.spring;

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

<? xml version="1.0" encoding="UTF-8"  ?>
<! 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

package  com.ergal.spring;

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

package  com.ergal.spring;

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

 

<? xml version="1.0" encoding="UTF-8"  ?>
<! 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

<? xml version="1.0" encoding="UTF-8"  ?>
<! 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

package  com.ergal.spring;

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

 

package  com.ergal.spring;

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

package  com.ergal.spring;

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

 

<? xml version="1.0" encoding="UTF-8"  ?>
<! 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 >

结果

Hello RainyTooo
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

 

         < property name = "" >
            
< props key = " someProKey1 " > someProValue1 </ props >
            
< props key = " someProKey2 " > someProValue2 </ props >
        
</ property >

 

 BeanPostProcessor

org.springframework.beans.factory.config
Interface BeanPostProcessor

注入完成后 的初始化前后分别执行这两个方法


 

Method Summary
 ObjectpostProcessAfterInitialization(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).
 ObjectpostProcessBeforeInitialization(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

package  com.ergal.spring;

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

 

package  com.ergal.spring;

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

package  com.ergal.spring;

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

<? xml version="1.0" encoding="UTF-8"  ?>
<! 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 >

 

输出结果为

HI GUY !
RAINYTOOO
Time is  Fri Sep 29 04:41:01 CST 2006

 

BeanFactoryPostProcessor

在BeanFactory加载Bean定义文件的所有内容,但还没有正式产生bean实力之前可以进行一些处理

1 PropertyPlacehholderConfiguer

籍由这个类可以将配置信息移出到一个或多个.properties文件中 可以用来客户化和分离功能设定

例子

将上面的xml改成

beans-config.xml

<? xml version="1.0" encoding="UTF-8"  ?>
<! 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

com.ergal.spring.HelloWorld=Test config by properties

输出结果

Test config by properties
Rainytooo
Time is  Fri Sep 29 05:16:47 CST 2006

 

2 CustomerEditComfigurer

将字符串值转换为指定类型的对象

例子

User.java

package  com.ergal.spring;

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

 

package  com.ergal.spring;


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

package  com.ergal.spring;

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

<? xml version="1.0" encoding="UTF-8"  ?>
<! 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 >

 

输出结果

kkakaa !
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

<? xml version="1.0" encoding="UTF-8"  ?>
<! 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

 

package  com.ergal.spring;

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

userLogin=User  {0}  login at  {1}

messages_zh_CN.properties

userLogin=使用者  {0}  于  {1}  登录

是用 native2ascii工具从txt转换而来

我在英文版win2003上直接用ANNI保存的txt

结果如下

User Keith login at 9/29/06 10:18 AM
使用者 Keith 于 06-9-29 上午10:18 登录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值