Spring基于配置文件的注入及简化
1.注入初体验
拿入门的Person作为测试bean,只有 id 和 name 两个属性
步骤:提供Setter、Getter
在配置文件bean标签中,新增property标签,再在内部中添加value标签
<bean id="person" class="zyc.stu.bean.Person">
<property name="id">
<value>18</value>
</property>
</bean>
测试:
ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
Person person = (Person) context.getBean("person");
System.out.println(person.getId());
2.set注入
先对Person类进行改造
package zyc.stu.Spring5_1_23.bean;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
/**
* @author zhuZiGe_
* @create 2020-09-09-11:08
*/
public class Person {
private int Id;
private String Name;
private String[] emails;
private Set<String> tels;
private Map<String,String> qqs;
private Properties p;
public Properties getP() {
return p;
}
public void setP(Properties p) {
this.p = p;
}
public Map<String, String> getQqs() {
return qqs;
}
public void setQqs(Map<String, String> qqs) {
this.qqs = qqs;
}
public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public Set<String> getTels() {
return tels;
}
public void setTels(Set<String> tels) {
this.tels = tels;
}
public String[] getEmails() {
return emails;
}
public void setEmails(String[] emails) {
this.emails = emails;
}
public Person() {
}
public Person(int id, String name) {
Id = id;
Name = name;
}
public Person(int id, String name, String[] emails) {
Id = id;
Name = name;
this.emails = emails;
}
public Person(int id, String name, String[] emails, Set<String> tels) {
Id = id;
Name = name;
this.emails = emails;
this.tels = tels;
}
@Override
public String toString() {
return "Person{" +
"Id=" + Id +
", Name='" + Name + '\'' +
'}';
}
}
2.1 JDK内置类型:
int等8种基本类型+string:直接按照上面的方式注入
数组: 使用<list>标签
Set集合: 使用<set>标签
list集合:使用<list>标签,内部和set类似,但注意有序性和可重复性
Map集合: 使用<map>和<entry>标签,entry 的key使用组合标签<key><value>,value直接使用<value>标签
Properties集合:使用<props>和<prop>标签,properties的值只能是string类型,直接将其嵌入
<bean id="personInjection" class="zyc.stu.Spring5_1_23.bean.Person">
<property name="id">
<value>19</value>
</property>
<property name="name">
<value>zyc</value>
</property>
<property name="emails">
<list>
<value>7616.qq.com</value>
<value>223344.qq.com</value>
<value>556677.qq.com</value>
</list>
</property>
<property name="tels">
<set>
<value>133123456</value>
<value>123566666</value>
<value>123555555</value>
<value>123555555</value>
</set>
</property>
<property name="qqs">
<map>
<entry>
<key><value>"zyc"</value></key>
<value>123456</value>
</entry>
<entry>
<key><value>"zyc1"</value></key>
<value>1234567</value>
</entry>
</map>
</property>
<property name="p">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
</props>
</property>
</bean>
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
Person personInjection = (Person) context.getBean("personInjection");
String[] emails=personInjection.getEmails();
for (String s :emails) {
System.out.println(s);
}
Set<String> tels = personInjection.getTels();
for (String s :tels) {
System.out.println(s);
}
Map<String, String> qqs = personInjection.getQqs();
System.out.println(qqs);
Properties p = personInjection.getP();
System.out.println(p);
}
2.2 自定义类型:不做测试
方式一:直接使用<bean>标签
缺点:代码冗余,浪费内存
方式二:先创建好bean,然后在其他地方引用 ref
<bean id="xxxclass1" class="xxx.xxx">
<bean id="xxxclass2" class="xxx.xxx.xxx">
<properties name="xxxprop">
<ref bean="xxxclass1"/>
</properties>
</bean>
3.构造注入
1.提供有参构造方法(个数对应)
public Person(int id, String name) {
Id = id;
Name = name;
}
2.配置文件中进行配置:
使用<constructor-arg>标签,注意参数顺序对应,除非有相应的重载
<bean id="person" class="zyc.stu.bean.Person">
<constructor-arg>
<value>22</value>
</constructor-arg>
<constructor-arg>
<value>zyc</value>
</constructor-arg>
</bean>
3.1 构造方法发生重载时
- 个数不同的重载----直接用对应的
<constructor-arg>
标签的数量进行区分 - 数量相同类型不同的重载----对
<constructor-arg>
的类型进行限定,<constructor-arg type="int">
4.基于set注入的简化
4.1 value属性简化
将property的内部标签改成property的value属性
<bean id="person" class="zyc.stu.bean.Person">
<property name="name" value="zyc"/>
</bean>
4.2 ref属性简化
同理可以用在自定义类型上,将标签改为ref属性
<bean id="person" class="zyc.stu.bean.Person">
<property name="dao" ref="Person"/>
</bean>
4.3 p命名空间简化
idea有智能提示,没有就自己手动加入xmlns:p="http://www.springframework.org/schema/p"
JDK 8大类型+String:
<bean id="personP" class="zyc.stu.bean.Person" p:name="zyc" p:id="20"/>
自定义类型:
<bean id="personDao" class="zyc.stu.Spring5_24_33.dao.PersonDao"/>
<bean id="personServiceP" class="zyc.stu.service.PersonServiceImpl" p:dao-ref="personDao"></bean>