今天接触了Spring的初步用法, 感觉跟实例化实体类没啥区别, 像这种简单的代码还不如直接实例化来的方便, 这样使用Spring的话总共需要三个文件
第一个当然是一个实体类了, 定义好属性, getter和setter方法, 别忘了构造一个无参的构造方法.
public class HelloWorld { private String mingzi; private String dizhi; private User user; public void sayHello() { System.out.println("Hello "+mingzi+user); } //属性mingzi的set和get方法 public void setMingzi(String mingzi) { System.out.println("设置mingzi = "+mingzi); this.mingzi = mingzi; } public String getMingzi() { return mingzi; } //再定义一个属性 public String getDizhi() { return dizhi; } public void setDizhi(String dizhi) { System.out.println("设置dizhi = "+dizhi); this.dizhi = dizhi; } //定义属性user的get和set方法 public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
再一个就是一个main方法的入口, 来调用写好的实体类.
import org.springframework.context.ApplicationContext;//第1行的引用 import org.springframework.context.support.ClassPathXmlApplicationContext;//第1行的引用 public class Main { public static void main(String[] args) { //通过Spring的方式调用方法 //构建容器 构建容器的时候就调用了set方法 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//第1行 //从容器中获取javaBean的实例 控制反转IOC HelloWorld hw1 = (HelloWorld)ac.getBean("hw"); hw1.sayHello(); } }
剩下的一个也是最重要的一个文件, xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 将一个类的定义放在这边 --> <bean id="hw" class="com.hanqi.HelloWorld"> <!-- 这里实现的依赖注入(DI) --> <property name="dizhi" value="山东淄博"></property> <property name="mingzi" value="小强"></property> <property name="user" ref="user1"></property> </bean> <bean id="user1" class="com.hanqi.User"> <!-- 构造器注入, 如果数据类型是唯一的, 顺序可以无所谓 --> <!-- 可以添加type或者index="序号"来匹配顺序号 --> <constructor-arg value="12" index="2"></constructor-arg> <constructor-arg value="汉族" index="3"></constructor-arg> <constructor-arg value="小明" index="0"></constructor-arg> <constructor-arg value="男" index="1"></constructor-arg> </bean> </beans>
定义一个User类
public class User { private String age; private String sex; private String minz; private String name; public User() {} public User(String name, String sex, String age, String minz) { super(); this.name = name; this.age = age; this.sex = sex; this.minz = minz; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getMinz() { return minz; } public void setMinz(String minz) { this.minz = minz; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", sex=" + sex + ", minz=" + minz + "]"; } }
这里主要说明以下几点:
一, <property>属性标签的设置, name=""的值, 必须为set方法后面的方法名, 一个字母也不能错, 但是不包括大小写, 也就是说, 方法名可以有大写字母, 到了name=""属性里面, 就无所谓了, 只要你字母写对了就OK
二, 当使用构造器进行属性注入的时候
<constructor-arg value="12" index="2"></constructor-arg> <constructor-arg value="汉族" index="3"></constructor-arg> <constructor-arg value="小明" index="0"></constructor-arg> <constructor-arg value="男" index="1"></constructor-arg>
当然可以像上面一样定义一个index="", 但是注意, 序号是从0开始的, 第一个属性的序号是0
如果没有index, 构造器自己也能识别每个属性的赋值, 但是这里要保持与构造方法的顺序一致, 即带着参数的那个构造方法
public User(String name, String sex, String age, String minz) { super(); this.name = name; this.age = age; this.sex = sex; this.minz = minz; }
这里这个构造方法的参数的顺序是name, sex, age, minz(为了方便测试, 我都设置成了String类型的), 所以构造器的顺序也应当这样写
<constructor-arg value="小明"></constructor-arg> → String name <constructor-arg value="男"></constructor-arg> → String sex <constructor-arg value="12"></constructor-arg> → String age <constructor-arg value="汉族"></constructor-arg> → String minz