对于对象的注入,我们使用ref方式,可以指定注入的对象,下面看下属性的注入,以及当spring无法转换基本类型进行注入时,如何编写一个类似转换器的东西来完成注入。
常见属性的注入:int,String,list,set,map的注入
Bean1.java
package com.spring.tl.injection;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Created by 滕柳 on 2018/6/4.
*/
public class Bean1 {
private String strValue;
private int intValue;
private List listValue;
private Set setValue;
private String[] arrayValue;
private Map mapValue;
public String getStrValue() {
return strValue;
}
public void setStrValue(String strValue) {
this.strValue = strValue;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
public List getListValue() {
return listValue;
}
public void setListValue(List listValue) {
this.listValue = listValue;
}
public Set getSetValue() {
return setValue;
}
public void setSetValue(Set setValue) {
this.setValue = setValue;
}
public String[] getArrayValue() {
return arrayValue;
}
public void setArrayValue(String[] arrayValue) {
this.arrayValue = arrayValue;
}
public Map getMapValue() {
return mapValue;
}
public void setMapValue(Map mapValue) {
this.mapValue = mapValue;
}
}
applicationContext-injection.xml
list1
list2
arrayValue1
arrayValue2
set1
set2
InjectionTest
package com.spring.tl.client;
import com.spring.tl.injection.Bean1;
import junit.framework.TestCase;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by 滕柳 on 2018/6/4.
*/
public class InjectionTest extends TestCase {
private BeanFactory factory;
@Override
protected void setUp() throws Exception{
//factory=new ClassPathXmlApplicationContext("injection.xml");//一个配置文件
//多个配置文件数组形式展示
// String[] configLocations=new String[]{"injection.xml","applicationContext-editer.xml"};
// factory=new ClassPathXmlApplicationContext(configLocations);
//多个配置文件统一展示
factory=new ClassPathXmlApplicationContext("classpath*:/applicationContext-*.xml");
}
@Override
protected void tearDown() throws Exception{}
@Test
public void testInjection(){
Bean1 bean=(Bean1) factory.getBean("bean1");
System.out.println(bean.getStrValue());
System.out.println(bean.getIntValue());
System.out.println(bean.getListValue());
System.out.println(bean.getSetValue());
System.out.println(bean.getMapValue());
System.out.println(bean.getArrayValue());
}
}
看此博客:spring2和spring4自定义属性编辑器的差别----处理日期格式
我们添加了日期的属性,不能自动注入到spring中,所以我们要转一下,来实践一下
Bean1.java
applicationContext-injection.xml
UtilDatePropertyEditor.java
package com.spring.tl.injection;
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by 滕柳 on 2018/6/4.
*/
public class UtilDatePropertyEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException{
System.out.println("-----setAsTest---"+text);
try {
Date date=new SimpleDateFormat("yyyy-MM-dd").parse(text);
this.setValue(date);
}catch (ParseException e){
e.printStackTrace();
throw new IllegalArgumentException(text);
}
}
}
applicationContext-editer.xml
看此博客:Spring ClassPathXmlApplicationContext和FileSystemXmlApplicationContext读取配置文件的方法
代码实现:
Bean2中包含Bean3,Bean4,Bean5其中Bean3和Bean4中有相同的属性
Bean2.java
Bean3.java
Bean4.java
Bean5.java
1、正常配置:
applicationContext-injection.xml
123
2、减少spring的配置文件:
applicationContext-injection.xml
123
applicationContext-common.xml
测试时要扫描全部的配置文件
1、spring配置文件中的beans默认情况下是及时加载的,有时候一些类加载耗时很厉害,我们可以通过配置将其设置为延迟加载。即延迟配置文件(bean)的初始化
2、spring配置文件中的beans节点有一个属性default-lazy-init和bean节点有一个属性是lazy-init,将这个属性的值设置为true时就可以实现延迟加载,放到beans节点上时会影响其下的所有子bean,放在bean上时只影响一个bean。