DI(Dependency Injection),即“依賴注入”,組件之間依賴關系由容器在運行期決定,即容器動態的將某個依賴關系注入到組件當中。它是是 Spring 框架核心IOC技術的具體實現。
依賴注入是控制反轉最常用的方式,通過控制反轉可以減低計算機代碼之間的耦合度。通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。
Springboot框架。DI理解的關鍵點“誰依賴誰,為什么需要依賴”
依賴關系的管理:
這種依賴關系的維護就叫做依賴注入
。能夠注入的數據:
Spring mvc,依賴注入的方式:
基于配置的形式注入依賴主要有兩種方法:
<?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-3.0.xsd"><!--依賴注入方式1:有參構造--><bean id="user" class="com.tulun.bean.User"><!--id屬性的注入--><constructor-arg name="id" value="22"></constructor-arg><!--name屬性的注入--><constructor-arg name="name" value="zhangsan"></constructor-arg></bean>
</beans>
有參構造函數的依賴注入主要使用<Constructor-arg>
標簽;
name
屬性:表示類中的屬性名。value
屬性:當前屬性名賦值。中臺前端框架?在類中必須包含有參構造函數,且和構造函數保持參數一致。
public class User {private String id;private String name;//有參構造方法public User(String id, String name) {this.id = id;this.name = name;}
}
public class App {public static void main(String[] args) {//獲取IOC的容器ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//通過容器來獲取當前的對象User user = (User) applicationContext.getBean("user");System.out.println(user);}
}
<?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-3.0.xsd"><!--依賴注入方式2:set方法--><bean id="user" class="com.tulun.bean.User" ><!--id屬性注入--><property name="id" value="12"/><!--name屬性賦值--><property name="name" value="李四"/></bean>
</beans>
set方法注入依賴時,使用property
標簽;
name
屬性:表示類中的屬性名。value
屬性:表示當前屬性的賦值。java中的框架,代碼測試:
public class App {public static void main(String[] args) {//獲取IOC的容器ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//通過容器來獲取當前的對象User user = (User) applicationContext.getBean("user");System.out.println(user);}
}
<?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-3.0.xsd"><!--對象的注入--><!--在Person類中注入自定義的User--><bean id="users" class="com.tulun.bean.User"/><bean id="person" class="com.tulun.bean.Person" ><!--user屬性通過set方式注入--><!--value:會按照String類型的字符串做解析 ref:Spring中管理對象的ID名--><property name="user" ref="users"/></bean>
</beans>
<?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-3.0.xsd"><!--List的注入--><bean id="person" class="com.tulun.bean.Person"><property name="list" ><list><value>hello</value><value>你好</value><value>1234</value></list></property></bean>
</beans>
<?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-3.0.xsd"><!--數組的注入--><bean id="person" class="com.tulun.bean.Person"><property name="list" ><!--array標簽:注入數組--><array><!--value是直接給定值--><value></value></array></property></bean><!--set的注入--><bean id="person" class="com.tulun.bean.Person"><property name="list" ><!--set標簽:注入set類型的集合--><set></set></property></bean><!--map的注入--><bean id="person" class="com.tulun.bean.Person"><property name="map" ><!--map標簽:注入Map類型的集合--><map><entry key="1" value="zhangsan"/></map></property></bean>
</beans>
@Value
:注入普通形式的依賴;@Resource
:注入對象類型;@Autowired
:注入對象類型;使用注解方式注入依賴前提是Bean的裝配支持注解掃描
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!--開啟注解掃描: base-package(必填)指令包路徑: 會掃描類方法、屬性上是否有注解--><context:component-scan base-package="com.tulun.bean"></context:component-scan><!--掃描屬性上面的注解(不建議使用)--><context:annotation-config></context:annotation-config>
</beans>
@Component(value = "user")
public class User {@Value("1")private String id;@Value("張三")private String name;}
@Value
注解注入依賴前提是Bean的裝配支持注解掃描。public class App{public static void main( String[] args ){//獲取IOC的容器ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//通過容器來獲取當前的對象User user = (User) applicationContext.getBean("user");System.out.println(user);}
}
Mybatis框架、
@Component(value = "person")
public class Person {//自定義類型屬性//和@Resource功能一樣@Autowiredprivate User user;}
public class App{public static void main( String[] args ){//獲取IOC的容器ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//通過容器來獲取當前的對象Person person = (Person)applicationContext.getBean("person");System.out.println(person);}
}
@Resource
和 @Aoutowire
的異同點:
@Resource
和 @Aoutowire
都是做Bean的注入時使用,@Resource
和 @Aoutowire
是可以替換使用的。@Resource
和 @Aoutowire
是可以作為注入屬性的修飾,在為接口僅有單一實現類時,兩個注解效果一樣,可互相替換,不影響使用。@Resource
是Java中提供的注解,@Resource
存在兩個屬性,分別為name
和type
。 name
來解釋bean的名字,而type
屬性則解析為bean的類型,所以如果使用name
屬性時,使用byName
自動注入策略,而使用type
屬性是則使用byType
自動注入策略,如果不指定name
或者type
屬性時,這時將通過反射機制使用byName
自動注入策略。@Autowired
是Spring 提供的注解,在Spring的2.5版本引入。 @Autowired
只根據type
進行注入,不會去匹配name
,如果type
無法識別中注入對象是,需要依賴@Qualifier
或者是Primary
注解一起修飾。VB中的框架。容器解析Bean的依賴過程:
容器在創建的時候,Spring容器會驗證每一個Bean的配置,在實際創建Bean之前,Bean的屬性是不會被設置的。Bean只會在需要他的時候被創建,創建Bean的過程有可能會引起一系列的Bean被創建,例如Bean的依賴,其依賴的依賴等等會被一起創建和分配。注意:此時依賴之間解析不匹配的問題有可能會出現,即會循環創建有影響的Bean。
循環依賴問題:
class User{private Person person;
}
class Person{private User user;
}
BeanCurrentlyInCreationException
。版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态