spring 框架里面包含了很多流行的技术,如IOC,DI,SpringlMVC,官方文档地址(https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core),一开始听这些名词时云里雾里的,什么控制反转,什么依赖注入等等。随着代码的阅读和理解,也逐渐慢慢清晰了起来,扒开了重重迷雾,果然,时间才是最好的礼物。
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
说人话:IoC就是一种设计思想,以前我们都是通过new关键字来产生对象,现在不用了,通过去IoC容器中(即spring的配置文件,xml格式)去获取对象。以前是程序员自动去获取,现在是去IoC容器里面拿,所以说"控制反转"说的是获取依赖对象的方式变了。
控制反转实现方法很多,如直接通知代码,DI,依赖查找等也能实现控制反转。DI是实现控制反转最经典也是最常用的方式。总之,IoC的容器负责对象的注入,创建,生命周期的管理。
DI依赖注入,即实现IoC的一种方式;想理解好依赖注入是什么,需要回答2个问题:
**1 依赖什么?**
对象的创建依赖于IoC容器(即spring的xml文件)。即创建对象的依赖关系
**2 注入了什么?**
所创建的对象的属性的初始化通过IoC来注入。即对象里面属性或者字段的初始化
IoC创建对象3种方式,也叫IoC创建Bean的3种方式。
下面是一个普通的User类,有一个自己默认无参构造:
package com.yang.pojo;
public class User {
int age;
String name;
public void setAge() {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
需要对应属性有set方法才行。
我注释掉age的set方法:
spring的配置文件报错。
<bean id="user" class="com.yang.pojo">
<property name="age" value="4"> property>
bean>
获取到user对象后,age会被自动初始化。
增加一个有参构造
package com.yang.pojo;
public class User {
int age;
String name;
public User(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
此时获取到user对象后,age不会被自动初始化,程序报错,找不到
解决方法:
构造器参数实现:
有三种方式来实现,具体如下:
<bean id="user" class="com.yang.pojo.User">
<constructor-arg index="0" value="5"/>
bean>
<bean id="user" class="com.yang.pojo.User">
<constructor-arg type="java.lang.Integer" value="5"/>
bean>
<bean id="user" class="com.yang.pojo.User">
<constructor-arg ref="xxxx"/>
bean>
<bean id="user" class="com.yang.pojo.User">
<constructor-arg name="age" value="4"/>
bean>
在创建对象时后,传入属性值。 即 IoC创建对象3种方式都可以实现。
类中的属性必须要有set方法才能使用set注入
可以注入的类型很多,如map,set,String等等,需要记忆。
package com.yang.pojo;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class Student {
public String address;
public String[] books;
public int age;
private List<String> hobbys;
private Map<String,String> card;
private Set<String> games;
private Properties pro;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String[] getBooks() {
return books;
}
public void setBooks(String[] books) {
this.books = books;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
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 Properties getPro() {
return pro;
}
public void setPro(Properties pro) {
this.pro = pro;
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="hello" class="com.yang.Hello">
<property name="age" value="4"> property>
bean>
<bean id="student" class="com.yang.pojo.Student" scope="prototype">
<property name="age" value="4"> property>
<property name="address" value="重庆"> property>
<property name="books">
<array>
<value>红楼value>
<value>三国value>
<value>西游value>
array>
property>
<property name="card">
<map>
<entry key="2" value="y1">entry>
<entry key="4" value="sdf">entry>
map>
property>
<property name="games">
<set>
<value>1value>
<value>evalue>
<value>3value>
set>
property>
<property name="pro">
<props >
<prop key="name"> yang prop>
<prop key="age"> 56 prop>
props>
property>
bean>
beans>