Spring學習筆記——IOC

applicationContext配置模板

<?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">

    <!--導入其他spring配置-->
    <import resource="{path}/beans.xml"/>

    <!--設置別名:在獲取Bean的時候可以使用別名獲取-->
    <alias name="hello" alias="hello123"/>

    <bean id="hello" class="com.kuang.pojo.Hello">
       <property name="name" value="Spring"/>
    </bean>

</beans>

 

1.IOC方面

jar包和測試

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>5.1.10.RELEASE</version>
</dependency>
@Test
public void test(){
   //解析beans.xml文件 , 生成管理相應的Bean對象
   ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
   //getBean : 參數即爲spring配置文件中bean的id .
   Hello hello = (Hello) context.getBean("hello");
   hello.show();
}

1.注入方式:

(1)構造器無參注入(略)      

         構造器有參注入

<!-- 有參注入一共有三種方式 -->
<bean id="user" class="com.jyy.pojo.User">

    <!-- index指構造方法 , 下標從0開始 -->
    <constructor-arg index="0" value="jyy"/>

    <!-- name指參數名 -->
    <constructor-arg name="name" value="jyy"/>

    <!-- type指類型 -->
    <constructor-arg type="java.lang.String" value="jyy"/>
</bean>

(2)Set注入(需要該屬性寫了setter方法)(如果屬性是boolean類型 , 沒有set方法 , 是 is)

<!--value注入基本類型,ref注入引用-->

<bean id="student" class="com.jyy.pojo.Student">
    <property name="name" value="張三"/>
    <property name="teacher" ref="teacher1"/>
</bean>

<bean id="teacher1" class="com.jyy.pojo.Teacher">
    <property name="name" value="老師"/>
</bean>

(3)數組Array / List / Map / Set / Null空值 / Properties類

<bean id="student" class="com.jyy.pojo.Student">

    <!--1.普通值注入-->
    <property name="name" value="張三" />
    
    <!--2.引用注入-->
    <property name="address" ref="address" />

    <!--3.array注入-->
    <property name="books">
        <array>
            <value>西遊記</value>
            <value>紅樓夢</value>
            <value>水滸傳</value>
            <value>三國演義</value>
        </array>
    </property>

    <!--4.list注入-->
    <property name="hobbys">
        <list>
            <value>聽歌</value>
            <value>敲代碼</value>
            <value>看電影</value>
        </list>
    </property>

    <!--5.map注入-->
    <property name="card">
        <map>
            <entry key="身份證" value="12312414"></entry>
            <entry key="銀行卡" value="3121312"></entry>
        </map>
    </property>

    <!--6.set注入-->
    <property name="games">
        <set>
            <value>LOL</value>
            <value>COC</value>
            <value>BOB</value>
        </set>
    </property>

    <!--6.空值注入 eg. String wife = null-->
    <property name="wife">
        <null/>
    </property>

    <!--7.Properties類注入-->     
    <property name="info">
        <props>
            <prop key="學號">123124</prop>
            <prop key="性別">man</prop>
        </props>
    </property>

</bean>

(4)p命名(代替property標籤進行setter注入) 和 c命名(代替constructor-arg標籤進行構造器注入):

導入約束 : xmlns:p="http://www.springframework.org/schema/p"
 
 <!--P(屬性: properties)命名空間 , 屬性依然要設置set方法-->
 <bean id="user" class="com.jyy.pojo.User" p:name="張三" p:age="22"/>
 導入約束 : xmlns:c="http://www.springframework.org/schema/c"

 <!--C(構造: Constructor)命名空間 , 屬性依然要設置set方法,同時需要有參構造器-->
 <bean id="user" class="com.jyy.pojo.User" c:name="張三" c:age="23"/>

(5)autowire標籤實現自動裝配(沒啥大用處,不如註解方便)

假如user類中有cat和dog屬性,可以通過autowire自動幫我們配置

<bean id="dog" class="com.jyy.pojo.Dog"/>
<bean id="cat" class="com.jyy.pojo.Cat"/>

<!--通過類型自動注入-->
<bean id="user" class="com.kuang.pojo.User" autowire="byType">
   <property name="str" value="主人"/>
</bean>

