Spring中IOC创建对象的几种注入方式,你知道有哪些?
IOC简单来说就是对象由Spring创建,管理和装配
IOC在创建对象的可用依赖注入方式有多种,分别是构造器注入,set方式注入和其他方式注入,下面分别演示一下这三种方式怎么用
构造器注入
无参构造器:spring默认是用无参构造器创建对象,如:
public class Hello {
private String name;
public void show() {
System.out.println("hello"+name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在Bean中直接指明属性名和值就可以
<bean id="hello" class="com.ys.pojo.Hello">
<property name="name" value="spring"/>
</bean>
有参构造器,如:
public class Teacher {
private String name;
private int phone;
// 有参构造函数
public Teacher(String name, int phone) {
this.name = name;
this.phone = phone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPhone() {
return phone;
}
public void setPhone(int phone) {
this.phone = phone;
}
}
对应的Bean:(有参构造器其有三种方式注入:下标指明赋值,指明类型赋值,指明参数名赋值)
<!-- 有参构造下标赋值-->
<bean id="teacher1" class="com.ys.pojo.Teacher">
<constructor-arg index="0" value="李老师" />
<constructor-arg index="1" value="333"/>
</bean>
<!--类型赋值法(不推荐这个)-->
<bean id="teacher2" class="com.ys.pojo.Teacher">
<constructor-arg type="java.lang.String" value="王老师"/>
<constructor-arg type="int" value="34"/>
</bean>
<!--直接通过参数名设置-->
<bean id="teacher3" class="com.ys.pojo.Teacher">
<constructor-arg name="name" value="谢老师"/>
<constructor-arg name="phone" value="5454545"/>
</bean>
Set方式注入
set方式是依赖注入,依赖是指bean对象的创建依赖容器,注入是指bean对象中的所有属性,有容器来注入,如:
实体类Address
public class Address {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Address{" +
"name='" + name + '\'' +
'}';
}
}
public class Student {
private String name;
private Address address;
private String[] books;
private List<String> hobbys;
private Map<String, String> card;
private Set<String> games;
private String wife;
private Properties info;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", address=" + address +
", books=" + Arrays.toString(books) +
", hobbys=" + hobbys +
", card=" + card +
", games=" + games +
", wife='" + wife + '\'' +
", info=" + info +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String[] getBooks() {
return books;
}
public void setBooks(String[] books) {
this.books = books;
}
public List<String> getHobbys() {
return hobbys;
}
public void setHobbys(List<String> hobbys) {
this.hobbys = hobbys;
}
public Map<String, String> getCard() {
return card;
}
public void setCard(Map<String, String> card) {
this.card = card;
}
public Set<String> getGames() {
return games;
}
public void setGames(Set<String> games) {
this.games = games;
}
public String getWife() {
return wife;
}
public void setWife(String wife) {
this.wife = wife;
}
public Properties getInfo() {
return info;
}
public void setInfo(Properties info) {
this.info = info;
}
}
对应的bean
<bean id="address" class="com.ys.pojo.Address">
<property name="name" value="辽宁"/>
</bean>
<bean id="student1" class="com.ys.pojo.Student">
<!--普通值注入,直接属性名+属性值-->
<property name="name" value="小红"/>
<!--Bean注入,ref+对应Bean的id-->
<property name="address" ref="address"/>
<!--数组注入-->
<property name="books">
<array>
<value>设计模式</value>
<value>Java</value>
<value>编程思想</value>
</array>
</property>
<!--List注入-->
<property name="hobbys">
<list>
<value>旅游</value>
<value>学习</value>
</list>
</property>
<!--Map注入-->
<property name="card">
<map>
<entry key="QQ号" value="6666666"/>
<entry key="手机号" value="8888888888"/>
</map>
</property>
<!--Set注入-->
<property name="games">
<set>
<value>飞车</value>
<value>使命召唤</value>
</set>
</property>
<!--NULL注入-->
<property name="wife">
<null/>
</property>
<!--Properties注入-->
<property name="info">
<props>
<prop key="学号">121212</prop>
<prop key="姓名">小明</prop>
</props>
</property>
</bean>
测试:
@Test
public void Test1() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Student student = context.getBean("student1", Student.class);
System.out.println(student);
}
测试结果:
其他方式注入
p命名注入:前提类里是无参构造,如:
public class User {
private int id;
private String name;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在bean中要引入约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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="user1" class="com.ys.pojo.User" p:id="111111" p:name="小李"/>
</beans>
注意:p 命名空间不如标准 XML 格式灵活。例如,声明属性引用的格式与以 结尾的属性冲突Ref
,而标准 XML 格式则不然。我们建议您仔细选择您的方法并将其传达给您的团队成员,以避免生成同时使用所有三种方法的 XML 文档。p 命名空间不如标准 XML 格式灵活。例如,声明属性引用的格式与以 结尾的属性冲突Ref
,而标准 XML 格式则不然。我们建议您仔细选择您的方法并将其传达给您的团队成员,以避免生成同时使用所有三种方法的 XML 文档。
============================
C命名注入:前提是类有有参构造器,如
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在bean中引入约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
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="user1" class="com.ys.pojo.User" c:id="333" c:name="阿猫"/>
</beans>
注意:由于 XML 语法的原因,索引符号要求存在前导,_
因为 XML 属性名称不能以数字开头(即使某些 IDE 允许)
-—————————————
以上是在学spring中的一些总结,有不对的地方欢迎指正!!!
觉得不错三连支持一下哦,O(∩_∩)O哈哈~
还没有评论,来说两句吧...