//这是一个xml文件,是我项目中的一个文件,我对它进行了分析
<beans.....>
<bean id="" class=""> //id就是一个标识,可以被当做另一个节点里的ref,class是一个类,下面的在本类中执行
<constructor-arg name="" value="" /> //构造,有几个constructor-arg就有几个构造参数
<constructor-arg name="" >
<map>
<entry key="getDataWriteParam">
<bean class="com.ls.athena.message.redis.proxy.RedisProxyProcessor">
<property name="queueName" value="Q_C_METER_TASK" /> 初始化变量的值
<property name="factory" ref="redisFactory" /> 属性注入初始化类对象,并new出来,注入此类中
</bean>
</entry>
<entry key="getDataWriteParam2">
.......................
<entry key="getDataWriteParam3">
.......................
<entry key="getDataWriteParam4">
.......................
</map>
</constructor-arg>
</bean>
</beans>
实现呢
//* 将XML文件输出到指定的路径
public static void outputXml(Document doc,String fileName)
throws Exception {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
DOMSource source = new DOMSource(doc);
transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT,"yes");// 设置文档的换行与缩进
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
StreamResult result = new StreamResult(pw);
transformer.transform(source,result);
System.out.println("生成XML文件成功!");
}
//////创建生成xml
public static void createXml(String fileName) {
Element root = document.createElement("listProtocolDataItemConfig");
document.appendChild(root); //填充 根
int i =0;//0000FF00
do{
StringBuilder thr = null;
String codede = "";
thr = new StringBuilder();
thr.append("0000");
String hex = Integer.toHexString(i);
if (hex.length() < 2) {
hex = "0" + hex;
}
if(i == 64)
hex = "FF";
thr.append(hex).append("00");
codede = thr.toString().toUpperCase();//数据表示
String namee =String.format("(当前)组合有功费率 "+Integer.toString(i)+"电能");
Element employee = document.createElement("ProtocolDataItemConfig"); //节点
Element DI = document.createElement("code"); //成员1
DI.appendChild(document.createTextNode(codede));
employee.appendChild(DI); //填充节点的成员1
Element Cformat = document.createElement("code_format"); //成员2
if(i == 64)
Cformat.appendChild(document.createTextNode("**"));
else
Cformat.appendChild(document.createTextNode("SG11"));
employee.appendChild(Cformat); //填充节点的成员2
Element name = document.createElement("REMARK");
if(i == 0)
name.appendChild(document.createTextNode("(当前)组合有功总电能")); //成员3
else if(i == 64)
name.appendChild(document.createTextNode("(当前)组合有功电能数据块")); //成员3
else
name.appendChild(document.createTextNode(namee)); //成员3
employee.appendChild(name); //填充节点的成员3
root.appendChild(employee);//填充 节点
i++;
}while(i<65);
TransformerFactory tf = TransformerFactory.newInstance();
try {
Transformer transformer = tf.newTransformer();
DOMSource source = new DOMSource(document);
transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT,"yes");
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
StreamResult result = new StreamResult(pw);
transformer.transform(source,result);
System.out.println("生成XML文件成功!");
} catch (TransformerConfigurationException e) {
System.out.println(e.getMessage());
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (TransformerException e) {
System.out.println(e.getMessage());
}
}
public static void main(String args[]){
A0xml dd=new A0xml();
String str="./SG645.xml";
dd.init();
A0xml.createXml(str); //创建xml
}
这就是我的实现了,具体实现可以自行查看Spring的注入方法
下面的我转的,觉得很好
set注入的缺点是无法清晰表达哪些属性是必须的,哪些是可选
的,构造注入的优势是通过构造强制依赖关系,不可能实例化不
完全的或无法使用的bean。
MemberBean定义四个变量,
privateStringname;
privateDoublesalary;
privateDeptdept;
privateStringsex;
Dept:
privateStringdname;
privateStringdeptno;
使用set方法注入
第一种方法:根据索引赋值,索引都是以0开头的:
<bean
id="memberBean"class="www.csdn.spring01.constructor.MemberBean">
<constructor-argindex="0"value="刘晓刚"/>
<constructor-argindex="1"value="3500"/>
<constructor-argindex="2"ref="dept"/>
<constructor-argindex="3"value="男"/>
第二种方法是根据所属类型传值
这种方法基本上不怎么适用,因为一个类里可以有好几个相同基本类型的变量,很容易就混淆值传给哪一个参数了所以做好不要使用这种方法:
<constructor-argtype="java.lang.String"value="刘晓刚"
<constructor-argtype="java.lang.Double"value="3500"/>
<constructor-argtype="www.csdn.spring01.constructor.Dept"ref="dept"/>
<constructor-argtype="java.lang.String"value="男"/>
在这几种方法里我感觉这种方法是最实用的,他是根据名字来传值的,所以基本上只要名字对了,这个值就可以获取到
<constructor-argname="name"value="刘晓刚"/>
<constructor-argname="salary"value="3500"/>
<constructor-argname="dept"ref="dept"/>
<constructor-argname="sex"value="男"/>
第四种方法:直接传值
直接给参数赋值,这种方法也是根据顺序排的,所以一旦调换位置的话,就会出现bug,这种方法已经很原始了
<constructor-argvalue="刘晓刚"/>
<constructor-argvalue="3500"/>
<constructor-argref="dept"/>
<constructor-argvalue="男"/>
</bean>
<beanid="dept"class="www.csdn.spring01.constructor.Dept">
<propertyname="dname"value="北航"/>
<propertyname="deptno"value="00001"/>
</bean>S