<!--通過名稱自動注入-->
<bean id="user" class="com.kuang.pojo.User" autowire="byName">
   <property name="str" value="主人"/>
</bean>

2. Bean作用域/生命週期,scope屬性

使用標籤:scope

<bean id="user" class="com.jyy.pojo.User" scope="singleton">

3.註解

步驟:aop包 + xml中開啓註解 + 類中使用註解

使用註解需要導入aop的包

在spring配置文件中引入context文件頭,並開啓註解

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd


<context:annotation-config/>

3.1 對類中的引用類型屬性註解(代替<property ref>標籤)

(1)@Autowired(需要aop的包,自動根據類型匹配)

@Autowired(required=false)  說明:false,對象可以爲null;true,對象必須存對象,不能爲null

User類

public class User {
   @Autowired
   private Cat cat;
   @Autowired
   private Dog dog;
   private String str;

   public Cat getCat() {
       return cat;
  }
   public Dog getDog() {
       return dog;
  }
   public String getStr() {
       return str;
  }
}

配置文件

<context:annotation-config/>

<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat" class="com.kuang.pojo.Cat"/>
<bean id="user" class="com.kuang.pojo.User"/>

(2)@Qualifier:不能單獨使用

@Autowired是根據類型自動裝配的,加上@Qualifier則可以根據byName的方式自動裝配

<bean id="dog1" class="com.kuang.pojo.Dog"/>
<bean id="dog2" class="com.kuang.pojo.Dog"/>
<bean id="cat1" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>
@Autowired
@Qualifier(value = "cat2")
private Cat cat;
@Autowired
@Qualifier(value = "dog2")
private Dog dog;

如果不加@Qualifer,系統無法分辨,因爲bean中有兩個Cat類和Dog類

(3)@Resource

@Resource如有指定的name屬性,先按該屬性進行byName方式查找裝配;其次再進行默認的byName方式進行裝配;如果以上都不成功,則按byType的方式自動裝配。

public class User {
   //如果允許對象爲null,設置required = false,默認爲true
   @Resource(name = "cat2")
   private Cat cat;
   @Resource
   private Dog dog;
   private String str;
}
<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat1" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>

<bean id="user" class="com.kuang.pojo.User"/>

總結:@Autowired, @Qualifier, @Resource這三個註解寫在類的屬性上(引用類),注入bean時無需再用<property>標籤

3.2 對類進行註解(代替<bean>標籤)

配置掃描哪些包下的註解

<context:component-scan base-package="com.jyy.pojo"/>

@Component 對類進行配置

@Component("user")
// 相當於配置文件中 <bean id="user" class="當前註解的類"/>
public class User {
   public String name = "張三";
}

@Component等價於以下三種,

@Controller:web層

@Service:service層

@Repository:dao層

3.3 對類中的基本類型註解(代替<property value>標籤)

(1)如果不用set方法,直接在屬性上加註解

@Component("user")
public class User {

   @Value("張三")
   public String name;
}

(2)如果提供了set方法,在set方法上加註解

@Component("user")
public class User {

   public String name;

   @Value("張三")
   public void setName(String name) {
       this.name = name;
  }
}

3.4 聲明週期

直接在類上加@Scope註解

@Controller("user")
@Scope("prototype")
public class User {
   @Value("張三")
   public String name;
}

3.5 < context:annotation-config / > 和 < context:component-scan / >區別

<context:annotation-config>:給類中屬性賦值(@Autowired) ,但仍然需要在xml中配置bean,把類手動加到容器中。

< context:component-scan / >:<context:annotation-config> + 自動把掃描出的類加入容器(@Component)

 

 

Reference:

狂神說公衆號:https://www.bilibili.com/video/BV1WE411d7Dv

概述及IOC理論推導: https://mp.weixin.qq.com/s/VM6INdNB_hNfXCMq3UZgTQ

快速上手Spring: https://mp.weixin.qq.com/s/Sa39ulmHpNFJ9u48rwCG7A

依賴注入(DI): https://mp.weixin.qq.com/s/Nf-cYENenoZpXqDjv574ig

自動裝配: https://mp.weixin.qq.com/s/kvp_3Uva1J2Q5ZVqCUzEsA

使用註解開發: https://mp.weixin.qq.com/s/dCeQwaQ-A97FiUxs7INlHw

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章