3、Spring创建对象方式
1、通过构造方法来创建 (必须要有有参构造方法)
2、通过set方法来创建(必须要有无参构造方法)
3.1、通过构造方法来创建
通过构造方式有三种方式
- 通过字段名
- 通过下标
- 通过字段类型
创建实体类
package com.zhangjiangbo.cn.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String usrename;
private String passwrod;
}
创建spring配置文件
第一种方式:通过字段名来创建
<?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="user" class="com.zhangjiangbo.cn.bean.User">
<constructor-arg name="id" value="1"/>
<constructor-arg name="usrename" value="张江博"/>
<constructor-arg name="passwrod" value="xiaomini"/>
</bean>
</beans>
第二种方式:通过下标创建(要保证下标和实体类中字段定义的顺序保持一致)
<bean id="user" class="com.zhangjiangbo.cn.bean.User">
<constructor-arg index="0" value="1"/>
<constructor-arg index="1" value="张江博"/>
<constructor-arg index="2" value="xiaomini"/>
</bean>
第三种方式:通过字段类型创建(按照实体类中定义的顺序,定义的类型必须要与实体类中保持一致,否则会报错)
<bean id="user" class="com.zhangjiangbo.cn.bean.User">
<constructor-arg type="java.lang.Integer" value="1"/>
<constructor-arg type="java.lang.String" value="张江博"/>
<constructor-arg type="java.lang.String" value="xiaomini"/>
</bean>
测试类
package com.zhangjiangbo.cn;
import com.zhangjiangbo.cn.bean.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
@org.junit.Test
public void test01(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
User user = context.getBean("user", User.class);
System.out.println(user.toString());
}
}
3.2 通过set方法创建对象(基础注入)
实体类中必须要有 set方法和无参构造方法
<bean id="user" class="com.zhangjiangbo.cn.bean.User">
<property name="id" value="1"/>
<property name="usrename" value="张江博"/>
<property name="passwrod" value="xiaomini"/>
</bean>
输出
小结:在诶之文件加载的时候,其中管理的对象都已经被初始化了
4、别名
4.1 alias标签
使用标签来设置别名,也可以设置多个别名
<!--设置别名,在获取bean的时候可以使用别名获取-->
<alias name="user" alias="testAlias"/>
<bean id="user" class="com.zhangjiangbo.cn.bean.User">
<property name="id" value="1"/>
<property name="usrename" value="张江博"/>
<property name="passwrod" value="xiaomini"/>
</bean>
也可以在bean标签内使用name属性来定义别名,可定义多个
<bean id="user" class="com.zhangjiangbo.cn.bean.User" name="user2,user3,user4">
<property name="id" value="1"/>
<property name="usrename" value="张江博"/>
<property name="passwrod" value="xiaomini"/>
测试类修改
@org.junit.Test
public void test01(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
// 可以使用别名,也可以使用之前的名称id获取
User user = context.getBean("testAlias", User.class);
System.out.println(user.toString());
}
4.2、import标签
一个项目中可能会有很多个bean配置文件,一般来用使用applicationContext.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">
<import resource="spring.xml"/>
</beans>
测试类修改
@org.junit.Test
public void test01(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = context.getBean("testAlias", User.class);
System.out.println(user.toString());
}
5、各种数据类型的依赖注入(DI)
- 依赖注入
- 依赖:指bean对象的创建依赖于容器,Bean对象的依赖资源
- 注入:指bean对象所依赖的资源,由容器来设置和装配
5.1 构造器注入
见 3.1
5.2 set注入(重点)
学生类
package com.zhangjiangbo.cn.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private String name;
private Address address;
private String[] books;
private List<String> hobby;
private Map<String,Object> card;
private Set<String> games;
private String girlFriend;
private Properties info;
}
地址类
package com.zhangjiangbo.cn.bean;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class Address {
private String address;
}
5.2.1 常量注入
<bean id="student" class="com.zhangjiangbo.cn.bean.Student">
<property name="name" value="张江博"/>
</bean>
5.2.2 引用类型注入
使用ref来引用其他bean注入到该对象中
<bean id="student" class="com.zhangjiangbo.cn.bean.Student">
<!--引用类型,使用ref属性来引入其他bean-->
<property name="address" ref="address"/>
</bean>
<bean id="address" class="com.zhangjiangbo.cn.bean.Address">
<property name="address" value="北京市昌平区"/>
</bean>
5.2.3 数组注入
使用property标签下的array标签
<bean id="student" class="com.zhangjiangbo.cn.bean.Student">
<!--数组类型-->
<property name="books">
<array>
<value>Java程序设计</value>
<value>Java编程思想</value>
<value>Java核心进阶</value>
</array>
</property>
</bean>
5.2.4 List注入
<bean id="student" class="com.zhangjiangbo.cn.bean.Student">
<!--List类型-->
<property name="hobby">
<list>
<value>听音乐</value>
<value>看电影</value>
<value>学习</value>
</list>
</property>
</bean>
5.2.5 map注入
<property name="card">
<map>
<entry key="身份证" value="130XXXXXXXXXXXXXXX"/>
<entry key="手机卡" value="157XXXXXXXXX"/>
</map>
</property>
5.2.6 set注入
<property name="games">
<set>
<value>王者荣耀</value>
<value>和平精英</value>
<value>骑马与砍杀</value>
</set>
</property>
5.2.7 Null注入
<!--方式一-->
<property name="girlFriend">
<value>null</value>
</property>
<!--方式二-->
<property name="girlFriend">
<null></null>
</property>
5.2.8 Properties注入
<property name="info">
<props>
<prop key="学号">11111</prop>
<prop key="姓名">张江博</prop>
<prop key="性别">男</prop>
</props>
</property>
测试类
@org.junit.Test
public void test02(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = context.getBean("student", Student.class);
System.out.println(student.toString());
}
输出
Student(name=张江博, address=Address(address=北京市昌平区), books=[Java程序设计, Java编程思想, Java核心进阶], hobby=[听音乐, 看电影, 学习], card={身份证=130XXXXXXXXXXXXXXX, 手机卡=157XXXXXXXXX}, games=[王者荣耀, 和平精英, 骑马与砍杀], girlFriend=null, info={学号=11111, 性别=男, 姓名=张江博})
拓展注入方式
1、p命名空间注入
2、c命名空间注入
p命名空间(通过set方式注入)
1、导入p标签命名空间
package com.zhangjiangbo.cn.bean;
import lombok.Data;
@Data
public class Person {
private String name;
private String sex;
}
xmlns:p="http://www.springframework.org/schema/p"
<bean id="person" class="com.zhangjiangbo.cn.bean.Person" p:name="张江博" p:sex="男"/>
测试类
@org.junit.Test
public void test03(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = context.getBean("person", Person.class);
System.out.println(person.toString());
}
注意:通过set方式注入,实体类中必须要有无参构造方法
c命名空间(通过构造器注入)
导入c标签命名空间
xmlns:c="http://www.springframework.org/schema/c"
<bean id="person" class="com.zhangjiangbo.cn.bean.Person" c:name="张江博" c:sex="男"></bean>
测试类同上
注意:使用构造器注入,实体类中必须要有有参构造方法