Spring學習筆記01(IOC)
阿新 • • 發佈:2018-12-27
IOC和DI
IOC(控制反轉 Inversion of control)很抽象的概念,是一種設計思想,在spring中可以先簡單的理解為將物件的建立,賦值等交給spring工廠進行.
DI(依賴注入 dependency injection)控制反轉有一種方式叫做 依賴注入,A如果依賴B,A此時並不需要建立B,也不用關心B如何建立的,spring會在適合的時候將B創建出來注入到A中。
簡單瞭解一下工廠模式
下面寫了一個小demo
a1.properties 是一個文字檔案,裡面通過鍵值的方式放入我們需要的資料
key值自己定義,value值是要建立的物件的類
其中factory包下的BeanFactory就是要寫的一個工廠類,直接先看程式碼然後解釋
public class BeanFactory{
//先建立Properties物件
private static Properties pro = new Properties();
//在靜態程式碼塊裡面讀取a1.properties裡面的內容
static {
//靜態程式碼塊中的程式碼要進行try catch處理
try {
//將properties檔案裡面的內容讀取進入一個流中
InputStream in = BeanFactory.class.getResourceAsStream("/a1.properties");
//用properties物件從輸入流中讀取
pro.load(in);
} catch (Exception e){
e.printStackTrace();
}
//建立物件的方法
public static Object getBean(String key){
//通過反射機制建立物件
Class clz = Class.forName(pro.getProperty(key));
return clz.newInstance();
}
}
}
//建立一個測試類
public class TestBeanFactory{
public static void main(String[ ] args) {
//呼叫工廠類建立物件
UserDao dao=(UserDao)BeanFactory.getBean("userDao");
//呼叫dao中的方法
dao.insert();
}
}
接下來就看一下 Spring怎麼建立物件的吧
1.新增jar包 為了省事,我將spring的初始學習的jar全部匯入了
2.需要一個xml配置檔案,本例名字是applicationContext.xml
<?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.xsd">
<!--在這裡寫上要建立的物件
1d:這個bean標籤的唯一標識,自己起的名字不要重複就好
class:要建立物件的類全路徑
-->
<bean id="userService" class="com.service.impl.UserServiceImpl"></bean>
</beans>
3.測試一下
public class TestSpring{
public static void main(String[] args) {
//建立spring的工廠的物件
ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//引數就是配置檔案裡面 對應bean的id值
UserService us=(UserService)ac.getBean("userService");
}
}
屬性注入
這個直接上程式碼了
Person類
private int id;
private String name;
private List<String> list;
private Properties pro;
//set get 方法
配置檔案:
<bean id="person" class="com.entity.Person">
<!--給基本型別賦值 int-->
<property name="id" value="101"></property>
<!--給String型別賦值-->
<property name="name" value="張三"></property>
<!--給list集合型別賦值-->
<property name="list">
<list>
<value>哈哈</value>
<value>呵呵</value>
<value>嘿嘿</value>
</list>
</property>
<!--給properties型別賦值-->
<property name="pro">
<props>
<prop key="a1">哈哈</prop>
<prop key="a2">呵呵</prop>
<prop key="a3">嘿嘿</prop>
</props>
</property>
</bean>
構造注入
User類裡面要加一個有參構造方法
private String username;
public User(String name){
this.name=name;
}
配置檔案:
<bean id="user" class="com.entity.User">
<!--name屬性是User類裡面的屬性名稱
也可以是index 代表有參構造中方法的順序
還有type等....
-->
<constructor-arg name="username" value="張三"></constructor-arg>
</bean>