Bean的构造器注入和setter注入

链接:https://pan.baidu.com/s/1vixLrr8harzZMwLsIB1Mwg
提取码:ou1n

首先要明白,为什么要注入?

IOC容器会在初始化时,创建好所有的bean对象的实例(懒汉模式除外:https://www.cnblogs.com/ABKing/p/12044025.html

这就带来一个问题,当bean中只有方法的时候还不会出问题。

但是如果bean中还有属性呢?

这就是属性注入的出现原因了。为了对bean的属性进行赋值,我们引入了注入的概念

0x00 构造器注入

配置文件中写入:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 5     <bean class="top.bigking.bean.Book" id="book">
 6         <constructor-arg index="0" value="1"/>
 7         <constructor-arg index="1" value="哈利波特"/>
 8         <constructor-arg index="2" value="18.8"/>
 9     </bean>
10 </beans>

Book类中:

 1 package top.bigking.bean;
 2 
 3 public class Book {
 4     private Integer id;
 5     private String bookname;
 6     private double price;
 7 
 8     public Book(Integer id, String bookname, double price) {
 9         this.id = id;
10         this.bookname = bookname;
11         this.price = price;
12     }
13 
14     @Override
15     public String toString() {
16         return "Book{" +
17                 "id=" + id +
18                 ", bookname='" + bookname + '\'' +
19                 ", price=" + price +
20                 '}';
21     }
22 }

测试类中:

 1 package top.bigking.test;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 import top.bigking.bean.Book;
 6 
 7 public class BigKingTest {
 8     public static void main(String[] args) {
 9         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
10         Book book = (Book) applicationContext.getBean("book");
11         System.out.println(book);
12     }
13 }

运行:

Book{id=1, bookname='哈利波特', price=18.8}

Process finished with exit code 0

可以看到,成功输出了相应的值

这就是构造器注入

另外,还可以不通过构造器的索引,而是通过属性名来注入

application.xml:

1         <constructor-arg name="bookname" value="哈利波特"/>
2         <constructor-arg name="id" value="1"/>
3         <constructor-arg name="price" value="18.8"/>

 

0x01 setter注入

这里使用的是<property>标签,唯一的要求是,Book类中必须要有set方法,而且,由于不是构造器注入,在创建对象时,会默认调用无参的构造方法,所以在Book类中也必须要有一个无参的构造方法,否则会报错!

1         <property name="id" value="1"/>
2         <property name="bookname" value="哈利波特" />
3         <property name="price" value="18.8" />

 

占个坑,下次再写其他的注入

上一篇:Spring的核心机制-依赖注入和控制反转


下一篇:别再写getter,setter方法了,用Lombok来简化你的代码吧