前言
上节学习了IOC创建对象的方式,我们在不知不觉中使用了最简单的构造注入,什么是构造注入,什么又是依赖注入呢?
一、首先我们要了解DI是什么?
创建对象的过程中Spring可以依据配置对象的属性进行设置,这个过程称之为依赖注入,也即DI。
顾名思义,你就会明白构造注入就是通过构造方法给属性进行赋值。
二、DI的几种注入方式
需要用到的实体类:
package com.shan.pojo;
import lombok.Data;
import lombok.ToString;
@Data @ToString
public class Address {
private String address;
}
package com.shan.pojo;
import lombok.Data;
import lombok.ToString;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
@Data @ToString
public class Student {
private String name;
private Address address;
private String[] books;
private List<String> hobbies;
private Map<String,String> card;
private Set<String> games;
private String wife;
private Properties info;
}
package com.shan.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data @ToString @NoArgsConstructor @AllArgsConstructor
public class User {
private String name;
private String age;
}
1.普通注入
<!--普通注入-->
<property name="name" value="小黑神"/>
2.Bean注入
<!--Bean注入-->
<property name="address" ref="address"/>
3.数组注入
<!--数组注入-->
<property name="books">
<array>
<value>红楼梦</value>
<value>西游记</value>
<value>水浒传</value>
<value>三国演义</value>
</array>
</property>
4.List注入
<!--List集合注入-->
<property name="hobbies">
<list>
<value>女朋友</value>
<value>敲代码</value>
<value>刷抖音</value>
<value>看小说</value>
<value>玩游戏</value>
</list>
</property>
5.Map注入
<!--Map注入-->
<property name="card">
<map>
<entry key="身份证" value="42102220001002xxxx"/>
<entry key="学生证" value="18103020134"/>
<entry key="银行卡" value="666666666666666666"/>
</map>
</property>
6.Set注入
<!--Set集合注入-->
<property name="games">
<set>
<value>lol</value>
<value>coc</value>
<value>bob</value>
<value>cs</value>
<value>永劫无间</value>
</set>
</property>
7.null注入
<!--null注入-->
<property name="wife">
<value>null</value>
</property>
8.Properties注入
<!--Properties集合注入-->
<property name="info">
<props>
<prop key="学号">18103020134</prop>
<prop key="性别">男</prop>
<prop key="username">root</prop>
<prop key="password">xxx</prop>
</props>
</property>
拓展注入
<!--拓展注入方式
p命名空间和c命名空间不能是直接使用,需要导入xml约束!
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
-->
<!--p命名空间注入,可以直接注入属性的值:property-->
<bean id="user" class="com.shan.pojo.User" p:name="小黑神" p:age="18"/>
<!--c命名空间注入,可以通过构造器注入:construct-args-->
<bean id="user2" class="com.shan.pojo.User" c:name="小黑神zxs" c:age="18" scope="singleton"/>
<!--作用域
scope="singleton" 单例模式 Spring默认
scope="prototype" 原型模式 每次从容器中get的时候都会产生一个新对象!
-->
测试
import com.shan.pojo.Student;
import com.shan.pojo.User;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void testStudent(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Student student = (Student) context.getBean("student");
System.out.println(student);
}
@Test
public void testUser(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("userbean.xml");
User user = context.getBean("user", User.class);
User user2 = context.getBean("user2", User.class);
System.out.println(user);
System.out.println(user2);
}
//User(name=小黑神, age=18)
//User(name=小黑神zxs, age=18)
}
作者有话说
博客创作不易,希望看到这里的读者动动你的小手点个赞,如果喜欢的小伙伴可以一键三连,作者大大在这里给大家谢谢了。